Merge branch 'master'
This commit is contained in:
commit
8cedcfd43a
2005 changed files with 134878 additions and 102500 deletions
|
@ -239,9 +239,9 @@ X!Ilib/string.c
|
|||
<title>Network device support</title>
|
||||
<sect1><title>Driver Support</title>
|
||||
!Enet/core/dev.c
|
||||
</sect1>
|
||||
<sect1><title>8390 Based Network Cards</title>
|
||||
!Edrivers/net/8390.c
|
||||
!Enet/ethernet/eth.c
|
||||
!Einclude/linux/etherdevice.h
|
||||
!Enet/core/wireless.c
|
||||
</sect1>
|
||||
<sect1><title>Synchronous PPP</title>
|
||||
!Edrivers/net/wan/syncppp.c
|
||||
|
|
122
Documentation/RCU/torture.txt
Normal file
122
Documentation/RCU/torture.txt
Normal file
|
@ -0,0 +1,122 @@
|
|||
RCU Torture Test Operation
|
||||
|
||||
|
||||
CONFIG_RCU_TORTURE_TEST
|
||||
|
||||
The CONFIG_RCU_TORTURE_TEST config option is available for all RCU
|
||||
implementations. It creates an rcutorture kernel module that can
|
||||
be loaded to run a torture test. The test periodically outputs
|
||||
status messages via printk(), which can be examined via the dmesg
|
||||
command (perhaps grepping for "rcutorture"). The test is started
|
||||
when the module is loaded, and stops when the module is unloaded.
|
||||
|
||||
However, actually setting this config option to "y" results in the system
|
||||
running the test immediately upon boot, and ending only when the system
|
||||
is taken down. Normally, one will instead want to build the system
|
||||
with CONFIG_RCU_TORTURE_TEST=m and to use modprobe and rmmod to control
|
||||
the test, perhaps using a script similar to the one shown at the end of
|
||||
this document. Note that you will need CONFIG_MODULE_UNLOAD in order
|
||||
to be able to end the test.
|
||||
|
||||
|
||||
MODULE PARAMETERS
|
||||
|
||||
This module has the following parameters:
|
||||
|
||||
nreaders This is the number of RCU reading threads supported.
|
||||
The default is twice the number of CPUs. Why twice?
|
||||
To properly exercise RCU implementations with preemptible
|
||||
read-side critical sections.
|
||||
|
||||
stat_interval The number of seconds between output of torture
|
||||
statistics (via printk()). Regardless of the interval,
|
||||
statistics are printed when the module is unloaded.
|
||||
Setting the interval to zero causes the statistics to
|
||||
be printed -only- when the module is unloaded, and this
|
||||
is the default.
|
||||
|
||||
verbose Enable debug printk()s. Default is disabled.
|
||||
|
||||
|
||||
OUTPUT
|
||||
|
||||
The statistics output is as follows:
|
||||
|
||||
rcutorture: --- Start of test: nreaders=16 stat_interval=0 verbose=0
|
||||
rcutorture: rtc: 0000000000000000 ver: 1916 tfle: 0 rta: 1916 rtaf: 0 rtf: 1915
|
||||
rcutorture: Reader Pipe: 1466408 9747 0 0 0 0 0 0 0 0 0
|
||||
rcutorture: Reader Batch: 1464477 11678 0 0 0 0 0 0 0 0
|
||||
rcutorture: Free-Block Circulation: 1915 1915 1915 1915 1915 1915 1915 1915 1915 1915 0
|
||||
rcutorture: --- End of test
|
||||
|
||||
The command "dmesg | grep rcutorture:" will extract this information on
|
||||
most systems. On more esoteric configurations, it may be necessary to
|
||||
use other commands to access the output of the printk()s used by
|
||||
the RCU torture test. The printk()s use KERN_ALERT, so they should
|
||||
be evident. ;-)
|
||||
|
||||
The entries are as follows:
|
||||
|
||||
o "ggp": The number of counter flips (or batches) since boot.
|
||||
|
||||
o "rtc": The hexadecimal address of the structure currently visible
|
||||
to readers.
|
||||
|
||||
o "ver": The number of times since boot that the rcutw writer task
|
||||
has changed the structure visible to readers.
|
||||
|
||||
o "tfle": If non-zero, indicates that the "torture freelist"
|
||||
containing structure to be placed into the "rtc" area is empty.
|
||||
This condition is important, since it can fool you into thinking
|
||||
that RCU is working when it is not. :-/
|
||||
|
||||
o "rta": Number of structures allocated from the torture freelist.
|
||||
|
||||
o "rtaf": Number of allocations from the torture freelist that have
|
||||
failed due to the list being empty.
|
||||
|
||||
o "rtf": Number of frees into the torture freelist.
|
||||
|
||||
o "Reader Pipe": Histogram of "ages" of structures seen by readers.
|
||||
If any entries past the first two are non-zero, RCU is broken.
|
||||
And rcutorture prints the error flag string "!!!" to make sure
|
||||
you notice. The age of a newly allocated structure is zero,
|
||||
it becomes one when removed from reader visibility, and is
|
||||
incremented once per grace period subsequently -- and is freed
|
||||
after passing through (RCU_TORTURE_PIPE_LEN-2) grace periods.
|
||||
|
||||
The output displayed above was taken from a correctly working
|
||||
RCU. If you want to see what it looks like when broken, break
|
||||
it yourself. ;-)
|
||||
|
||||
o "Reader Batch": Another histogram of "ages" of structures seen
|
||||
by readers, but in terms of counter flips (or batches) rather
|
||||
than in terms of grace periods. The legal number of non-zero
|
||||
entries is again two. The reason for this separate view is
|
||||
that it is easier to get the third entry to show up in the
|
||||
"Reader Batch" list than in the "Reader Pipe" list.
|
||||
|
||||
o "Free-Block Circulation": Shows the number of torture structures
|
||||
that have reached a given point in the pipeline. The first element
|
||||
should closely correspond to the number of structures allocated,
|
||||
the second to the number that have been removed from reader view,
|
||||
and all but the last remaining to the corresponding number of
|
||||
passes through a grace period. The last entry should be zero,
|
||||
as it is only incremented if a torture structure's counter
|
||||
somehow gets incremented farther than it should.
|
||||
|
||||
|
||||
USAGE
|
||||
|
||||
The following script may be used to torture RCU:
|
||||
|
||||
#!/bin/sh
|
||||
|
||||
modprobe rcutorture
|
||||
sleep 100
|
||||
rmmod rcutorture
|
||||
dmesg | grep rcutorture:
|
||||
|
||||
The output can be manually inspected for the error flag of "!!!".
|
||||
One could of course create a more elaborate script that automatically
|
||||
checked for such errors.
|
|
@ -81,7 +81,8 @@ Adding New Machines
|
|||
|
||||
Any large scale modifications, or new drivers should be discussed
|
||||
on the ARM kernel mailing list (linux-arm-kernel) before being
|
||||
attempted.
|
||||
attempted. See http://www.arm.linux.org.uk/mailinglists/ for the
|
||||
mailing list information.
|
||||
|
||||
|
||||
NAND
|
||||
|
@ -120,6 +121,43 @@ Clock Management
|
|||
various clock units
|
||||
|
||||
|
||||
Platform Data
|
||||
-------------
|
||||
|
||||
Whenever a device has platform specific data that is specified
|
||||
on a per-machine basis, care should be taken to ensure the
|
||||
following:
|
||||
|
||||
1) that default data is not left in the device to confuse the
|
||||
driver if a machine does not set it at startup
|
||||
|
||||
2) the data should (if possible) be marked as __initdata,
|
||||
to ensure that the data is thrown away if the machine is
|
||||
not the one currently in use.
|
||||
|
||||
The best way of doing this is to make a function that
|
||||
kmalloc()s an area of memory, and copies the __initdata
|
||||
and then sets the relevant device's platform data. Making
|
||||
the function `__init` takes care of ensuring it is discarded
|
||||
with the rest of the initialisation code
|
||||
|
||||
static __init void s3c24xx_xxx_set_platdata(struct xxx_data *pd)
|
||||
{
|
||||
struct s3c2410_xxx_mach_info *npd;
|
||||
|
||||
npd = kmalloc(sizeof(struct s3c2410_xxx_mach_info), GFP_KERNEL);
|
||||
if (npd) {
|
||||
memcpy(npd, pd, sizeof(struct s3c2410_xxx_mach_info));
|
||||
s3c_device_xxx.dev.platform_data = npd;
|
||||
} else {
|
||||
printk(KERN_ERR "no memory for xxx platform data\n");
|
||||
}
|
||||
}
|
||||
|
||||
Note, since the code is marked as __init, it should not be
|
||||
exported outside arch/arm/mach-s3c2410/, or exported to
|
||||
modules via EXPORT_SYMBOL() and related functions.
|
||||
|
||||
Port Contributors
|
||||
-----------------
|
||||
|
||||
|
@ -149,6 +187,7 @@ Document Changes
|
|||
06 Mar 2005 - BJD - Added Christer Weinigel
|
||||
08 Mar 2005 - BJD - Added LCVR to list of people, updated introduction
|
||||
08 Mar 2005 - BJD - Added section on adding machines
|
||||
09 Sep 2005 - BJD - Added section on platform data
|
||||
|
||||
Document Author
|
||||
---------------
|
||||
|
|
|
@ -94,7 +94,7 @@ the available CPU and Memory resources amongst the requesting tasks.
|
|||
But larger systems, which benefit more from careful processor and
|
||||
memory placement to reduce memory access times and contention,
|
||||
and which typically represent a larger investment for the customer,
|
||||
can benefit from explictly placing jobs on properly sized subsets of
|
||||
can benefit from explicitly placing jobs on properly sized subsets of
|
||||
the system.
|
||||
|
||||
This can be especially valuable on:
|
||||
|
|
|
@ -50,9 +50,14 @@ userspace utilities, etc.
|
|||
Features
|
||||
========
|
||||
|
||||
- This is a complete rewrite of the NTFS driver that used to be in the kernel.
|
||||
This new driver implements NTFS read support and is functionally equivalent
|
||||
to the old ntfs driver.
|
||||
- This is a complete rewrite of the NTFS driver that used to be in the 2.4 and
|
||||
earlier kernels. This new driver implements NTFS read support and is
|
||||
functionally equivalent to the old ntfs driver and it also implements limited
|
||||
write support. The biggest limitation at present is that files/directories
|
||||
cannot be created or deleted. See below for the list of write features that
|
||||
are so far supported. Another limitation is that writing to compressed files
|
||||
is not implemented at all. Also, neither read nor write access to encrypted
|
||||
files is so far implemented.
|
||||
- The new driver has full support for sparse files on NTFS 3.x volumes which
|
||||
the old driver isn't happy with.
|
||||
- The new driver supports execution of binaries due to mmap() now being
|
||||
|
@ -78,7 +83,20 @@ Features
|
|||
- The new driver supports fsync(2), fdatasync(2), and msync(2).
|
||||
- The new driver supports readv(2) and writev(2).
|
||||
- The new driver supports access time updates (including mtime and ctime).
|
||||
|
||||
- The new driver supports truncate(2) and open(2) with O_TRUNC. But at present
|
||||
only very limited support for highly fragmented files, i.e. ones which have
|
||||
their data attribute split across multiple extents, is included. Another
|
||||
limitation is that at present truncate(2) will never create sparse files,
|
||||
since to mark a file sparse we need to modify the directory entry for the
|
||||
file and we do not implement directory modifications yet.
|
||||
- The new driver supports write(2) which can both overwrite existing data and
|
||||
extend the file size so that you can write beyond the existing data. Also,
|
||||
writing into sparse regions is supported and the holes are filled in with
|
||||
clusters. But at present only limited support for highly fragmented files,
|
||||
i.e. ones which have their data attribute split across multiple extents, is
|
||||
included. Another limitation is that write(2) will never create sparse
|
||||
files, since to mark a file sparse we need to modify the directory entry for
|
||||
the file and we do not implement directory modifications yet.
|
||||
|
||||
Supported mount options
|
||||
=======================
|
||||
|
@ -439,6 +457,22 @@ ChangeLog
|
|||
|
||||
Note, a technical ChangeLog aimed at kernel hackers is in fs/ntfs/ChangeLog.
|
||||
|
||||
2.1.25:
|
||||
- Write support is now extended with write(2) being able to both
|
||||
overwrite existing file data and to extend files. Also, if a write
|
||||
to a sparse region occurs, write(2) will fill in the hole. Note,
|
||||
mmap(2) based writes still do not support writing into holes or
|
||||
writing beyond the initialized size.
|
||||
- Write support has a new feature and that is that truncate(2) and
|
||||
open(2) with O_TRUNC are now implemented thus files can be both made
|
||||
smaller and larger.
|
||||
- Note: Both write(2) and truncate(2)/open(2) with O_TRUNC still have
|
||||
limitations in that they
|
||||
- only provide limited support for highly fragmented files.
|
||||
- only work on regular, i.e. uncompressed and unencrypted files.
|
||||
- never create sparse files although this will change once directory
|
||||
operations are implemented.
|
||||
- Lots of bug fixes and enhancements across the board.
|
||||
2.1.24:
|
||||
- Support journals ($LogFile) which have been modified by chkdsk. This
|
||||
means users can boot into Windows after we marked the volume dirty.
|
||||
|
|
|
@ -19,15 +19,43 @@ Mount Options
|
|||
|
||||
When mounting an XFS filesystem, the following options are accepted.
|
||||
|
||||
biosize=size
|
||||
Sets the preferred buffered I/O size (default size is 64K).
|
||||
"size" must be expressed as the logarithm (base2) of the
|
||||
desired I/O size.
|
||||
Valid values for this option are 14 through 16, inclusive
|
||||
(i.e. 16K, 32K, and 64K bytes). On machines with a 4K
|
||||
pagesize, 13 (8K bytes) is also a valid size.
|
||||
The preferred buffered I/O size can also be altered on an
|
||||
individual file basis using the ioctl(2) system call.
|
||||
allocsize=size
|
||||
Sets the buffered I/O end-of-file preallocation size when
|
||||
doing delayed allocation writeout (default size is 64KiB).
|
||||
Valid values for this option are page size (typically 4KiB)
|
||||
through to 1GiB, inclusive, in power-of-2 increments.
|
||||
|
||||
attr2/noattr2
|
||||
The options enable/disable (default is disabled for backward
|
||||
compatibility on-disk) an "opportunistic" improvement to be
|
||||
made in the way inline extended attributes are stored on-disk.
|
||||
When the new form is used for the first time (by setting or
|
||||
removing extended attributes) the on-disk superblock feature
|
||||
bit field will be updated to reflect this format being in use.
|
||||
|
||||
barrier
|
||||
Enables the use of block layer write barriers for writes into
|
||||
the journal and unwritten extent conversion. This allows for
|
||||
drive level write caching to be enabled, for devices that
|
||||
support write barriers.
|
||||
|
||||
dmapi
|
||||
Enable the DMAPI (Data Management API) event callouts.
|
||||
Use with the "mtpt" option.
|
||||
|
||||
grpid/bsdgroups and nogrpid/sysvgroups
|
||||
These options define what group ID a newly created file gets.
|
||||
When grpid is set, it takes the group ID of the directory in
|
||||
which it is created; otherwise (the default) it takes the fsgid
|
||||
of the current process, unless the directory has the setgid bit
|
||||
set, in which case it takes the gid from the parent directory,
|
||||
and also gets the setgid bit set if it is a directory itself.
|
||||
|
||||
ihashsize=value
|
||||
Sets the number of hash buckets available for hashing the
|
||||
in-memory inodes of the specified mount point. If a value
|
||||
of zero is used, the value selected by the default algorithm
|
||||
will be displayed in /proc/mounts.
|
||||
|
||||
ikeep/noikeep
|
||||
When inode clusters are emptied of inodes, keep them around
|
||||
|
@ -35,12 +63,31 @@ When mounting an XFS filesystem, the following options are accepted.
|
|||
and is still the default for now. Using the noikeep option,
|
||||
inode clusters are returned to the free space pool.
|
||||
|
||||
inode64
|
||||
Indicates that XFS is allowed to create inodes at any location
|
||||
in the filesystem, including those which will result in inode
|
||||
numbers occupying more than 32 bits of significance. This is
|
||||
provided for backwards compatibility, but causes problems for
|
||||
backup applications that cannot handle large inode numbers.
|
||||
|
||||
largeio/nolargeio
|
||||
If "nolargeio" is specified, the optimal I/O reported in
|
||||
st_blksize by stat(2) will be as small as possible to allow user
|
||||
applications to avoid inefficient read/modify/write I/O.
|
||||
If "largeio" specified, a filesystem that has a "swidth" specified
|
||||
will return the "swidth" value (in bytes) in st_blksize. If the
|
||||
filesystem does not have a "swidth" specified but does specify
|
||||
an "allocsize" then "allocsize" (in bytes) will be returned
|
||||
instead.
|
||||
If neither of these two options are specified, then filesystem
|
||||
will behave as if "nolargeio" was specified.
|
||||
|
||||
logbufs=value
|
||||
Set the number of in-memory log buffers. Valid numbers range
|
||||
from 2-8 inclusive.
|
||||
The default value is 8 buffers for filesystems with a
|
||||
blocksize of 64K, 4 buffers for filesystems with a blocksize
|
||||
of 32K, 3 buffers for filesystems with a blocksize of 16K
|
||||
blocksize of 64KiB, 4 buffers for filesystems with a blocksize
|
||||
of 32KiB, 3 buffers for filesystems with a blocksize of 16KiB
|
||||
and 2 buffers for all other configurations. Increasing the
|
||||
number of buffers may increase performance on some workloads
|
||||
at the cost of the memory used for the additional log buffers
|
||||
|
@ -49,10 +96,10 @@ When mounting an XFS filesystem, the following options are accepted.
|
|||
logbsize=value
|
||||
Set the size of each in-memory log buffer.
|
||||
Size may be specified in bytes, or in kilobytes with a "k" suffix.
|
||||
Valid sizes for version 1 and version 2 logs are 16384 (16k) and
|
||||
32768 (32k). Valid sizes for version 2 logs also include
|
||||
Valid sizes for version 1 and version 2 logs are 16384 (16k) and
|
||||
32768 (32k). Valid sizes for version 2 logs also include
|
||||
65536 (64k), 131072 (128k) and 262144 (256k).
|
||||
The default value for machines with more than 32MB of memory
|
||||
The default value for machines with more than 32MiB of memory
|
||||
is 32768, machines with less memory use 16384 by default.
|
||||
|
||||
logdev=device and rtdev=device
|
||||
|
@ -62,6 +109,11 @@ When mounting an XFS filesystem, the following options are accepted.
|
|||
optional, and the log section can be separate from the data
|
||||
section or contained within it.
|
||||
|
||||
mtpt=mountpoint
|
||||
Use with the "dmapi" option. The value specified here will be
|
||||
included in the DMAPI mount event, and should be the path of
|
||||
the actual mountpoint that is used.
|
||||
|
||||
noalign
|
||||
Data allocations will not be aligned at stripe unit boundaries.
|
||||
|
||||
|
@ -91,13 +143,17 @@ When mounting an XFS filesystem, the following options are accepted.
|
|||
O_SYNC writes can be lost if the system crashes.
|
||||
If timestamp updates are critical, use the osyncisosync option.
|
||||
|
||||
quota/usrquota/uqnoenforce
|
||||
uquota/usrquota/uqnoenforce/quota
|
||||
User disk quota accounting enabled, and limits (optionally)
|
||||
enforced.
|
||||
enforced. Refer to xfs_quota(8) for further details.
|
||||
|
||||
grpquota/gqnoenforce
|
||||
gquota/grpquota/gqnoenforce
|
||||
Group disk quota accounting enabled and limits (optionally)
|
||||
enforced.
|
||||
enforced. Refer to xfs_quota(8) for further details.
|
||||
|
||||
pquota/prjquota/pqnoenforce
|
||||
Project disk quota accounting enabled and limits (optionally)
|
||||
enforced. Refer to xfs_quota(8) for further details.
|
||||
|
||||
sunit=value and swidth=value
|
||||
Used to specify the stripe unit and width for a RAID device or
|
||||
|
@ -113,15 +169,21 @@ When mounting an XFS filesystem, the following options are accepted.
|
|||
The "swidth" option is required if the "sunit" option has been
|
||||
specified, and must be a multiple of the "sunit" value.
|
||||
|
||||
swalloc
|
||||
Data allocations will be rounded up to stripe width boundaries
|
||||
when the current end of file is being extended and the file
|
||||
size is larger than the stripe width size.
|
||||
|
||||
|
||||
sysctls
|
||||
=======
|
||||
|
||||
The following sysctls are available for the XFS filesystem:
|
||||
|
||||
fs.xfs.stats_clear (Min: 0 Default: 0 Max: 1)
|
||||
Setting this to "1" clears accumulated XFS statistics
|
||||
Setting this to "1" clears accumulated XFS statistics
|
||||
in /proc/fs/xfs/stat. It then immediately resets to "0".
|
||||
|
||||
|
||||
fs.xfs.xfssyncd_centisecs (Min: 100 Default: 3000 Max: 720000)
|
||||
The interval at which the xfssyncd thread flushes metadata
|
||||
out to disk. This thread will flush log activity out, and
|
||||
|
@ -143,9 +205,9 @@ The following sysctls are available for the XFS filesystem:
|
|||
XFS_ERRLEVEL_HIGH: 5
|
||||
|
||||
fs.xfs.panic_mask (Min: 0 Default: 0 Max: 127)
|
||||
Causes certain error conditions to call BUG(). Value is a bitmask;
|
||||
Causes certain error conditions to call BUG(). Value is a bitmask;
|
||||
AND together the tags which represent errors which should cause panics:
|
||||
|
||||
|
||||
XFS_NO_PTAG 0
|
||||
XFS_PTAG_IFLUSH 0x00000001
|
||||
XFS_PTAG_LOGRES 0x00000002
|
||||
|
@ -155,7 +217,7 @@ The following sysctls are available for the XFS filesystem:
|
|||
XFS_PTAG_SHUTDOWN_IOERROR 0x00000020
|
||||
XFS_PTAG_SHUTDOWN_LOGERROR 0x00000040
|
||||
|
||||
This option is intended for debugging only.
|
||||
This option is intended for debugging only.
|
||||
|
||||
fs.xfs.irix_symlink_mode (Min: 0 Default: 0 Max: 1)
|
||||
Controls whether symlinks are created with mode 0777 (default)
|
||||
|
@ -164,25 +226,37 @@ The following sysctls are available for the XFS filesystem:
|
|||
fs.xfs.irix_sgid_inherit (Min: 0 Default: 0 Max: 1)
|
||||
Controls files created in SGID directories.
|
||||
If the group ID of the new file does not match the effective group
|
||||
ID or one of the supplementary group IDs of the parent dir, the
|
||||
ISGID bit is cleared if the irix_sgid_inherit compatibility sysctl
|
||||
ID or one of the supplementary group IDs of the parent dir, the
|
||||
ISGID bit is cleared if the irix_sgid_inherit compatibility sysctl
|
||||
is set.
|
||||
|
||||
fs.xfs.restrict_chown (Min: 0 Default: 1 Max: 1)
|
||||
Controls whether unprivileged users can use chown to "give away"
|
||||
a file to another user.
|
||||
|
||||
fs.xfs.inherit_sync (Min: 0 Default: 1 Max 1)
|
||||
Setting this to "1" will cause the "sync" flag set
|
||||
by the chattr(1) command on a directory to be
|
||||
fs.xfs.inherit_sync (Min: 0 Default: 1 Max: 1)
|
||||
Setting this to "1" will cause the "sync" flag set
|
||||
by the xfs_io(8) chattr command on a directory to be
|
||||
inherited by files in that directory.
|
||||
|
||||
fs.xfs.inherit_nodump (Min: 0 Default: 1 Max 1)
|
||||
Setting this to "1" will cause the "nodump" flag set
|
||||
by the chattr(1) command on a directory to be
|
||||
fs.xfs.inherit_nodump (Min: 0 Default: 1 Max: 1)
|
||||
Setting this to "1" will cause the "nodump" flag set
|
||||
by the xfs_io(8) chattr command on a directory to be
|
||||
inherited by files in that directory.
|
||||
|
||||
fs.xfs.inherit_noatime (Min: 0 Default: 1 Max 1)
|
||||
Setting this to "1" will cause the "noatime" flag set
|
||||
by the chattr(1) command on a directory to be
|
||||
fs.xfs.inherit_noatime (Min: 0 Default: 1 Max: 1)
|
||||
Setting this to "1" will cause the "noatime" flag set
|
||||
by the xfs_io(8) chattr command on a directory to be
|
||||
inherited by files in that directory.
|
||||
|
||||
fs.xfs.inherit_nosymlinks (Min: 0 Default: 1 Max: 1)
|
||||
Setting this to "1" will cause the "nosymlinks" flag set
|
||||
by the xfs_io(8) chattr command on a directory to be
|
||||
inherited by files in that directory.
|
||||
|
||||
fs.xfs.rotorstep (Min: 1 Default: 1 Max: 256)
|
||||
In "inode32" allocation mode, this option determines how many
|
||||
files the allocator attempts to allocate in the same allocation
|
||||
group before moving to the next allocation group. The intent
|
||||
is to control the rate at which the allocator moves between
|
||||
allocation groups when allocating extents for new files.
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include "linux/firmware.h"
|
||||
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/timer.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/firmware.h>
|
||||
|
||||
|
||||
|
|
|
@ -273,6 +273,7 @@ For now, you can ignore the `flags' parameter. It is there for future use.
|
|||
if (is_isa) {
|
||||
|
||||
/* Discard immediately if this ISA range is already used */
|
||||
/* FIXME: never use check_region(), only request_region() */
|
||||
if (check_region(address,FOO_EXTENT))
|
||||
goto ERROR0;
|
||||
|
||||
|
|
|
@ -196,7 +196,7 @@ KEY ACCESS PERMISSIONS
|
|||
|
||||
Keys have an owner user ID, a group access ID, and a permissions mask. The mask
|
||||
has up to eight bits each for possessor, user, group and other access. Only
|
||||
five of each set of eight bits are defined. These permissions granted are:
|
||||
six of each set of eight bits are defined. These permissions granted are:
|
||||
|
||||
(*) View
|
||||
|
||||
|
@ -224,6 +224,10 @@ five of each set of eight bits are defined. These permissions granted are:
|
|||
keyring to a key, a process must have Write permission on the keyring and
|
||||
Link permission on the key.
|
||||
|
||||
(*) Set Attribute
|
||||
|
||||
This permits a key's UID, GID and permissions mask to be changed.
|
||||
|
||||
For changing the ownership, group ID or permissions mask, being the owner of
|
||||
the key or having the sysadmin capability is sufficient.
|
||||
|
||||
|
@ -242,15 +246,15 @@ about the status of the key service:
|
|||
this way:
|
||||
|
||||
SERIAL FLAGS USAGE EXPY PERM UID GID TYPE DESCRIPTION: SUMMARY
|
||||
00000001 I----- 39 perm 1f1f0000 0 0 keyring _uid_ses.0: 1/4
|
||||
00000002 I----- 2 perm 1f1f0000 0 0 keyring _uid.0: empty
|
||||
00000007 I----- 1 perm 1f1f0000 0 0 keyring _pid.1: empty
|
||||
0000018d I----- 1 perm 1f1f0000 0 0 keyring _pid.412: empty
|
||||
000004d2 I--Q-- 1 perm 1f1f0000 32 -1 keyring _uid.32: 1/4
|
||||
000004d3 I--Q-- 3 perm 1f1f0000 32 -1 keyring _uid_ses.32: empty
|
||||
00000001 I----- 39 perm 1f3f0000 0 0 keyring _uid_ses.0: 1/4
|
||||
00000002 I----- 2 perm 1f3f0000 0 0 keyring _uid.0: empty
|
||||
00000007 I----- 1 perm 1f3f0000 0 0 keyring _pid.1: empty
|
||||
0000018d I----- 1 perm 1f3f0000 0 0 keyring _pid.412: empty
|
||||
000004d2 I--Q-- 1 perm 1f3f0000 32 -1 keyring _uid.32: 1/4
|
||||
000004d3 I--Q-- 3 perm 1f3f0000 32 -1 keyring _uid_ses.32: empty
|
||||
00000892 I--QU- 1 perm 1f000000 0 0 user metal:copper: 0
|
||||
00000893 I--Q-N 1 35s 1f1f0000 0 0 user metal:silver: 0
|
||||
00000894 I--Q-- 1 10h 001f0000 0 0 user metal:gold: 0
|
||||
00000893 I--Q-N 1 35s 1f3f0000 0 0 user metal:silver: 0
|
||||
00000894 I--Q-- 1 10h 003f0000 0 0 user metal:gold: 0
|
||||
|
||||
The flags are:
|
||||
|
||||
|
|
|
@ -1,48 +1,153 @@
|
|||
S2IO Technologies XFrame 10 Gig adapter.
|
||||
-------------------------------------------
|
||||
Release notes for Neterion's (Formerly S2io) Xframe I/II PCI-X 10GbE driver.
|
||||
|
||||
I. Module loadable parameters.
|
||||
When loaded as a module, the driver provides a host of Module loadable
|
||||
parameters, so the device can be tuned as per the users needs.
|
||||
A list of the Module params is given below.
|
||||
(i) ring_num: This can be used to program the number of
|
||||
receive rings used in the driver.
|
||||
(ii) ring_len: This defines the number of descriptors each ring
|
||||
can have. There can be a maximum of 8 rings.
|
||||
(iii) frame_len: This is an array of size 8. Using this we can
|
||||
set the maximum size of the received frame that can
|
||||
be steered into the corrsponding receive ring.
|
||||
(iv) fifo_num: This defines the number of Tx FIFOs thats used in
|
||||
the driver.
|
||||
(v) fifo_len: Each element defines the number of
|
||||
Tx descriptors that can be associated with each
|
||||
corresponding FIFO. There are a maximum of 8 FIFOs.
|
||||
(vi) tx_prio: This is a bool, if module is loaded with a non-zero
|
||||
value for tx_prio multi FIFO scheme is activated.
|
||||
(vii) rx_prio: This is a bool, if module is loaded with a non-zero
|
||||
value for tx_prio multi RING scheme is activated.
|
||||
(viii) latency_timer: The value given against this param will be
|
||||
loaded into the latency timer register in PCI Config
|
||||
space, else the register is left with its reset value.
|
||||
Contents
|
||||
=======
|
||||
- 1. Introduction
|
||||
- 2. Identifying the adapter/interface
|
||||
- 3. Features supported
|
||||
- 4. Command line parameters
|
||||
- 5. Performance suggestions
|
||||
- 6. Available Downloads
|
||||
|
||||
II. Performance tuning.
|
||||
By changing a few sysctl parameters.
|
||||
Copy the following lines into a file and run the following command,
|
||||
"sysctl -p <file_name>"
|
||||
### IPV4 specific settings
|
||||
net.ipv4.tcp_timestamps = 0 # turns TCP timestamp support off, default 1, reduces CPU use
|
||||
net.ipv4.tcp_sack = 0 # turn SACK support off, default on
|
||||
# on systems with a VERY fast bus -> memory interface this is the big gainer
|
||||
net.ipv4.tcp_rmem = 10000000 10000000 10000000 # sets min/default/max TCP read buffer, default 4096 87380 174760
|
||||
net.ipv4.tcp_wmem = 10000000 10000000 10000000 # sets min/pressure/max TCP write buffer, default 4096 16384 131072
|
||||
net.ipv4.tcp_mem = 10000000 10000000 10000000 # sets min/pressure/max TCP buffer space, default 31744 32256 32768
|
||||
|
||||
### CORE settings (mostly for socket and UDP effect)
|
||||
net.core.rmem_max = 524287 # maximum receive socket buffer size, default 131071
|
||||
net.core.wmem_max = 524287 # maximum send socket buffer size, default 131071
|
||||
net.core.rmem_default = 524287 # default receive socket buffer size, default 65535
|
||||
net.core.wmem_default = 524287 # default send socket buffer size, default 65535
|
||||
net.core.optmem_max = 524287 # maximum amount of option memory buffers, default 10240
|
||||
net.core.netdev_max_backlog = 300000 # number of unprocessed input packets before kernel starts dropping them, default 300
|
||||
---End of performance tuning file---
|
||||
|
||||
1. Introduction:
|
||||
This Linux driver supports Neterion's Xframe I PCI-X 1.0 and
|
||||
Xframe II PCI-X 2.0 adapters. It supports several features
|
||||
such as jumbo frames, MSI/MSI-X, checksum offloads, TSO, UFO and so on.
|
||||
See below for complete list of features.
|
||||
All features are supported for both IPv4 and IPv6.
|
||||
|
||||
2. Identifying the adapter/interface:
|
||||
a. Insert the adapter(s) in your system.
|
||||
b. Build and load driver
|
||||
# insmod s2io.ko
|
||||
c. View log messages
|
||||
# dmesg | tail -40
|
||||
You will see messages similar to:
|
||||
eth3: Neterion Xframe I 10GbE adapter (rev 3), Version 2.0.9.1, Intr type INTA
|
||||
eth4: Neterion Xframe II 10GbE adapter (rev 2), Version 2.0.9.1, Intr type INTA
|
||||
eth4: Device is on 64 bit 133MHz PCIX(M1) bus
|
||||
|
||||
The above messages identify the adapter type(Xframe I/II), adapter revision,
|
||||
driver version, interface name(eth3, eth4), Interrupt type(INTA, MSI, MSI-X).
|
||||
In case of Xframe II, the PCI/PCI-X bus width and frequency are displayed
|
||||
as well.
|
||||
|
||||
To associate an interface with a physical adapter use "ethtool -p <ethX>".
|
||||
The corresponding adapter's LED will blink multiple times.
|
||||
|
||||
3. Features supported:
|
||||
a. Jumbo frames. Xframe I/II supports MTU upto 9600 bytes,
|
||||
modifiable using ifconfig command.
|
||||
|
||||
b. Offloads. Supports checksum offload(TCP/UDP/IP) on transmit
|
||||
and receive, TSO.
|
||||
|
||||
c. Multi-buffer receive mode. Scattering of packet across multiple
|
||||
buffers. Currently driver supports 2-buffer mode which yields
|
||||
significant performance improvement on certain platforms(SGI Altix,
|
||||
IBM xSeries).
|
||||
|
||||
d. MSI/MSI-X. Can be enabled on platforms which support this feature
|
||||
(IA64, Xeon) resulting in noticeable performance improvement(upto 7%
|
||||
on certain platforms).
|
||||
|
||||
e. NAPI. Compile-time option(CONFIG_S2IO_NAPI) for better Rx interrupt
|
||||
moderation.
|
||||
|
||||
f. Statistics. Comprehensive MAC-level and software statistics displayed
|
||||
using "ethtool -S" option.
|
||||
|
||||
g. Multi-FIFO/Ring. Supports up to 8 transmit queues and receive rings,
|
||||
with multiple steering options.
|
||||
|
||||
4. Command line parameters
|
||||
a. tx_fifo_num
|
||||
Number of transmit queues
|
||||
Valid range: 1-8
|
||||
Default: 1
|
||||
|
||||
b. rx_ring_num
|
||||
Number of receive rings
|
||||
Valid range: 1-8
|
||||
Default: 1
|
||||
|
||||
c. tx_fifo_len
|
||||
Size of each transmit queue
|
||||
Valid range: Total length of all queues should not exceed 8192
|
||||
Default: 4096
|
||||
|
||||
d. rx_ring_sz
|
||||
Size of each receive ring(in 4K blocks)
|
||||
Valid range: Limited by memory on system
|
||||
Default: 30
|
||||
|
||||
e. intr_type
|
||||
Specifies interrupt type. Possible values 1(INTA), 2(MSI), 3(MSI-X)
|
||||
Valid range: 1-3
|
||||
Default: 1
|
||||
|
||||
5. Performance suggestions
|
||||
General:
|
||||
a. Set MTU to maximum(9000 for switch setup, 9600 in back-to-back configuration)
|
||||
b. Set TCP windows size to optimal value.
|
||||
For instance, for MTU=1500 a value of 210K has been observed to result in
|
||||
good performance.
|
||||
# sysctl -w net.ipv4.tcp_rmem="210000 210000 210000"
|
||||
# sysctl -w net.ipv4.tcp_wmem="210000 210000 210000"
|
||||
For MTU=9000, TCP window size of 10 MB is recommended.
|
||||
# sysctl -w net.ipv4.tcp_rmem="10000000 10000000 10000000"
|
||||
# sysctl -w net.ipv4.tcp_wmem="10000000 10000000 10000000"
|
||||
|
||||
Transmit performance:
|
||||
a. By default, the driver respects BIOS settings for PCI bus parameters.
|
||||
However, you may want to experiment with PCI bus parameters
|
||||
max-split-transactions(MOST) and MMRBC (use setpci command).
|
||||
A MOST value of 2 has been found optimal for Opterons and 3 for Itanium.
|
||||
It could be different for your hardware.
|
||||
Set MMRBC to 4K**.
|
||||
|
||||
For example you can set
|
||||
For opteron
|
||||
#setpci -d 17d5:* 62=1d
|
||||
For Itanium
|
||||
#setpci -d 17d5:* 62=3d
|
||||
|
||||
For detailed description of the PCI registers, please see Xframe User Guide.
|
||||
|
||||
b. Ensure Transmit Checksum offload is enabled. Use ethtool to set/verify this
|
||||
parameter.
|
||||
c. Turn on TSO(using "ethtool -K")
|
||||
# ethtool -K <ethX> tso on
|
||||
|
||||
Receive performance:
|
||||
a. By default, the driver respects BIOS settings for PCI bus parameters.
|
||||
However, you may want to set PCI latency timer to 248.
|
||||
#setpci -d 17d5:* LATENCY_TIMER=f8
|
||||
For detailed description of the PCI registers, please see Xframe User Guide.
|
||||
b. Use 2-buffer mode. This results in large performance boost on
|
||||
on certain platforms(eg. SGI Altix, IBM xSeries).
|
||||
c. Ensure Receive Checksum offload is enabled. Use "ethtool -K ethX" command to
|
||||
set/verify this option.
|
||||
d. Enable NAPI feature(in kernel configuration Device Drivers ---> Network
|
||||
device support ---> Ethernet (10000 Mbit) ---> S2IO 10Gbe Xframe NIC) to
|
||||
bring down CPU utilization.
|
||||
|
||||
** For AMD opteron platforms with 8131 chipset, MMRBC=1 and MOST=1 are
|
||||
recommended as safe parameters.
|
||||
For more information, please review the AMD8131 errata at
|
||||
http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/26310.pdf
|
||||
|
||||
6. Available Downloads
|
||||
Neterion "s2io" driver in Red Hat and Suse 2.6-based distributions is kept up
|
||||
to date, also the latest "s2io" code (including support for 2.4 kernels) is
|
||||
available via "Support" link on the Neterion site: http://www.neterion.com.
|
||||
|
||||
For Xframe User Guide (Programming manual), visit ftp site ns1.s2io.com,
|
||||
user: linuxdocs password: HALdocs
|
||||
|
||||
7. Support
|
||||
For further support please contact either your 10GbE Xframe NIC vendor (IBM,
|
||||
HP, SGI etc.) or click on the "Support" link on the Neterion site:
|
||||
http://www.neterion.com.
|
||||
|
||||
|
|
45
Documentation/scsi/LICENSE.qla2xxx
Normal file
45
Documentation/scsi/LICENSE.qla2xxx
Normal file
|
@ -0,0 +1,45 @@
|
|||
Copyright (c) 2003-2005 QLogic Corporation
|
||||
QLogic Linux Fibre Channel HBA Driver
|
||||
|
||||
This program includes a device driver for Linux 2.6 that may be
|
||||
distributed with QLogic hardware specific firmware binary file.
|
||||
You may modify and redistribute the device driver code under the
|
||||
GNU General Public License as published by the Free Software
|
||||
Foundation (version 2 or a later version).
|
||||
|
||||
You may redistribute the hardware specific firmware binary file
|
||||
under the following terms:
|
||||
|
||||
1. Redistribution of source code (only if applicable),
|
||||
must retain the above copyright notice, this list of
|
||||
conditions and the following disclaimer.
|
||||
|
||||
2. Redistribution in binary form must reproduce the above
|
||||
copyright notice, this list of conditions and the
|
||||
following disclaimer in the documentation and/or other
|
||||
materials provided with the distribution.
|
||||
|
||||
3. The name of QLogic Corporation may not be used to
|
||||
endorse or promote products derived from this software
|
||||
without specific prior written permission
|
||||
|
||||
REGARDLESS OF WHAT LICENSING MECHANISM IS USED OR APPLICABLE,
|
||||
THIS PROGRAM IS PROVIDED BY QLOGIC CORPORATION "AS IS'' AND ANY
|
||||
EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A
|
||||
PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR
|
||||
BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
|
||||
EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED
|
||||
TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
|
||||
DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
|
||||
ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
|
||||
OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
POSSIBILITY OF SUCH DAMAGE.
|
||||
|
||||
USER ACKNOWLEDGES AND AGREES THAT USE OF THIS PROGRAM WILL NOT
|
||||
CREATE OR GIVE GROUNDS FOR A LICENSE BY IMPLICATION, ESTOPPEL, OR
|
||||
OTHERWISE IN ANY INTELLECTUAL PROPERTY RIGHTS (PATENT, COPYRIGHT,
|
||||
TRADE SECRET, MASK WORK, OR OTHER PROPRIETARY RIGHT) EMBODIED IN
|
||||
ANY OTHER QLOGIC HARDWARE OR SOFTWARE EITHER SOLELY OR IN
|
||||
COMBINATION WITH THIS PROGRAM.
|
|
@ -116,12 +116,15 @@ hardware.
|
|||
line becoming inactive or the tty layer indicating we want
|
||||
to stop transmission due to an XOFF character.
|
||||
|
||||
The driver should stop transmitting characters as soon as
|
||||
possible.
|
||||
|
||||
Locking: port->lock taken.
|
||||
Interrupts: locally disabled.
|
||||
This call must not sleep
|
||||
|
||||
start_tx(port)
|
||||
start transmitting characters.
|
||||
Start transmitting characters.
|
||||
|
||||
Locking: port->lock taken.
|
||||
Interrupts: locally disabled.
|
||||
|
@ -281,26 +284,31 @@ hardware.
|
|||
Other functions
|
||||
---------------
|
||||
|
||||
uart_update_timeout(port,cflag,quot)
|
||||
uart_update_timeout(port,cflag,baud)
|
||||
Update the FIFO drain timeout, port->timeout, according to the
|
||||
number of bits, parity, stop bits and quotient.
|
||||
number of bits, parity, stop bits and baud rate.
|
||||
|
||||
Locking: caller is expected to take port->lock
|
||||
Interrupts: n/a
|
||||
|
||||
uart_get_baud_rate(port,termios)
|
||||
uart_get_baud_rate(port,termios,old,min,max)
|
||||
Return the numeric baud rate for the specified termios, taking
|
||||
account of the special 38400 baud "kludge". The B0 baud rate
|
||||
is mapped to 9600 baud.
|
||||
|
||||
If the baud rate is not within min..max, then if old is non-NULL,
|
||||
the original baud rate will be tried. If that exceeds the
|
||||
min..max constraint, 9600 baud will be returned. termios will
|
||||
be updated to the baud rate in use.
|
||||
|
||||
Note: min..max must always allow 9600 baud to be selected.
|
||||
|
||||
Locking: caller dependent.
|
||||
Interrupts: n/a
|
||||
|
||||
uart_get_divisor(port,termios,oldtermios)
|
||||
Return the divsor (baud_base / baud) for the selected baud rate
|
||||
specified by termios. If the baud rate is out of range, try
|
||||
the original baud rate specified by oldtermios (if non-NULL).
|
||||
If that fails, try 9600 baud.
|
||||
uart_get_divisor(port,baud)
|
||||
Return the divsor (baud_base / baud) for the specified baud
|
||||
rate, appropriately rounded.
|
||||
|
||||
If 38400 baud and custom divisor is selected, return the
|
||||
custom divisor instead.
|
||||
|
@ -308,6 +316,46 @@ uart_get_divisor(port,termios,oldtermios)
|
|||
Locking: caller dependent.
|
||||
Interrupts: n/a
|
||||
|
||||
uart_match_port(port1,port2)
|
||||
This utility function can be used to determine whether two
|
||||
uart_port structures describe the same port.
|
||||
|
||||
Locking: n/a
|
||||
Interrupts: n/a
|
||||
|
||||
uart_write_wakeup(port)
|
||||
A driver is expected to call this function when the number of
|
||||
characters in the transmit buffer have dropped below a threshold.
|
||||
|
||||
Locking: port->lock should be held.
|
||||
Interrupts: n/a
|
||||
|
||||
uart_register_driver(drv)
|
||||
Register a uart driver with the core driver. We in turn register
|
||||
with the tty layer, and initialise the core driver per-port state.
|
||||
|
||||
drv->port should be NULL, and the per-port structures should be
|
||||
registered using uart_add_one_port after this call has succeeded.
|
||||
|
||||
Locking: none
|
||||
Interrupts: enabled
|
||||
|
||||
uart_unregister_driver()
|
||||
Remove all references to a driver from the core driver. The low
|
||||
level driver must have removed all its ports via the
|
||||
uart_remove_one_port() if it registered them with uart_add_one_port().
|
||||
|
||||
Locking: none
|
||||
Interrupts: enabled
|
||||
|
||||
uart_suspend_port()
|
||||
|
||||
uart_resume_port()
|
||||
|
||||
uart_add_one_port()
|
||||
|
||||
uart_remove_one_port()
|
||||
|
||||
Other notes
|
||||
-----------
|
||||
|
||||
|
|
14
MAINTAINERS
14
MAINTAINERS
|
@ -910,6 +910,15 @@ L: linux-fbdev-devel@lists.sourceforge.net
|
|||
W: http://linux-fbdev.sourceforge.net/
|
||||
S: Maintained
|
||||
|
||||
FREESCALE SOC FS_ENET DRIVER
|
||||
P: Pantelis Antoniou
|
||||
M: pantelis.antoniou@gmail.com
|
||||
P: Vitaly Bordug
|
||||
M: vbordug@ru.mvista.com
|
||||
L: linuxppc-embedded@ozlabs.org
|
||||
L: netdev@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
FILE LOCKING (flock() and fcntl()/lockf())
|
||||
P: Matthew Wilcox
|
||||
M: matthew@wil.cx
|
||||
|
@ -2286,6 +2295,11 @@ W: http://tpmdd.sourceforge.net
|
|||
L: tpmdd-devel@lists.sourceforge.net
|
||||
S: Maintained
|
||||
|
||||
Telecom Clock Driver for MCPL0010
|
||||
P: Mark Gross
|
||||
M: mark.gross@intel.com
|
||||
S: Supported
|
||||
|
||||
TENSILICA XTENSA PORT (xtensa):
|
||||
P: Chris Zankel
|
||||
M: chris@zankel.net
|
||||
|
|
4
README
4
README
|
@ -54,6 +54,10 @@ INSTALLING the kernel:
|
|||
|
||||
gzip -cd linux-2.6.XX.tar.gz | tar xvf -
|
||||
|
||||
or
|
||||
bzip2 -dc linux-2.6.XX.tar.bz2 | tar xvf -
|
||||
|
||||
|
||||
Replace "XX" with the version number of the latest kernel.
|
||||
|
||||
Do NOT use the /usr/src/linux area! This area has a (usually
|
||||
|
|
|
@ -55,10 +55,6 @@
|
|||
#include "proto.h"
|
||||
#include "irq_impl.h"
|
||||
|
||||
u64 jiffies_64 = INITIAL_JIFFIES;
|
||||
|
||||
EXPORT_SYMBOL(jiffies_64);
|
||||
|
||||
extern unsigned long wall_jiffies; /* kernel/timer.c */
|
||||
|
||||
static int set_rtc_mmss(unsigned long);
|
||||
|
|
|
@ -194,6 +194,13 @@ config ARCH_VERSATILE
|
|||
help
|
||||
This enables support for ARM Ltd Versatile board.
|
||||
|
||||
config ARCH_REALVIEW
|
||||
bool "RealView"
|
||||
select ARM_AMBA
|
||||
select ICST307
|
||||
help
|
||||
This enables support for ARM Ltd RealView boards.
|
||||
|
||||
config ARCH_IMX
|
||||
bool "IMX"
|
||||
|
||||
|
@ -244,6 +251,8 @@ source "arch/arm/mach-versatile/Kconfig"
|
|||
|
||||
source "arch/arm/mach-aaec2000/Kconfig"
|
||||
|
||||
source "arch/arm/mach-realview/Kconfig"
|
||||
|
||||
# Definitions to make life easier
|
||||
config ARCH_ACORN
|
||||
bool
|
||||
|
@ -340,6 +349,13 @@ config NR_CPUS
|
|||
depends on SMP
|
||||
default "4"
|
||||
|
||||
config HOTPLUG_CPU
|
||||
bool "Support for hot-pluggable CPUs (EXPERIMENTAL)"
|
||||
depends on SMP && HOTPLUG && EXPERIMENTAL
|
||||
help
|
||||
Say Y here to experiment with turning CPUs off and on. CPUs
|
||||
can be controlled through /sys/devices/system/cpu.
|
||||
|
||||
config PREEMPT
|
||||
bool "Preemptible Kernel (EXPERIMENTAL)"
|
||||
depends on EXPERIMENTAL
|
||||
|
@ -688,8 +704,7 @@ source "drivers/acorn/block/Kconfig"
|
|||
|
||||
if PCMCIA || ARCH_CLPS7500 || ARCH_IOP3XX || ARCH_IXP4XX \
|
||||
|| ARCH_L7200 || ARCH_LH7A40X || ARCH_PXA || ARCH_RPC \
|
||||
|| ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE \
|
||||
|| MACH_MP1000
|
||||
|| ARCH_S3C2410 || ARCH_SA1100 || ARCH_SHARK || FOOTBRIDGE
|
||||
source "drivers/ide/Kconfig"
|
||||
endif
|
||||
|
||||
|
|
|
@ -38,6 +38,7 @@ comma = ,
|
|||
# macro, but instead defines a whole series of macros which makes
|
||||
# testing for a specific architecture or later rather impossible.
|
||||
arch-$(CONFIG_CPU_32v6) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6,-march=armv5t -Wa$(comma)-march=armv6)
|
||||
arch-$(CONFIG_CPU_32v6K) :=-D__LINUX_ARM_ARCH__=6 $(call cc-option,-march=armv6k,-march=armv5t -Wa$(comma)-march=armv6k)
|
||||
arch-$(CONFIG_CPU_32v5) :=-D__LINUX_ARM_ARCH__=5 $(call cc-option,-march=armv5te,-march=armv4)
|
||||
arch-$(CONFIG_CPU_32v4) :=-D__LINUX_ARM_ARCH__=4 -march=armv4
|
||||
arch-$(CONFIG_CPU_32v3) :=-D__LINUX_ARM_ARCH__=3 -march=armv3
|
||||
|
@ -99,6 +100,7 @@ textaddr-$(CONFIG_ARCH_FORTUNET) := 0xc0008000
|
|||
machine-$(CONFIG_ARCH_IMX) := imx
|
||||
machine-$(CONFIG_ARCH_H720X) := h720x
|
||||
machine-$(CONFIG_ARCH_AAEC2000) := aaec2000
|
||||
machine-$(CONFIG_ARCH_REALVIEW) := realview
|
||||
|
||||
ifeq ($(CONFIG_ARCH_EBSA110),y)
|
||||
# This is what happens if you forget the IOCS16 line.
|
||||
|
@ -142,7 +144,7 @@ drivers-$(CONFIG_OPROFILE) += arch/arm/oprofile/
|
|||
drivers-$(CONFIG_ARCH_CLPS7500) += drivers/acorn/char/
|
||||
drivers-$(CONFIG_ARCH_L7200) += drivers/acorn/char/
|
||||
|
||||
libs-y += arch/arm/lib/
|
||||
libs-y := arch/arm/lib/ $(libs-y)
|
||||
|
||||
# Default target when executing plain make
|
||||
ifeq ($(CONFIG_XIP_KERNEL),y)
|
||||
|
|
|
@ -39,8 +39,7 @@
|
|||
defined(CONFIG_ARCH_IXP4XX) || \
|
||||
defined(CONFIG_ARCH_IXP2000) || \
|
||||
defined(CONFIG_ARCH_LH7A40X) || \
|
||||
defined(CONFIG_ARCH_OMAP) || \
|
||||
defined(CONFIG_MACH_MP1000)
|
||||
defined(CONFIG_ARCH_OMAP)
|
||||
.macro loadsp, rb
|
||||
addruart \rb
|
||||
.endm
|
||||
|
|
|
@ -10,6 +10,8 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
|
|
@ -33,8 +33,8 @@
|
|||
#include <asm/cacheflush.h>
|
||||
|
||||
#undef DEBUG
|
||||
|
||||
#undef STATS
|
||||
|
||||
#ifdef STATS
|
||||
#define DO_STATS(X) do { X ; } while (0)
|
||||
#else
|
||||
|
@ -52,26 +52,31 @@ struct safe_buffer {
|
|||
int direction;
|
||||
|
||||
/* safe buffer info */
|
||||
struct dma_pool *pool;
|
||||
struct dmabounce_pool *pool;
|
||||
void *safe;
|
||||
dma_addr_t safe_dma_addr;
|
||||
};
|
||||
|
||||
struct dmabounce_pool {
|
||||
unsigned long size;
|
||||
struct dma_pool *pool;
|
||||
#ifdef STATS
|
||||
unsigned long allocs;
|
||||
#endif
|
||||
};
|
||||
|
||||
struct dmabounce_device_info {
|
||||
struct list_head node;
|
||||
|
||||
struct device *dev;
|
||||
struct dma_pool *small_buffer_pool;
|
||||
struct dma_pool *large_buffer_pool;
|
||||
struct list_head safe_buffers;
|
||||
unsigned long small_buffer_size, large_buffer_size;
|
||||
#ifdef STATS
|
||||
unsigned long sbp_allocs;
|
||||
unsigned long lbp_allocs;
|
||||
unsigned long total_allocs;
|
||||
unsigned long map_op_count;
|
||||
unsigned long bounce_count;
|
||||
#endif
|
||||
struct dmabounce_pool small;
|
||||
struct dmabounce_pool large;
|
||||
};
|
||||
|
||||
static LIST_HEAD(dmabounce_devs);
|
||||
|
@ -82,9 +87,9 @@ static void print_alloc_stats(struct dmabounce_device_info *device_info)
|
|||
printk(KERN_INFO
|
||||
"%s: dmabounce: sbp: %lu, lbp: %lu, other: %lu, total: %lu\n",
|
||||
device_info->dev->bus_id,
|
||||
device_info->sbp_allocs, device_info->lbp_allocs,
|
||||
device_info->total_allocs - device_info->sbp_allocs -
|
||||
device_info->lbp_allocs,
|
||||
device_info->small.allocs, device_info->large.allocs,
|
||||
device_info->total_allocs - device_info->small.allocs -
|
||||
device_info->large.allocs,
|
||||
device_info->total_allocs);
|
||||
}
|
||||
#endif
|
||||
|
@ -106,18 +111,22 @@ find_dmabounce_dev(struct device *dev)
|
|||
/* allocate a 'safe' buffer and keep track of it */
|
||||
static inline struct safe_buffer *
|
||||
alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr,
|
||||
size_t size, enum dma_data_direction dir)
|
||||
size_t size, enum dma_data_direction dir)
|
||||
{
|
||||
struct safe_buffer *buf;
|
||||
struct dma_pool *pool;
|
||||
struct dmabounce_pool *pool;
|
||||
struct device *dev = device_info->dev;
|
||||
void *safe;
|
||||
dma_addr_t safe_dma_addr;
|
||||
|
||||
dev_dbg(dev, "%s(ptr=%p, size=%d, dir=%d)\n",
|
||||
__func__, ptr, size, dir);
|
||||
|
||||
DO_STATS ( device_info->total_allocs++ );
|
||||
if (size <= device_info->small.size) {
|
||||
pool = &device_info->small;
|
||||
} else if (size <= device_info->large.size) {
|
||||
pool = &device_info->large;
|
||||
} else {
|
||||
pool = NULL;
|
||||
}
|
||||
|
||||
buf = kmalloc(sizeof(struct safe_buffer), GFP_ATOMIC);
|
||||
if (buf == NULL) {
|
||||
|
@ -125,41 +134,35 @@ alloc_safe_buffer(struct dmabounce_device_info *device_info, void *ptr,
|
|||
return NULL;
|
||||
}
|
||||
|
||||
if (size <= device_info->small_buffer_size) {
|
||||
pool = device_info->small_buffer_pool;
|
||||
safe = dma_pool_alloc(pool, GFP_ATOMIC, &safe_dma_addr);
|
||||
buf->ptr = ptr;
|
||||
buf->size = size;
|
||||
buf->direction = dir;
|
||||
buf->pool = pool;
|
||||
|
||||
DO_STATS ( device_info->sbp_allocs++ );
|
||||
} else if (size <= device_info->large_buffer_size) {
|
||||
pool = device_info->large_buffer_pool;
|
||||
safe = dma_pool_alloc(pool, GFP_ATOMIC, &safe_dma_addr);
|
||||
|
||||
DO_STATS ( device_info->lbp_allocs++ );
|
||||
if (pool) {
|
||||
buf->safe = dma_pool_alloc(pool->pool, GFP_ATOMIC,
|
||||
&buf->safe_dma_addr);
|
||||
} else {
|
||||
pool = NULL;
|
||||
safe = dma_alloc_coherent(dev, size, &safe_dma_addr, GFP_ATOMIC);
|
||||
buf->safe = dma_alloc_coherent(dev, size, &buf->safe_dma_addr,
|
||||
GFP_ATOMIC);
|
||||
}
|
||||
|
||||
if (safe == NULL) {
|
||||
dev_warn(device_info->dev,
|
||||
"%s: could not alloc dma memory (size=%d)\n",
|
||||
__func__, size);
|
||||
if (buf->safe == NULL) {
|
||||
dev_warn(dev,
|
||||
"%s: could not alloc dma memory (size=%d)\n",
|
||||
__func__, size);
|
||||
kfree(buf);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
#ifdef STATS
|
||||
if (pool)
|
||||
pool->allocs++;
|
||||
device_info->total_allocs++;
|
||||
if (device_info->total_allocs % 1000 == 0)
|
||||
print_alloc_stats(device_info);
|
||||
#endif
|
||||
|
||||
buf->ptr = ptr;
|
||||
buf->size = size;
|
||||
buf->direction = dir;
|
||||
buf->pool = pool;
|
||||
buf->safe = safe;
|
||||
buf->safe_dma_addr = safe_dma_addr;
|
||||
|
||||
list_add(&buf->node, &device_info->safe_buffers);
|
||||
|
||||
return buf;
|
||||
|
@ -186,7 +189,7 @@ free_safe_buffer(struct dmabounce_device_info *device_info, struct safe_buffer *
|
|||
list_del(&buf->node);
|
||||
|
||||
if (buf->pool)
|
||||
dma_pool_free(buf->pool, buf->safe, buf->safe_dma_addr);
|
||||
dma_pool_free(buf->pool->pool, buf->safe, buf->safe_dma_addr);
|
||||
else
|
||||
dma_free_coherent(device_info->dev, buf->size, buf->safe,
|
||||
buf->safe_dma_addr);
|
||||
|
@ -197,12 +200,10 @@ free_safe_buffer(struct dmabounce_device_info *device_info, struct safe_buffer *
|
|||
/* ************************************************** */
|
||||
|
||||
#ifdef STATS
|
||||
|
||||
static void print_map_stats(struct dmabounce_device_info *device_info)
|
||||
{
|
||||
printk(KERN_INFO
|
||||
"%s: dmabounce: map_op_count=%lu, bounce_count=%lu\n",
|
||||
device_info->dev->bus_id,
|
||||
dev_info(device_info->dev,
|
||||
"dmabounce: map_op_count=%lu, bounce_count=%lu\n",
|
||||
device_info->map_op_count, device_info->bounce_count);
|
||||
}
|
||||
#endif
|
||||
|
@ -258,13 +259,13 @@ map_single(struct device *dev, void *ptr, size_t size,
|
|||
__func__, ptr, buf->safe, size);
|
||||
memcpy(buf->safe, ptr, size);
|
||||
}
|
||||
consistent_sync(buf->safe, size, dir);
|
||||
ptr = buf->safe;
|
||||
|
||||
dma_addr = buf->safe_dma_addr;
|
||||
} else {
|
||||
consistent_sync(ptr, size, dir);
|
||||
}
|
||||
|
||||
consistent_sync(ptr, size, dir);
|
||||
|
||||
return dma_addr;
|
||||
}
|
||||
|
||||
|
@ -278,7 +279,7 @@ unmap_single(struct device *dev, dma_addr_t dma_addr, size_t size,
|
|||
/*
|
||||
* Trying to unmap an invalid mapping
|
||||
*/
|
||||
if (dma_addr == ~0) {
|
||||
if (dma_mapping_error(dma_addr)) {
|
||||
dev_err(dev, "Trying to unmap invalid mapping\n");
|
||||
return;
|
||||
}
|
||||
|
@ -570,11 +571,25 @@ dma_sync_sg_for_device(struct device *dev, struct scatterlist *sg, int nents,
|
|||
local_irq_restore(flags);
|
||||
}
|
||||
|
||||
static int
|
||||
dmabounce_init_pool(struct dmabounce_pool *pool, struct device *dev, const char *name,
|
||||
unsigned long size)
|
||||
{
|
||||
pool->size = size;
|
||||
DO_STATS(pool->allocs = 0);
|
||||
pool->pool = dma_pool_create(name, dev, size,
|
||||
0 /* byte alignment */,
|
||||
0 /* no page-crossing issues */);
|
||||
|
||||
return pool->pool ? 0 : -ENOMEM;
|
||||
}
|
||||
|
||||
int
|
||||
dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
|
||||
unsigned long large_buffer_size)
|
||||
{
|
||||
struct dmabounce_device_info *device_info;
|
||||
int ret;
|
||||
|
||||
device_info = kmalloc(sizeof(struct dmabounce_device_info), GFP_ATOMIC);
|
||||
if (!device_info) {
|
||||
|
@ -584,45 +599,31 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
|
|||
return -ENOMEM;
|
||||
}
|
||||
|
||||
device_info->small_buffer_pool =
|
||||
dma_pool_create("small_dmabounce_pool",
|
||||
dev,
|
||||
small_buffer_size,
|
||||
0 /* byte alignment */,
|
||||
0 /* no page-crossing issues */);
|
||||
if (!device_info->small_buffer_pool) {
|
||||
printk(KERN_ERR
|
||||
"dmabounce: could not allocate small DMA pool for %s\n",
|
||||
dev->bus_id);
|
||||
kfree(device_info);
|
||||
return -ENOMEM;
|
||||
ret = dmabounce_init_pool(&device_info->small, dev,
|
||||
"small_dmabounce_pool", small_buffer_size);
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
"dmabounce: could not allocate DMA pool for %ld byte objects\n",
|
||||
small_buffer_size);
|
||||
goto err_free;
|
||||
}
|
||||
|
||||
if (large_buffer_size) {
|
||||
device_info->large_buffer_pool =
|
||||
dma_pool_create("large_dmabounce_pool",
|
||||
dev,
|
||||
large_buffer_size,
|
||||
0 /* byte alignment */,
|
||||
0 /* no page-crossing issues */);
|
||||
if (!device_info->large_buffer_pool) {
|
||||
printk(KERN_ERR
|
||||
"dmabounce: could not allocate large DMA pool for %s\n",
|
||||
dev->bus_id);
|
||||
dma_pool_destroy(device_info->small_buffer_pool);
|
||||
|
||||
return -ENOMEM;
|
||||
ret = dmabounce_init_pool(&device_info->large, dev,
|
||||
"large_dmabounce_pool",
|
||||
large_buffer_size);
|
||||
if (ret) {
|
||||
dev_err(dev,
|
||||
"dmabounce: could not allocate DMA pool for %ld byte objects\n",
|
||||
large_buffer_size);
|
||||
goto err_destroy;
|
||||
}
|
||||
}
|
||||
|
||||
device_info->dev = dev;
|
||||
device_info->small_buffer_size = small_buffer_size;
|
||||
device_info->large_buffer_size = large_buffer_size;
|
||||
INIT_LIST_HEAD(&device_info->safe_buffers);
|
||||
|
||||
#ifdef STATS
|
||||
device_info->sbp_allocs = 0;
|
||||
device_info->lbp_allocs = 0;
|
||||
device_info->total_allocs = 0;
|
||||
device_info->map_op_count = 0;
|
||||
device_info->bounce_count = 0;
|
||||
|
@ -634,6 +635,12 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
|
|||
dev->bus_id, dev->bus->name);
|
||||
|
||||
return 0;
|
||||
|
||||
err_destroy:
|
||||
dma_pool_destroy(device_info->small.pool);
|
||||
err_free:
|
||||
kfree(device_info);
|
||||
return ret;
|
||||
}
|
||||
|
||||
void
|
||||
|
@ -655,10 +662,10 @@ dmabounce_unregister_dev(struct device *dev)
|
|||
BUG();
|
||||
}
|
||||
|
||||
if (device_info->small_buffer_pool)
|
||||
dma_pool_destroy(device_info->small_buffer_pool);
|
||||
if (device_info->large_buffer_pool)
|
||||
dma_pool_destroy(device_info->large_buffer_pool);
|
||||
if (device_info->small.pool)
|
||||
dma_pool_destroy(device_info->small.pool);
|
||||
if (device_info->large.pool)
|
||||
dma_pool_destroy(device_info->large.pool);
|
||||
|
||||
#ifdef STATS
|
||||
print_alloc_stats(device_info);
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include <linux/delay.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
|
|
|
@ -22,7 +22,7 @@
|
|||
#include <linux/ptrace.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/spinlock.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
|
|
@ -12,6 +12,8 @@
|
|||
*/
|
||||
|
||||
#include <linux/device.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/hardware/scoop.h>
|
||||
|
||||
|
|
|
@ -559,7 +559,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|||
#
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=2
|
||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||
# CONFIG_SERIAL_8250_EXTENDED is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -152,7 +152,7 @@ CONFIG_ALIGNMENT_TRAP=y
|
|||
#
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE="console=ttyS0,57600 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware"
|
||||
CONFIG_CMDLINE="console=ttyS0,115200 root=/dev/nfs ip=bootp mem=64M@0x0 pci=firmware"
|
||||
# CONFIG_XIP_KERNEL is not set
|
||||
|
||||
#
|
||||
|
@ -560,7 +560,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|||
#
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=2
|
||||
CONFIG_SERIAL_8250_NR_UARTS=3
|
||||
# CONFIG_SERIAL_8250_EXTENDED is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -559,7 +559,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|||
#
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=2
|
||||
CONFIG_SERIAL_8250_NR_UARTS=1
|
||||
# CONFIG_SERIAL_8250_EXTENDED is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -560,7 +560,7 @@ CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
|||
#
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=2
|
||||
CONFIG_SERIAL_8250_NR_UARTS=3
|
||||
# CONFIG_SERIAL_8250_EXTENDED is not set
|
||||
|
||||
#
|
||||
|
|
|
@ -104,7 +104,7 @@ CONFIG_ARCH_IXCDP1100=y
|
|||
CONFIG_ARCH_PRPMC1100=y
|
||||
CONFIG_ARCH_IXDP4XX=y
|
||||
CONFIG_CPU_IXP46X=y
|
||||
CONFIG_MACH_GTWX5715=y
|
||||
# CONFIG_MACH_GTWX5715 is not set
|
||||
|
||||
#
|
||||
# IXP4xx Options
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.14-rc1
|
||||
# Fri Sep 16 15:48:13 2005
|
||||
# Linux kernel version: 2.6.14-rc2
|
||||
# Thu Sep 29 14:50:10 2005
|
||||
#
|
||||
CONFIG_ARM=y
|
||||
CONFIG_MMU=y
|
||||
|
@ -12,11 +12,9 @@ CONFIG_GENERIC_CALIBRATE_DELAY=y
|
|||
#
|
||||
# Code maturity level options
|
||||
#
|
||||
CONFIG_EXPERIMENTAL=y
|
||||
# CONFIG_CLEAN_COMPILE is not set
|
||||
CONFIG_BROKEN=y
|
||||
# CONFIG_EXPERIMENTAL is not set
|
||||
CONFIG_CLEAN_COMPILE=y
|
||||
CONFIG_BROKEN_ON_SMP=y
|
||||
CONFIG_LOCK_KERNEL=y
|
||||
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||
|
||||
#
|
||||
|
@ -24,18 +22,16 @@ CONFIG_INIT_ENV_ARG_LIMIT=32
|
|||
#
|
||||
CONFIG_LOCALVERSION=""
|
||||
CONFIG_LOCALVERSION_AUTO=y
|
||||
CONFIG_SWAP=y
|
||||
# CONFIG_SWAP is not set
|
||||
CONFIG_SYSVIPC=y
|
||||
# CONFIG_POSIX_MQUEUE is not set
|
||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_AUDIT is not set
|
||||
# CONFIG_HOTPLUG is not set
|
||||
CONFIG_HOTPLUG=y
|
||||
CONFIG_KOBJECT_UEVENT=y
|
||||
CONFIG_IKCONFIG=y
|
||||
CONFIG_IKCONFIG_PROC=y
|
||||
# CONFIG_IKCONFIG is not set
|
||||
CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_EMBEDDED=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
|
@ -58,17 +54,15 @@ CONFIG_BASE_SMALL=0
|
|||
#
|
||||
CONFIG_MODULES=y
|
||||
CONFIG_MODULE_UNLOAD=y
|
||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||
CONFIG_OBSOLETE_MODPARM=y
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
CONFIG_KMOD=y
|
||||
# CONFIG_KMOD is not set
|
||||
|
||||
#
|
||||
# System Type
|
||||
#
|
||||
# CONFIG_ARCH_CLPS7500 is not set
|
||||
CONFIG_ARCH_CLPS711X=y
|
||||
# CONFIG_ARCH_CLPS711X is not set
|
||||
# CONFIG_ARCH_CO285 is not set
|
||||
# CONFIG_ARCH_EBSA110 is not set
|
||||
# CONFIG_ARCH_CAMELOT is not set
|
||||
|
@ -86,43 +80,43 @@ CONFIG_ARCH_CLPS711X=y
|
|||
# CONFIG_ARCH_LH7A40X is not set
|
||||
# CONFIG_ARCH_OMAP is not set
|
||||
# CONFIG_ARCH_VERSATILE is not set
|
||||
CONFIG_ARCH_REALVIEW=y
|
||||
# CONFIG_ARCH_IMX is not set
|
||||
# CONFIG_ARCH_H720X is not set
|
||||
# CONFIG_ARCH_AAEC2000 is not set
|
||||
|
||||
#
|
||||
# CLPS711X/EP721X Implementations
|
||||
# RealView platform type
|
||||
#
|
||||
# CONFIG_ARCH_AUTCPU12 is not set
|
||||
# CONFIG_ARCH_CDB89712 is not set
|
||||
# CONFIG_ARCH_CEIVA is not set
|
||||
# CONFIG_ARCH_CLEP7312 is not set
|
||||
# CONFIG_ARCH_EDB7211 is not set
|
||||
# CONFIG_ARCH_P720T is not set
|
||||
# CONFIG_ARCH_FORTUNET is not set
|
||||
CONFIG_MACH_MP1000=y
|
||||
CONFIG_MP1000_90MHZ=y
|
||||
CONFIG_MACH_REALVIEW_EB=y
|
||||
|
||||
#
|
||||
# Processor Type
|
||||
#
|
||||
CONFIG_CPU_32=y
|
||||
CONFIG_CPU_ARM720T=y
|
||||
CONFIG_CPU_32v4=y
|
||||
CONFIG_CPU_ABRT_LV4T=y
|
||||
CONFIG_CPU_CACHE_V4=y
|
||||
CONFIG_CPU_ARM926T=y
|
||||
# CONFIG_CPU_V6 is not set
|
||||
CONFIG_CPU_32v5=y
|
||||
CONFIG_CPU_ABRT_EV5TJ=y
|
||||
CONFIG_CPU_CACHE_VIVT=y
|
||||
CONFIG_CPU_COPY_V4WT=y
|
||||
CONFIG_CPU_TLB_V4WT=y
|
||||
CONFIG_CPU_COPY_V4WB=y
|
||||
CONFIG_CPU_TLB_V4WBI=y
|
||||
|
||||
#
|
||||
# Processor Features
|
||||
#
|
||||
CONFIG_ARM_THUMB=y
|
||||
# CONFIG_CPU_ICACHE_DISABLE is not set
|
||||
# CONFIG_CPU_DCACHE_DISABLE is not set
|
||||
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
|
||||
# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
|
||||
CONFIG_ARM_GIC=y
|
||||
CONFIG_ICST307=y
|
||||
|
||||
#
|
||||
# Bus support
|
||||
#
|
||||
CONFIG_ARM_AMBA=y
|
||||
CONFIG_ISA_DMA_API=y
|
||||
|
||||
#
|
||||
|
@ -133,14 +127,8 @@ CONFIG_ISA_DMA_API=y
|
|||
#
|
||||
# Kernel Features
|
||||
#
|
||||
# CONFIG_SMP is not set
|
||||
CONFIG_PREEMPT=y
|
||||
# CONFIG_NO_IDLE_HZ is not set
|
||||
# CONFIG_ARCH_DISCONTIGMEM_ENABLE is not set
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_FLATMEM_MANUAL=y
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
# CONFIG_SPARSEMEM_MANUAL is not set
|
||||
CONFIG_FLATMEM=y
|
||||
CONFIG_FLAT_NODE_MEM_MAP=y
|
||||
# CONFIG_SPARSEMEM_STATIC is not set
|
||||
|
@ -151,7 +139,7 @@ CONFIG_ALIGNMENT_TRAP=y
|
|||
#
|
||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||
CONFIG_CMDLINE="console=ttyCL,38400 root=/dev/discs/disc0/part1 ip=any cs89x0_media=rj45"
|
||||
CONFIG_CMDLINE="root=/dev/nfs nfsroot=10.1.69.3:/work/nfsroot ip=dhcp console=ttyAMA0 mem=128M"
|
||||
# CONFIG_XIP_KERNEL is not set
|
||||
|
||||
#
|
||||
|
@ -163,14 +151,14 @@ CONFIG_CMDLINE="console=ttyCL,38400 root=/dev/discs/disc0/part1 ip=any cs89x0_me
|
|||
#
|
||||
CONFIG_FPE_NWFPE=y
|
||||
# CONFIG_FPE_NWFPE_XP is not set
|
||||
# CONFIG_FPE_FASTFPE is not set
|
||||
# CONFIG_VFP is not set
|
||||
|
||||
#
|
||||
# Userspace binary formats
|
||||
#
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_AOUT is not set
|
||||
CONFIG_BINFMT_MISC=y
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
# CONFIG_ARTHUR is not set
|
||||
|
||||
#
|
||||
|
@ -197,10 +185,9 @@ CONFIG_IP_FIB_HASH=y
|
|||
CONFIG_IP_PNP=y
|
||||
CONFIG_IP_PNP_DHCP=y
|
||||
CONFIG_IP_PNP_BOOTP=y
|
||||
CONFIG_IP_PNP_RARP=y
|
||||
# CONFIG_IP_PNP_RARP is not set
|
||||
# CONFIG_NET_IPIP is not set
|
||||
# CONFIG_NET_IPGRE is not set
|
||||
# CONFIG_ARPD is not set
|
||||
# CONFIG_SYN_COOKIES is not set
|
||||
# CONFIG_INET_AH is not set
|
||||
# CONFIG_INET_ESP is not set
|
||||
|
@ -210,36 +197,14 @@ CONFIG_INET_DIAG=y
|
|||
CONFIG_INET_TCP_DIAG=y
|
||||
# CONFIG_TCP_CONG_ADVANCED is not set
|
||||
CONFIG_TCP_CONG_BIC=y
|
||||
CONFIG_IPV6=y
|
||||
# CONFIG_IPV6_PRIVACY is not set
|
||||
# CONFIG_INET6_AH is not set
|
||||
# CONFIG_INET6_ESP is not set
|
||||
# CONFIG_INET6_IPCOMP is not set
|
||||
# CONFIG_INET6_TUNNEL is not set
|
||||
# CONFIG_IPV6_TUNNEL is not set
|
||||
# CONFIG_IPV6 is not set
|
||||
# CONFIG_NETFILTER is not set
|
||||
|
||||
#
|
||||
# DCCP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_DCCP is not set
|
||||
|
||||
#
|
||||
# SCTP Configuration (EXPERIMENTAL)
|
||||
#
|
||||
# CONFIG_IP_SCTP is not set
|
||||
# CONFIG_ATM is not set
|
||||
# CONFIG_BRIDGE is not set
|
||||
# CONFIG_VLAN_8021Q is not set
|
||||
# CONFIG_DECNET is not set
|
||||
# CONFIG_LLC2 is not set
|
||||
# CONFIG_IPX is not set
|
||||
# CONFIG_ATALK is not set
|
||||
# CONFIG_X25 is not set
|
||||
# CONFIG_LAPB is not set
|
||||
# CONFIG_NET_DIVERT is not set
|
||||
# CONFIG_ECONET is not set
|
||||
# CONFIG_WAN_ROUTER is not set
|
||||
# CONFIG_NET_SCHED is not set
|
||||
# CONFIG_NET_CLS_ROUTE is not set
|
||||
|
||||
|
@ -247,7 +212,6 @@ CONFIG_IPV6=y
|
|||
# Network testing
|
||||
#
|
||||
# CONFIG_NET_PKTGEN is not set
|
||||
# CONFIG_NETFILTER_NETLINK is not set
|
||||
# CONFIG_HAMRADIO is not set
|
||||
# CONFIG_IRDA is not set
|
||||
# CONFIG_BT is not set
|
||||
|
@ -269,14 +233,10 @@ CONFIG_PREVENT_FIRMWARE_BUILD=y
|
|||
# Memory Technology Devices (MTD)
|
||||
#
|
||||
CONFIG_MTD=y
|
||||
CONFIG_MTD_DEBUG=y
|
||||
CONFIG_MTD_DEBUG_VERBOSE=3
|
||||
# CONFIG_MTD_DEBUG is not set
|
||||
# CONFIG_MTD_CONCAT is not set
|
||||
CONFIG_MTD_PARTITIONS=y
|
||||
CONFIG_MTD_REDBOOT_PARTS=m
|
||||
CONFIG_MTD_REDBOOT_DIRECTORY_BLOCK=-2
|
||||
CONFIG_MTD_REDBOOT_PARTS_UNALLOCATED=y
|
||||
# CONFIG_MTD_REDBOOT_PARTS_READONLY is not set
|
||||
# CONFIG_MTD_REDBOOT_PARTS is not set
|
||||
CONFIG_MTD_CMDLINE_PARTS=y
|
||||
# CONFIG_MTD_AFS_PARTS is not set
|
||||
|
||||
|
@ -292,45 +252,36 @@ CONFIG_MTD_BLOCK=y
|
|||
#
|
||||
# RAM/ROM/Flash chip drivers
|
||||
#
|
||||
CONFIG_MTD_CFI=m
|
||||
CONFIG_MTD_CFI=y
|
||||
# CONFIG_MTD_JEDECPROBE is not set
|
||||
CONFIG_MTD_GEN_PROBE=m
|
||||
CONFIG_MTD_CFI_ADV_OPTIONS=y
|
||||
CONFIG_MTD_CFI_NOSWAP=y
|
||||
# CONFIG_MTD_CFI_BE_BYTE_SWAP is not set
|
||||
# CONFIG_MTD_CFI_LE_BYTE_SWAP is not set
|
||||
CONFIG_MTD_CFI_GEOMETRY=y
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_1 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_2 is not set
|
||||
CONFIG_MTD_GEN_PROBE=y
|
||||
# CONFIG_MTD_CFI_ADV_OPTIONS is not set
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_1=y
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_2=y
|
||||
CONFIG_MTD_MAP_BANK_WIDTH_4=y
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_8 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_16 is not set
|
||||
# CONFIG_MTD_MAP_BANK_WIDTH_32 is not set
|
||||
# CONFIG_MTD_CFI_I1 is not set
|
||||
CONFIG_MTD_CFI_I1=y
|
||||
CONFIG_MTD_CFI_I2=y
|
||||
# CONFIG_MTD_CFI_I4 is not set
|
||||
# CONFIG_MTD_CFI_I8 is not set
|
||||
# CONFIG_MTD_OTP is not set
|
||||
CONFIG_MTD_CFI_INTELEXT=m
|
||||
# CONFIG_MTD_CFI_AMDSTD is not set
|
||||
CONFIG_MTD_CFI_INTELEXT=y
|
||||
CONFIG_MTD_CFI_AMDSTD=y
|
||||
CONFIG_MTD_CFI_AMDSTD_RETRY=0
|
||||
# CONFIG_MTD_CFI_STAA is not set
|
||||
CONFIG_MTD_CFI_UTIL=m
|
||||
CONFIG_MTD_CFI_UTIL=y
|
||||
# CONFIG_MTD_RAM is not set
|
||||
# CONFIG_MTD_ROM is not set
|
||||
# CONFIG_MTD_ABSENT is not set
|
||||
# CONFIG_MTD_OBSOLETE_CHIPS is not set
|
||||
# CONFIG_MTD_XIP is not set
|
||||
|
||||
#
|
||||
# Mapping drivers for chip access
|
||||
#
|
||||
# CONFIG_MTD_COMPLEX_MAPPINGS is not set
|
||||
CONFIG_MTD_PHYSMAP=m
|
||||
CONFIG_MTD_PHYSMAP_START=0x0000000
|
||||
CONFIG_MTD_PHYSMAP_LEN=0x4000000
|
||||
CONFIG_MTD_PHYSMAP_BANKWIDTH=2
|
||||
# CONFIG_MTD_ARM_INTEGRATOR is not set
|
||||
CONFIG_MTD_EDB7312=m
|
||||
# CONFIG_MTD_PHYSMAP is not set
|
||||
CONFIG_MTD_ARM_INTEGRATOR=y
|
||||
# CONFIG_MTD_EDB7312 is not set
|
||||
# CONFIG_MTD_PLATRAM is not set
|
||||
|
||||
#
|
||||
|
@ -340,7 +291,6 @@ CONFIG_MTD_EDB7312=m
|
|||
# CONFIG_MTD_PHRAM is not set
|
||||
# CONFIG_MTD_MTDRAM is not set
|
||||
# CONFIG_MTD_BLKMTD is not set
|
||||
# CONFIG_MTD_BLOCK2MTD is not set
|
||||
|
||||
#
|
||||
# Disk-On-Chip Device Drivers
|
||||
|
@ -352,12 +302,7 @@ CONFIG_MTD_EDB7312=m
|
|||
#
|
||||
# NAND Flash Device Drivers
|
||||
#
|
||||
CONFIG_MTD_NAND=y
|
||||
# CONFIG_MTD_NAND_VERIFY_WRITE is not set
|
||||
CONFIG_MTD_NAND_MP1000=y
|
||||
CONFIG_MTD_NAND_IDS=y
|
||||
# CONFIG_MTD_NAND_DISKONCHIP is not set
|
||||
# CONFIG_MTD_NAND_NANDSIM is not set
|
||||
# CONFIG_MTD_NAND is not set
|
||||
|
||||
#
|
||||
# Parallel port support
|
||||
|
@ -372,52 +317,21 @@ CONFIG_MTD_NAND_IDS=y
|
|||
# Block devices
|
||||
#
|
||||
# CONFIG_BLK_DEV_COW_COMMON is not set
|
||||
CONFIG_BLK_DEV_LOOP=m
|
||||
# CONFIG_BLK_DEV_CRYPTOLOOP is not set
|
||||
# CONFIG_BLK_DEV_LOOP is not set
|
||||
# CONFIG_BLK_DEV_NBD is not set
|
||||
CONFIG_BLK_DEV_RAM=y
|
||||
CONFIG_BLK_DEV_RAM_COUNT=2
|
||||
CONFIG_BLK_DEV_RAM_SIZE=16384
|
||||
CONFIG_BLK_DEV_INITRD=y
|
||||
# CONFIG_BLK_DEV_RAM is not set
|
||||
CONFIG_BLK_DEV_RAM_COUNT=16
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
#
|
||||
CONFIG_IOSCHED_NOOP=y
|
||||
CONFIG_IOSCHED_AS=y
|
||||
# CONFIG_IOSCHED_AS is not set
|
||||
CONFIG_IOSCHED_DEADLINE=y
|
||||
CONFIG_IOSCHED_CFQ=y
|
||||
# CONFIG_IOSCHED_CFQ is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
|
||||
#
|
||||
# ATA/ATAPI/MFM/RLL support
|
||||
#
|
||||
CONFIG_IDE=y
|
||||
CONFIG_BLK_DEV_IDE=y
|
||||
|
||||
#
|
||||
# Please see Documentation/ide.txt for help/info on IDE drives
|
||||
#
|
||||
# CONFIG_BLK_DEV_IDE_SATA is not set
|
||||
# CONFIG_BLK_DEV_HD_IDE is not set
|
||||
CONFIG_BLK_DEV_IDEDISK=y
|
||||
# CONFIG_IDEDISK_MULTI_MODE is not set
|
||||
# CONFIG_BLK_DEV_IDECD is not set
|
||||
# CONFIG_BLK_DEV_IDETAPE is not set
|
||||
# CONFIG_BLK_DEV_IDEFLOPPY is not set
|
||||
# CONFIG_IDE_TASK_IOCTL is not set
|
||||
|
||||
#
|
||||
# IDE chipset support/bugfixes
|
||||
#
|
||||
# CONFIG_IDE_GENERIC is not set
|
||||
CONFIG_IDE_ARM=y
|
||||
CONFIG_BLK_DEV_IDE_MP1000=y
|
||||
# CONFIG_BLK_DEV_IDEDMA is not set
|
||||
# CONFIG_IDEDMA_AUTO is not set
|
||||
# CONFIG_BLK_DEV_HD is not set
|
||||
|
||||
#
|
||||
# SCSI device support
|
||||
#
|
||||
|
@ -427,14 +341,7 @@ CONFIG_BLK_DEV_IDE_MP1000=y
|
|||
#
|
||||
# Multi-device support (RAID and LVM)
|
||||
#
|
||||
CONFIG_MD=y
|
||||
# CONFIG_BLK_DEV_MD is not set
|
||||
CONFIG_BLK_DEV_DM=y
|
||||
# CONFIG_DM_CRYPT is not set
|
||||
# CONFIG_DM_SNAPSHOT is not set
|
||||
# CONFIG_DM_MIRROR is not set
|
||||
# CONFIG_DM_ZERO is not set
|
||||
# CONFIG_DM_MULTIPATH is not set
|
||||
# CONFIG_MD is not set
|
||||
|
||||
#
|
||||
# Fusion MPT device support
|
||||
|
@ -444,7 +351,6 @@ CONFIG_BLK_DEV_DM=y
|
|||
#
|
||||
# IEEE 1394 (FireWire) support
|
||||
#
|
||||
# CONFIG_IEEE1394 is not set
|
||||
|
||||
#
|
||||
# I2O device support
|
||||
|
@ -468,10 +374,9 @@ CONFIG_NETDEVICES=y
|
|||
# Ethernet (10 or 100Mbit)
|
||||
#
|
||||
CONFIG_NET_ETHERNET=y
|
||||
# CONFIG_MII is not set
|
||||
# CONFIG_SMC91X is not set
|
||||
CONFIG_MII=y
|
||||
CONFIG_SMC91X=y
|
||||
# CONFIG_DM9000 is not set
|
||||
CONFIG_CS89x0=y
|
||||
|
||||
#
|
||||
# Ethernet (1000 Mbit)
|
||||
|
@ -496,8 +401,6 @@ CONFIG_CS89x0=y
|
|||
# CONFIG_WAN is not set
|
||||
# CONFIG_PPP is not set
|
||||
# CONFIG_SLIP is not set
|
||||
# CONFIG_SHAPER is not set
|
||||
# CONFIG_NETCONSOLE is not set
|
||||
# CONFIG_NETPOLL is not set
|
||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||
|
||||
|
@ -514,17 +417,28 @@ CONFIG_INPUT=y
|
|||
#
|
||||
# Userland interfaces
|
||||
#
|
||||
# CONFIG_INPUT_MOUSEDEV is not set
|
||||
CONFIG_INPUT_MOUSEDEV=y
|
||||
CONFIG_INPUT_MOUSEDEV_PSAUX=y
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_X=1024
|
||||
CONFIG_INPUT_MOUSEDEV_SCREEN_Y=768
|
||||
# CONFIG_INPUT_JOYDEV is not set
|
||||
# CONFIG_INPUT_TSDEV is not set
|
||||
# CONFIG_INPUT_EVDEV is not set
|
||||
CONFIG_INPUT_EVBUG=y
|
||||
# CONFIG_INPUT_EVBUG is not set
|
||||
|
||||
#
|
||||
# Input Device Drivers
|
||||
#
|
||||
# CONFIG_INPUT_KEYBOARD is not set
|
||||
# CONFIG_INPUT_MOUSE is not set
|
||||
CONFIG_INPUT_KEYBOARD=y
|
||||
CONFIG_KEYBOARD_ATKBD=y
|
||||
# CONFIG_KEYBOARD_SUNKBD is not set
|
||||
# CONFIG_KEYBOARD_LKKBD is not set
|
||||
# CONFIG_KEYBOARD_XTKBD is not set
|
||||
# CONFIG_KEYBOARD_NEWTON is not set
|
||||
CONFIG_INPUT_MOUSE=y
|
||||
CONFIG_MOUSE_PS2=y
|
||||
# CONFIG_MOUSE_SERIAL is not set
|
||||
# CONFIG_MOUSE_VSXXXAA is not set
|
||||
# CONFIG_INPUT_JOYSTICK is not set
|
||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||
# CONFIG_INPUT_MISC is not set
|
||||
|
@ -533,8 +447,9 @@ CONFIG_INPUT_EVBUG=y
|
|||
# Hardware I/O ports
|
||||
#
|
||||
CONFIG_SERIO=y
|
||||
CONFIG_SERIO_SERPORT=y
|
||||
# CONFIG_SERIO_LIBPS2 is not set
|
||||
# CONFIG_SERIO_SERPORT is not set
|
||||
CONFIG_SERIO_AMBAKMI=y
|
||||
CONFIG_SERIO_LIBPS2=y
|
||||
# CONFIG_SERIO_RAW is not set
|
||||
# CONFIG_GAMEPORT is not set
|
||||
|
||||
|
@ -549,21 +464,19 @@ CONFIG_HW_CONSOLE=y
|
|||
#
|
||||
# Serial drivers
|
||||
#
|
||||
CONFIG_SERIAL_8250=y
|
||||
CONFIG_SERIAL_8250_CONSOLE=y
|
||||
CONFIG_SERIAL_8250_NR_UARTS=2
|
||||
# CONFIG_SERIAL_8250_EXTENDED is not set
|
||||
# CONFIG_SERIAL_8250 is not set
|
||||
|
||||
#
|
||||
# Non-8250 serial port support
|
||||
#
|
||||
CONFIG_SERIAL_CLPS711X=y
|
||||
CONFIG_SERIAL_CLPS711X_CONSOLE=y
|
||||
# CONFIG_SERIAL_AMBA_PL010 is not set
|
||||
CONFIG_SERIAL_AMBA_PL011=y
|
||||
CONFIG_SERIAL_AMBA_PL011_CONSOLE=y
|
||||
CONFIG_SERIAL_CORE=y
|
||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
CONFIG_LEGACY_PTY_COUNT=16
|
||||
|
||||
#
|
||||
# IPMI
|
||||
|
@ -574,8 +487,8 @@ CONFIG_LEGACY_PTY_COUNT=256
|
|||
# Watchdog Cards
|
||||
#
|
||||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_NVRAM=y
|
||||
CONFIG_RTC=y
|
||||
# CONFIG_NVRAM is not set
|
||||
# CONFIG_RTC is not set
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
|
||||
|
@ -596,9 +509,8 @@ CONFIG_RTC=y
|
|||
#
|
||||
# Hardware Monitoring support
|
||||
#
|
||||
CONFIG_HWMON=y
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_HWMON_VID is not set
|
||||
# CONFIG_HWMON_DEBUG_CHIP is not set
|
||||
|
||||
#
|
||||
# Misc devices
|
||||
|
@ -621,18 +533,72 @@ CONFIG_HWMON=y
|
|||
#
|
||||
# Graphics support
|
||||
#
|
||||
# CONFIG_FB is not set
|
||||
CONFIG_FB=y
|
||||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
CONFIG_FB_SOFT_CURSOR=y
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
# CONFIG_FB_MODE_HELPERS is not set
|
||||
# CONFIG_FB_TILEBLITTING is not set
|
||||
CONFIG_FB_ARMCLCD=y
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
|
||||
#
|
||||
# Console display driver support
|
||||
#
|
||||
# CONFIG_VGA_CONSOLE is not set
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FONTS is not set
|
||||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_8x16=y
|
||||
|
||||
#
|
||||
# Logo configuration
|
||||
#
|
||||
CONFIG_LOGO=y
|
||||
# CONFIG_LOGO_LINUX_MONO is not set
|
||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||
CONFIG_LOGO_LINUX_CLUT224=y
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
#
|
||||
# CONFIG_SOUND is not set
|
||||
CONFIG_SOUND=y
|
||||
|
||||
#
|
||||
# Advanced Linux Sound Architecture
|
||||
#
|
||||
CONFIG_SND=y
|
||||
CONFIG_SND_TIMER=y
|
||||
CONFIG_SND_PCM=y
|
||||
# CONFIG_SND_SEQUENCER is not set
|
||||
CONFIG_SND_OSSEMUL=y
|
||||
CONFIG_SND_MIXER_OSS=y
|
||||
CONFIG_SND_PCM_OSS=y
|
||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||
# CONFIG_SND_DEBUG is not set
|
||||
|
||||
#
|
||||
# Generic devices
|
||||
#
|
||||
# CONFIG_SND_DUMMY is not set
|
||||
# CONFIG_SND_MTPAV is not set
|
||||
# CONFIG_SND_SERIAL_U16550 is not set
|
||||
# CONFIG_SND_MPU401 is not set
|
||||
|
||||
#
|
||||
# ALSA ARM devices
|
||||
#
|
||||
# CONFIG_SND_ARMAACI is not set
|
||||
|
||||
#
|
||||
# Open Sound System
|
||||
#
|
||||
# CONFIG_SOUND_PRIME is not set
|
||||
|
||||
#
|
||||
# USB support
|
||||
|
@ -654,32 +620,17 @@ CONFIG_USB_ARCH_HAS_HCD=y
|
|||
#
|
||||
# File systems
|
||||
#
|
||||
CONFIG_EXT2_FS=y
|
||||
CONFIG_EXT2_FS_XATTR=y
|
||||
# CONFIG_EXT2_FS_POSIX_ACL is not set
|
||||
# CONFIG_EXT2_FS_SECURITY is not set
|
||||
# CONFIG_EXT2_FS_XIP is not set
|
||||
CONFIG_EXT3_FS=y
|
||||
CONFIG_EXT3_FS_XATTR=y
|
||||
# CONFIG_EXT3_FS_POSIX_ACL is not set
|
||||
# CONFIG_EXT3_FS_SECURITY is not set
|
||||
CONFIG_JBD=y
|
||||
# CONFIG_JBD_DEBUG is not set
|
||||
CONFIG_FS_MBCACHE=y
|
||||
CONFIG_REISERFS_FS=m
|
||||
# CONFIG_REISERFS_CHECK is not set
|
||||
# CONFIG_REISERFS_PROC_INFO is not set
|
||||
# CONFIG_REISERFS_FS_XATTR is not set
|
||||
# CONFIG_EXT2_FS is not set
|
||||
# CONFIG_EXT3_FS is not set
|
||||
# CONFIG_JBD is not set
|
||||
# CONFIG_REISERFS_FS is not set
|
||||
# CONFIG_JFS_FS is not set
|
||||
CONFIG_FS_POSIX_ACL=y
|
||||
# CONFIG_FS_POSIX_ACL is not set
|
||||
# CONFIG_XFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
CONFIG_INOTIFY=y
|
||||
CONFIG_QUOTA=y
|
||||
# CONFIG_QFMT_V1 is not set
|
||||
# CONFIG_QFMT_V2 is not set
|
||||
CONFIG_QUOTACTL=y
|
||||
# CONFIG_QUOTA is not set
|
||||
CONFIG_DNOTIFY=y
|
||||
# CONFIG_AUTOFS_FS is not set
|
||||
# CONFIG_AUTOFS4_FS is not set
|
||||
|
@ -694,8 +645,11 @@ CONFIG_DNOTIFY=y
|
|||
#
|
||||
# DOS/FAT/NT Filesystems
|
||||
#
|
||||
CONFIG_FAT_FS=y
|
||||
# CONFIG_MSDOS_FS is not set
|
||||
# CONFIG_VFAT_FS is not set
|
||||
CONFIG_VFAT_FS=y
|
||||
CONFIG_FAT_DEFAULT_CODEPAGE=437
|
||||
CONFIG_FAT_DEFAULT_IOCHARSET="iso8859-1"
|
||||
# CONFIG_NTFS_FS is not set
|
||||
|
||||
#
|
||||
|
@ -704,7 +658,6 @@ CONFIG_DNOTIFY=y
|
|||
CONFIG_PROC_FS=y
|
||||
CONFIG_SYSFS=y
|
||||
CONFIG_TMPFS=y
|
||||
# CONFIG_HUGETLBFS is not set
|
||||
# CONFIG_HUGETLB_PAGE is not set
|
||||
CONFIG_RAMFS=y
|
||||
# CONFIG_RELAYFS_FS is not set
|
||||
|
@ -712,22 +665,10 @@ CONFIG_RAMFS=y
|
|||
#
|
||||
# Miscellaneous filesystems
|
||||
#
|
||||
# CONFIG_ADFS_FS is not set
|
||||
# CONFIG_AFFS_FS is not set
|
||||
# CONFIG_HFS_FS is not set
|
||||
# CONFIG_HFSPLUS_FS is not set
|
||||
# CONFIG_BEFS_FS is not set
|
||||
# CONFIG_BFS_FS is not set
|
||||
# CONFIG_EFS_FS is not set
|
||||
# CONFIG_JFFS_FS is not set
|
||||
CONFIG_JFFS2_FS=m
|
||||
CONFIG_JFFS2_FS_DEBUG=0
|
||||
CONFIG_JFFS2_FS_WRITEBUFFER=y
|
||||
# CONFIG_JFFS2_COMPRESSION_OPTIONS is not set
|
||||
CONFIG_JFFS2_ZLIB=y
|
||||
CONFIG_JFFS2_RTIME=y
|
||||
# CONFIG_JFFS2_RUBIN is not set
|
||||
CONFIG_CRAMFS=m
|
||||
# CONFIG_JFFS2_FS is not set
|
||||
CONFIG_CRAMFS=y
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
|
@ -740,32 +681,16 @@ CONFIG_CRAMFS=m
|
|||
CONFIG_NFS_FS=y
|
||||
CONFIG_NFS_V3=y
|
||||
# CONFIG_NFS_V3_ACL is not set
|
||||
CONFIG_NFS_V4=y
|
||||
# CONFIG_NFS_DIRECTIO is not set
|
||||
CONFIG_NFSD=y
|
||||
CONFIG_NFSD_V3=y
|
||||
# CONFIG_NFSD_V3_ACL is not set
|
||||
CONFIG_NFSD_V4=y
|
||||
CONFIG_NFSD_TCP=y
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_LOCKD_V4=y
|
||||
CONFIG_EXPORTFS=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
CONFIG_SUNRPC_GSS=y
|
||||
CONFIG_RPCSEC_GSS_KRB5=y
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
CONFIG_SMB_FS=m
|
||||
# CONFIG_SMB_NLS_DEFAULT is not set
|
||||
CONFIG_CIFS=m
|
||||
# CONFIG_CIFS_STATS is not set
|
||||
# CONFIG_CIFS_XATTR is not set
|
||||
# CONFIG_CIFS_EXPERIMENTAL is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
# CONFIG_CIFS is not set
|
||||
# CONFIG_NCP_FS is not set
|
||||
# CONFIG_CODA_FS is not set
|
||||
# CONFIG_AFS_FS is not set
|
||||
# CONFIG_9P_FS is not set
|
||||
|
||||
#
|
||||
# Partition Types
|
||||
|
@ -802,7 +727,7 @@ CONFIG_NLS_CODEPAGE_437=y
|
|||
# CONFIG_NLS_CODEPAGE_1250 is not set
|
||||
# CONFIG_NLS_CODEPAGE_1251 is not set
|
||||
# CONFIG_NLS_ASCII is not set
|
||||
# CONFIG_NLS_ISO8859_1 is not set
|
||||
CONFIG_NLS_ISO8859_1=y
|
||||
# CONFIG_NLS_ISO8859_2 is not set
|
||||
# CONFIG_NLS_ISO8859_3 is not set
|
||||
# CONFIG_NLS_ISO8859_4 is not set
|
||||
|
@ -817,35 +742,27 @@ CONFIG_NLS_CODEPAGE_437=y
|
|||
# CONFIG_NLS_KOI8_U is not set
|
||||
# CONFIG_NLS_UTF8 is not set
|
||||
|
||||
#
|
||||
# Profiling support
|
||||
#
|
||||
# CONFIG_PROFILING is not set
|
||||
|
||||
#
|
||||
# Kernel hacking
|
||||
#
|
||||
CONFIG_PRINTK_TIME=y
|
||||
# CONFIG_PRINTK_TIME is not set
|
||||
CONFIG_DEBUG_KERNEL=y
|
||||
# CONFIG_MAGIC_SYSRQ is not set
|
||||
CONFIG_MAGIC_SYSRQ=y
|
||||
CONFIG_LOG_BUF_SHIFT=14
|
||||
CONFIG_DETECT_SOFTLOCKUP=y
|
||||
# CONFIG_SCHEDSTATS is not set
|
||||
# CONFIG_DEBUG_SLAB is not set
|
||||
CONFIG_DEBUG_PREEMPT=y
|
||||
# CONFIG_DEBUG_SPINLOCK is not set
|
||||
# CONFIG_DEBUG_SPINLOCK_SLEEP is not set
|
||||
# CONFIG_DEBUG_KOBJECT is not set
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
CONFIG_DEBUG_INFO=y
|
||||
CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_FS is not set
|
||||
CONFIG_FRAME_POINTER=y
|
||||
CONFIG_DEBUG_USER=y
|
||||
CONFIG_DEBUG_WAITQ=y
|
||||
# CONFIG_DEBUG_WAITQ is not set
|
||||
CONFIG_DEBUG_ERRORS=y
|
||||
CONFIG_DEBUG_LL=y
|
||||
# CONFIG_DEBUG_ICEDCC is not set
|
||||
# CONFIG_DEBUG_CLPS711X_UART2 is not set
|
||||
# CONFIG_DEBUG_LL is not set
|
||||
|
||||
#
|
||||
# Security options
|
||||
|
@ -856,31 +773,7 @@ CONFIG_DEBUG_LL=y
|
|||
#
|
||||
# Cryptographic options
|
||||
#
|
||||
CONFIG_CRYPTO=y
|
||||
# CONFIG_CRYPTO_HMAC is not set
|
||||
# CONFIG_CRYPTO_NULL is not set
|
||||
# CONFIG_CRYPTO_MD4 is not set
|
||||
CONFIG_CRYPTO_MD5=y
|
||||
# CONFIG_CRYPTO_SHA1 is not set
|
||||
# CONFIG_CRYPTO_SHA256 is not set
|
||||
# CONFIG_CRYPTO_SHA512 is not set
|
||||
# CONFIG_CRYPTO_WP512 is not set
|
||||
# CONFIG_CRYPTO_TGR192 is not set
|
||||
CONFIG_CRYPTO_DES=y
|
||||
# CONFIG_CRYPTO_BLOWFISH is not set
|
||||
# CONFIG_CRYPTO_TWOFISH is not set
|
||||
# CONFIG_CRYPTO_SERPENT is not set
|
||||
# CONFIG_CRYPTO_AES is not set
|
||||
# CONFIG_CRYPTO_CAST5 is not set
|
||||
# CONFIG_CRYPTO_CAST6 is not set
|
||||
# CONFIG_CRYPTO_TEA is not set
|
||||
# CONFIG_CRYPTO_ARC4 is not set
|
||||
# CONFIG_CRYPTO_KHAZAD is not set
|
||||
# CONFIG_CRYPTO_ANUBIS is not set
|
||||
# CONFIG_CRYPTO_DEFLATE is not set
|
||||
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
||||
# CONFIG_CRYPTO_CRC32C is not set
|
||||
# CONFIG_CRYPTO_TEST is not set
|
||||
# CONFIG_CRYPTO is not set
|
||||
|
||||
#
|
||||
# Hardware crypto devices
|
||||
|
@ -893,5 +786,4 @@ CONFIG_CRYPTO_DES=y
|
|||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_LIBCRC32C is not set
|
||||
CONFIG_ZLIB_INFLATE=m
|
||||
CONFIG_ZLIB_DEFLATE=m
|
||||
CONFIG_ZLIB_INFLATE=y
|
|
@ -18,6 +18,7 @@
|
|||
#include <linux/stddef.h>
|
||||
#include <linux/signal.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/sched.h>
|
||||
|
||||
#include <asm/ptrace.h>
|
||||
|
||||
|
|
|
@ -1050,3 +1050,34 @@ static int __init noirqdebug_setup(char *str)
|
|||
}
|
||||
|
||||
__setup("noirqdebug", noirqdebug_setup);
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
/*
|
||||
* The CPU has been marked offline. Migrate IRQs off this CPU. If
|
||||
* the affinity settings do not allow other CPUs, force them onto any
|
||||
* available CPU.
|
||||
*/
|
||||
void migrate_irqs(void)
|
||||
{
|
||||
unsigned int i, cpu = smp_processor_id();
|
||||
|
||||
for (i = 0; i < NR_IRQS; i++) {
|
||||
struct irqdesc *desc = irq_desc + i;
|
||||
|
||||
if (desc->cpu == cpu) {
|
||||
unsigned int newcpu = any_online_cpu(desc->affinity);
|
||||
|
||||
if (newcpu == NR_CPUS) {
|
||||
if (printk_ratelimit())
|
||||
printk(KERN_INFO "IRQ%u no longer affine to CPU%u\n",
|
||||
i, cpu);
|
||||
|
||||
cpus_setall(desc->affinity);
|
||||
newcpu = any_online_cpu(desc->affinity);
|
||||
}
|
||||
|
||||
route_irq(desc, i, newcpu);
|
||||
}
|
||||
}
|
||||
}
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/interrupt.h>
|
||||
#include <linux/kallsyms.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/cpu.h>
|
||||
|
||||
#include <asm/system.h>
|
||||
#include <asm/io.h>
|
||||
|
@ -105,6 +106,14 @@ void cpu_idle(void)
|
|||
/* endless idle loop with no priority at all */
|
||||
while (1) {
|
||||
void (*idle)(void) = pm_idle;
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
if (cpu_is_offline(smp_processor_id())) {
|
||||
leds_event(led_idle_start);
|
||||
cpu_die();
|
||||
}
|
||||
#endif
|
||||
|
||||
if (!idle)
|
||||
idle = default_idle;
|
||||
preempt_disable();
|
||||
|
|
|
@ -782,7 +782,7 @@ static int do_ptrace(int request, struct task_struct *child, long addr, long dat
|
|||
return ret;
|
||||
}
|
||||
|
||||
asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
|
||||
asmlinkage long sys_ptrace(long request, long pid, long addr, long data)
|
||||
{
|
||||
struct task_struct *child;
|
||||
int ret;
|
||||
|
|
|
@ -80,19 +80,23 @@ static DEFINE_SPINLOCK(smp_call_function_lock);
|
|||
|
||||
int __cpuinit __cpu_up(unsigned int cpu)
|
||||
{
|
||||
struct task_struct *idle;
|
||||
struct cpuinfo_arm *ci = &per_cpu(cpu_data, cpu);
|
||||
struct task_struct *idle = ci->idle;
|
||||
pgd_t *pgd;
|
||||
pmd_t *pmd;
|
||||
int ret;
|
||||
|
||||
/*
|
||||
* Spawn a new process manually. Grab a pointer to
|
||||
* its task struct so we can mess with it
|
||||
* Spawn a new process manually, if not already done.
|
||||
* Grab a pointer to its task struct so we can mess with it
|
||||
*/
|
||||
idle = fork_idle(cpu);
|
||||
if (IS_ERR(idle)) {
|
||||
printk(KERN_ERR "CPU%u: fork() failed\n", cpu);
|
||||
return PTR_ERR(idle);
|
||||
if (!idle) {
|
||||
idle = fork_idle(cpu);
|
||||
if (IS_ERR(idle)) {
|
||||
printk(KERN_ERR "CPU%u: fork() failed\n", cpu);
|
||||
return PTR_ERR(idle);
|
||||
}
|
||||
ci->idle = idle;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -155,6 +159,91 @@ int __cpuinit __cpu_up(unsigned int cpu)
|
|||
return ret;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_HOTPLUG_CPU
|
||||
/*
|
||||
* __cpu_disable runs on the processor to be shutdown.
|
||||
*/
|
||||
int __cpuexit __cpu_disable(void)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
struct task_struct *p;
|
||||
int ret;
|
||||
|
||||
ret = mach_cpu_disable(cpu);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
/*
|
||||
* Take this CPU offline. Once we clear this, we can't return,
|
||||
* and we must not schedule until we're ready to give up the cpu.
|
||||
*/
|
||||
cpu_clear(cpu, cpu_online_map);
|
||||
|
||||
/*
|
||||
* OK - migrate IRQs away from this CPU
|
||||
*/
|
||||
migrate_irqs();
|
||||
|
||||
/*
|
||||
* Flush user cache and TLB mappings, and then remove this CPU
|
||||
* from the vm mask set of all processes.
|
||||
*/
|
||||
flush_cache_all();
|
||||
local_flush_tlb_all();
|
||||
|
||||
read_lock(&tasklist_lock);
|
||||
for_each_process(p) {
|
||||
if (p->mm)
|
||||
cpu_clear(cpu, p->mm->cpu_vm_mask);
|
||||
}
|
||||
read_unlock(&tasklist_lock);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* called on the thread which is asking for a CPU to be shutdown -
|
||||
* waits until shutdown has completed, or it is timed out.
|
||||
*/
|
||||
void __cpuexit __cpu_die(unsigned int cpu)
|
||||
{
|
||||
if (!platform_cpu_kill(cpu))
|
||||
printk("CPU%u: unable to kill\n", cpu);
|
||||
}
|
||||
|
||||
/*
|
||||
* Called from the idle thread for the CPU which has been shutdown.
|
||||
*
|
||||
* Note that we disable IRQs here, but do not re-enable them
|
||||
* before returning to the caller. This is also the behaviour
|
||||
* of the other hotplug-cpu capable cores, so presumably coming
|
||||
* out of idle fixes this.
|
||||
*/
|
||||
void __cpuexit cpu_die(void)
|
||||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
||||
local_irq_disable();
|
||||
idle_task_exit();
|
||||
|
||||
/*
|
||||
* actual CPU shutdown procedure is at least platform (if not
|
||||
* CPU) specific
|
||||
*/
|
||||
platform_cpu_die(cpu);
|
||||
|
||||
/*
|
||||
* Do not return to the idle loop - jump back to the secondary
|
||||
* cpu initialisation. There's some initialisation which needs
|
||||
* to be repeated to undo the effects of taking the CPU offline.
|
||||
*/
|
||||
__asm__("mov sp, %0\n"
|
||||
" b secondary_start_kernel"
|
||||
:
|
||||
: "r" ((void *)current->thread_info + THREAD_SIZE - 8));
|
||||
}
|
||||
#endif /* CONFIG_HOTPLUG_CPU */
|
||||
|
||||
/*
|
||||
* This is the secondary CPU boot entry. We're using this CPUs
|
||||
* idle thread stack, but a set of temporary page tables.
|
||||
|
@ -236,6 +325,8 @@ void __init smp_prepare_boot_cpu(void)
|
|||
{
|
||||
unsigned int cpu = smp_processor_id();
|
||||
|
||||
per_cpu(cpu_data, cpu).idle = current;
|
||||
|
||||
cpu_set(cpu, cpu_possible_map);
|
||||
cpu_set(cpu, cpu_present_map);
|
||||
cpu_set(cpu, cpu_online_map);
|
||||
|
@ -309,8 +400,8 @@ int smp_call_function_on_cpu(void (*func)(void *info), void *info, int retry,
|
|||
printk(KERN_CRIT
|
||||
"CPU%u: smp_call_function timeout for %p(%p)\n"
|
||||
" callmap %lx pending %lx, %swait\n",
|
||||
smp_processor_id(), func, info, callmap, data.pending,
|
||||
wait ? "" : "no ");
|
||||
smp_processor_id(), func, info, *cpus_addr(callmap),
|
||||
*cpus_addr(data.pending), wait ? "" : "no ");
|
||||
|
||||
/*
|
||||
* TRACE
|
||||
|
|
|
@ -36,10 +36,6 @@
|
|||
#include <asm/thread_info.h>
|
||||
#include <asm/mach/time.h>
|
||||
|
||||
u64 jiffies_64 = INITIAL_JIFFIES;
|
||||
|
||||
EXPORT_SYMBOL(jiffies_64);
|
||||
|
||||
/*
|
||||
* Our system timer.
|
||||
*/
|
||||
|
|
|
@ -198,25 +198,16 @@ void show_stack(struct task_struct *tsk, unsigned long *sp)
|
|||
barrier();
|
||||
}
|
||||
|
||||
DEFINE_SPINLOCK(die_lock);
|
||||
|
||||
/*
|
||||
* This function is protected against re-entrancy.
|
||||
*/
|
||||
NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
|
||||
static void __die(const char *str, int err, struct thread_info *thread, struct pt_regs *regs)
|
||||
{
|
||||
struct task_struct *tsk = current;
|
||||
struct task_struct *tsk = thread->task;
|
||||
static int die_counter;
|
||||
|
||||
console_verbose();
|
||||
spin_lock_irq(&die_lock);
|
||||
bust_spinlocks(1);
|
||||
|
||||
printk("Internal error: %s: %x [#%d]\n", str, err, ++die_counter);
|
||||
print_modules();
|
||||
__show_regs(regs);
|
||||
printk("Process %s (pid: %d, stack limit = 0x%p)\n",
|
||||
tsk->comm, tsk->pid, tsk->thread_info + 1);
|
||||
tsk->comm, tsk->pid, thread + 1);
|
||||
|
||||
if (!user_mode(regs) || in_interrupt()) {
|
||||
dump_mem("Stack: ", regs->ARM_sp,
|
||||
|
@ -224,7 +215,21 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
|
|||
dump_backtrace(regs, tsk);
|
||||
dump_instr(regs);
|
||||
}
|
||||
}
|
||||
|
||||
DEFINE_SPINLOCK(die_lock);
|
||||
|
||||
/*
|
||||
* This function is protected against re-entrancy.
|
||||
*/
|
||||
NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
|
||||
{
|
||||
struct thread_info *thread = current_thread_info();
|
||||
|
||||
console_verbose();
|
||||
spin_lock_irq(&die_lock);
|
||||
bust_spinlocks(1);
|
||||
__die(str, err, thread, regs);
|
||||
bust_spinlocks(0);
|
||||
spin_unlock_irq(&die_lock);
|
||||
do_exit(SIGSEGV);
|
||||
|
|
|
@ -7,13 +7,27 @@
|
|||
lib-y := backtrace.o changebit.o csumipv6.o csumpartial.o \
|
||||
csumpartialcopy.o csumpartialcopyuser.o clearbit.o \
|
||||
copy_page.o delay.o findbit.o memchr.o memcpy.o \
|
||||
memset.o memzero.o setbit.o strncpy_from_user.o \
|
||||
strnlen_user.o strchr.o strrchr.o testchangebit.o \
|
||||
testclearbit.o testsetbit.o uaccess.o getuser.o \
|
||||
putuser.o ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \
|
||||
memmove.o memset.o memzero.o setbit.o \
|
||||
strncpy_from_user.o strnlen_user.o \
|
||||
strchr.o strrchr.o \
|
||||
testchangebit.o testclearbit.o testsetbit.o \
|
||||
getuser.o putuser.o clear_user.o \
|
||||
ashldi3.o ashrdi3.o lshrdi3.o muldi3.o \
|
||||
ucmpdi2.o lib1funcs.o div64.o sha1.o \
|
||||
io-readsb.o io-writesb.o io-readsl.o io-writesl.o
|
||||
|
||||
# the code in uaccess.S is not preemption safe and
|
||||
# probably faster on ARMv3 only
|
||||
ifeq ($CONFIG_PREEMPT,y)
|
||||
lib-y += copy_from_user.o copy_to_user.o
|
||||
else
|
||||
ifneq ($(CONFIG_CPU_32v3),y)
|
||||
lib-y += copy_from_user.o copy_to_user.o
|
||||
else
|
||||
lib-y += uaccess.o
|
||||
endif
|
||||
endif
|
||||
|
||||
ifeq ($(CONFIG_CPU_32v3),y)
|
||||
lib-y += io-readsw-armv3.o io-writesw-armv3.o
|
||||
else
|
||||
|
|
48
arch/arm/lib/ashldi3.S
Normal file
48
arch/arm/lib/ashldi3.S
Normal file
|
@ -0,0 +1,48 @@
|
|||
/* Copyright 1995, 1996, 1998, 1999, 2000, 2003, 2004, 2005
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
In addition to the permissions in the GNU General Public License, the
|
||||
Free Software Foundation gives you unlimited permission to link the
|
||||
compiled version of this file into combinations with other programs,
|
||||
and to distribute those combinations without any restriction coming
|
||||
from the use of this file. (The General Public License restrictions
|
||||
do apply in other respects; for example, they cover modification of
|
||||
the file, and distribution when not linked into a combine
|
||||
executable.)
|
||||
|
||||
This file is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA. */
|
||||
|
||||
|
||||
#include <linux/linkage.h>
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define al r1
|
||||
#define ah r0
|
||||
#else
|
||||
#define al r0
|
||||
#define ah r1
|
||||
#endif
|
||||
|
||||
ENTRY(__ashldi3)
|
||||
|
||||
subs r3, r2, #32
|
||||
rsb ip, r2, #32
|
||||
movmi ah, ah, lsl r2
|
||||
movpl ah, al, lsl r3
|
||||
orrmi ah, ah, al, lsr ip
|
||||
mov al, al, lsl r2
|
||||
mov pc, lr
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
/* More subroutines needed by GCC output code on some machines. */
|
||||
/* Compile this one with gcc. */
|
||||
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
||||
GNU CC is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU CC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU CC; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* As a special exception, if you link this library with other files,
|
||||
some of which are compiled with GCC, to produce an executable,
|
||||
this library does not by itself cause the resulting executable
|
||||
to be covered by the GNU General Public License.
|
||||
This exception does not however invalidate any other reasons why
|
||||
the executable file might be covered by the GNU General Public License.
|
||||
*/
|
||||
/* support functions required by the kernel. based on code from gcc-2.95.3 */
|
||||
/* I Molton 29/07/01 */
|
||||
|
||||
#include "gcclib.h"
|
||||
|
||||
s64 __ashldi3(s64 u, int b)
|
||||
{
|
||||
DIunion w;
|
||||
int bm;
|
||||
DIunion uu;
|
||||
|
||||
if (b == 0)
|
||||
return u;
|
||||
|
||||
uu.ll = u;
|
||||
|
||||
bm = (sizeof(s32) * BITS_PER_UNIT) - b;
|
||||
if (bm <= 0) {
|
||||
w.s.low = 0;
|
||||
w.s.high = (u32) uu.s.low << -bm;
|
||||
} else {
|
||||
u32 carries = (u32) uu.s.low >> bm;
|
||||
w.s.low = (u32) uu.s.low << b;
|
||||
w.s.high = ((u32) uu.s.high << b) | carries;
|
||||
}
|
||||
|
||||
return w.ll;
|
||||
}
|
48
arch/arm/lib/ashrdi3.S
Normal file
48
arch/arm/lib/ashrdi3.S
Normal file
|
@ -0,0 +1,48 @@
|
|||
/* Copyright 1995, 1996, 1998, 1999, 2000, 2003, 2004, 2005
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
In addition to the permissions in the GNU General Public License, the
|
||||
Free Software Foundation gives you unlimited permission to link the
|
||||
compiled version of this file into combinations with other programs,
|
||||
and to distribute those combinations without any restriction coming
|
||||
from the use of this file. (The General Public License restrictions
|
||||
do apply in other respects; for example, they cover modification of
|
||||
the file, and distribution when not linked into a combine
|
||||
executable.)
|
||||
|
||||
This file is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA. */
|
||||
|
||||
|
||||
#include <linux/linkage.h>
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define al r1
|
||||
#define ah r0
|
||||
#else
|
||||
#define al r0
|
||||
#define ah r1
|
||||
#endif
|
||||
|
||||
ENTRY(__ashrdi3)
|
||||
|
||||
subs r3, r2, #32
|
||||
rsb ip, r2, #32
|
||||
movmi al, al, lsr r2
|
||||
movpl al, ah, asr r3
|
||||
orrmi al, al, ah, lsl ip
|
||||
mov ah, ah, asr r2
|
||||
mov pc, lr
|
||||
|
|
@ -1,57 +0,0 @@
|
|||
/* More subroutines needed by GCC output code on some machines. */
|
||||
/* Compile this one with gcc. */
|
||||
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
||||
GNU CC is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU CC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU CC; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* As a special exception, if you link this library with other files,
|
||||
some of which are compiled with GCC, to produce an executable,
|
||||
this library does not by itself cause the resulting executable
|
||||
to be covered by the GNU General Public License.
|
||||
This exception does not however invalidate any other reasons why
|
||||
the executable file might be covered by the GNU General Public License.
|
||||
*/
|
||||
/* support functions required by the kernel. based on code from gcc-2.95.3 */
|
||||
/* I Molton 29/07/01 */
|
||||
|
||||
#include "gcclib.h"
|
||||
|
||||
s64 __ashrdi3(s64 u, int b)
|
||||
{
|
||||
DIunion w;
|
||||
int bm;
|
||||
DIunion uu;
|
||||
|
||||
if (b == 0)
|
||||
return u;
|
||||
|
||||
uu.ll = u;
|
||||
|
||||
bm = (sizeof(s32) * BITS_PER_UNIT) - b;
|
||||
if (bm <= 0) {
|
||||
/* w.s.high = 1..1 or 0..0 */
|
||||
w.s.high = uu.s.high >> (sizeof(s32) * BITS_PER_UNIT - 1);
|
||||
w.s.low = uu.s.high >> -bm;
|
||||
} else {
|
||||
u32 carries = (u32) uu.s.high << bm;
|
||||
w.s.high = uu.s.high >> b;
|
||||
w.s.low = ((u32) uu.s.low >> b) | carries;
|
||||
}
|
||||
|
||||
return w.ll;
|
||||
}
|
|
@ -1,6 +1,6 @@
|
|||
#include <linux/config.h>
|
||||
|
||||
#if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_CPU_MPCORE)
|
||||
#if __LINUX_ARM_ARCH__ >= 6 && defined(CONFIG_CPU_32v6K)
|
||||
.macro bitop, instr
|
||||
mov r2, #1
|
||||
and r3, r0, #7 @ Get bit offset
|
||||
|
|
52
arch/arm/lib/clear_user.S
Normal file
52
arch/arm/lib/clear_user.S
Normal file
|
@ -0,0 +1,52 @@
|
|||
/*
|
||||
* linux/arch/arm/lib/clear_user.S
|
||||
*
|
||||
* Copyright (C) 1995, 1996,1997,1998 Russell King
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
.text
|
||||
|
||||
/* Prototype: int __arch_clear_user(void *addr, size_t sz)
|
||||
* Purpose : clear some user memory
|
||||
* Params : addr - user memory address to clear
|
||||
* : sz - number of bytes to clear
|
||||
* Returns : number of bytes NOT cleared
|
||||
*/
|
||||
ENTRY(__arch_clear_user)
|
||||
stmfd sp!, {r1, lr}
|
||||
mov r2, #0
|
||||
cmp r1, #4
|
||||
blt 2f
|
||||
ands ip, r0, #3
|
||||
beq 1f
|
||||
cmp ip, #2
|
||||
USER( strbt r2, [r0], #1)
|
||||
USER( strlebt r2, [r0], #1)
|
||||
USER( strltbt r2, [r0], #1)
|
||||
rsb ip, ip, #4
|
||||
sub r1, r1, ip @ 7 6 5 4 3 2 1
|
||||
1: subs r1, r1, #8 @ -1 -2 -3 -4 -5 -6 -7
|
||||
USER( strplt r2, [r0], #4)
|
||||
USER( strplt r2, [r0], #4)
|
||||
bpl 1b
|
||||
adds r1, r1, #4 @ 3 2 1 0 -1 -2 -3
|
||||
USER( strplt r2, [r0], #4)
|
||||
2: tst r1, #2 @ 1x 1x 0x 0x 1x 1x 0x
|
||||
USER( strnebt r2, [r0], #1)
|
||||
USER( strnebt r2, [r0], #1)
|
||||
tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1
|
||||
USER( strnebt r2, [r0], #1)
|
||||
mov r0, #0
|
||||
LOADREGS(fd,sp!, {r1, pc})
|
||||
|
||||
.section .fixup,"ax"
|
||||
.align 0
|
||||
9001: LOADREGS(fd,sp!, {r0, pc})
|
||||
.previous
|
||||
|
101
arch/arm/lib/copy_from_user.S
Normal file
101
arch/arm/lib/copy_from_user.S
Normal file
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
* linux/arch/arm/lib/copy_from_user.S
|
||||
*
|
||||
* Author: Nicolas Pitre
|
||||
* Created: Sep 29, 2005
|
||||
* Copyright: MontaVista Software, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
/*
|
||||
* Prototype:
|
||||
*
|
||||
* size_t __arch_copy_from_user(void *to, const void *from, size_t n)
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* copy a block to kernel memory from user memory
|
||||
*
|
||||
* Params:
|
||||
*
|
||||
* to = kernel memory
|
||||
* from = user memory
|
||||
* n = number of bytes to copy
|
||||
*
|
||||
* Return value:
|
||||
*
|
||||
* Number of bytes NOT copied.
|
||||
*/
|
||||
|
||||
.macro ldr1w ptr reg abort
|
||||
100: ldrt \reg, [\ptr], #4
|
||||
.section __ex_table, "a"
|
||||
.long 100b, \abort
|
||||
.previous
|
||||
.endm
|
||||
|
||||
.macro ldr4w ptr reg1 reg2 reg3 reg4 abort
|
||||
ldr1w \ptr, \reg1, \abort
|
||||
ldr1w \ptr, \reg2, \abort
|
||||
ldr1w \ptr, \reg3, \abort
|
||||
ldr1w \ptr, \reg4, \abort
|
||||
.endm
|
||||
|
||||
.macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
|
||||
ldr4w \ptr, \reg1, \reg2, \reg3, \reg4, \abort
|
||||
ldr4w \ptr, \reg5, \reg6, \reg7, \reg8, \abort
|
||||
.endm
|
||||
|
||||
.macro ldr1b ptr reg cond=al abort
|
||||
100: ldr\cond\()bt \reg, [\ptr], #1
|
||||
.section __ex_table, "a"
|
||||
.long 100b, \abort
|
||||
.previous
|
||||
.endm
|
||||
|
||||
.macro str1w ptr reg abort
|
||||
str \reg, [\ptr], #4
|
||||
.endm
|
||||
|
||||
.macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
|
||||
stmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
|
||||
.endm
|
||||
|
||||
.macro str1b ptr reg cond=al abort
|
||||
str\cond\()b \reg, [\ptr], #1
|
||||
.endm
|
||||
|
||||
.macro enter reg1 reg2
|
||||
mov r3, #0
|
||||
stmdb sp!, {r0, r2, r3, \reg1, \reg2}
|
||||
.endm
|
||||
|
||||
.macro exit reg1 reg2
|
||||
add sp, sp, #8
|
||||
ldmfd sp!, {r0, \reg1, \reg2}
|
||||
.endm
|
||||
|
||||
.text
|
||||
|
||||
ENTRY(__arch_copy_from_user)
|
||||
|
||||
#include "copy_template.S"
|
||||
|
||||
.section .fixup,"ax"
|
||||
.align 0
|
||||
copy_abort_preamble
|
||||
ldmfd sp!, {r1, r2}
|
||||
sub r3, r0, r1
|
||||
rsb r1, r3, r2
|
||||
str r1, [sp]
|
||||
bl __memzero
|
||||
ldr r0, [sp], #4
|
||||
copy_abort_end
|
||||
.previous
|
||||
|
255
arch/arm/lib/copy_template.S
Normal file
255
arch/arm/lib/copy_template.S
Normal file
|
@ -0,0 +1,255 @@
|
|||
/*
|
||||
* linux/arch/arm/lib/copy_template.s
|
||||
*
|
||||
* Code template for optimized memory copy functions
|
||||
*
|
||||
* Author: Nicolas Pitre
|
||||
* Created: Sep 28, 2005
|
||||
* Copyright: MontaVista Software, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
/*
|
||||
* This can be used to enable code to cacheline align the source pointer.
|
||||
* Experiments on tested architectures (StrongARM and XScale) didn't show
|
||||
* this a worthwhile thing to do. That might be different in the future.
|
||||
*/
|
||||
//#define CALGN(code...) code
|
||||
#define CALGN(code...)
|
||||
|
||||
/*
|
||||
* Theory of operation
|
||||
* -------------------
|
||||
*
|
||||
* This file provides the core code for a forward memory copy used in
|
||||
* the implementation of memcopy(), copy_to_user() and copy_from_user().
|
||||
*
|
||||
* The including file must define the following accessor macros
|
||||
* according to the need of the given function:
|
||||
*
|
||||
* ldr1w ptr reg abort
|
||||
*
|
||||
* This loads one word from 'ptr', stores it in 'reg' and increments
|
||||
* 'ptr' to the next word. The 'abort' argument is used for fixup tables.
|
||||
*
|
||||
* ldr4w ptr reg1 reg2 reg3 reg4 abort
|
||||
* ldr8w ptr, reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
|
||||
*
|
||||
* This loads four or eight words starting from 'ptr', stores them
|
||||
* in provided registers and increments 'ptr' past those words.
|
||||
* The'abort' argument is used for fixup tables.
|
||||
*
|
||||
* ldr1b ptr reg cond abort
|
||||
*
|
||||
* Similar to ldr1w, but it loads a byte and increments 'ptr' one byte.
|
||||
* It also must apply the condition code if provided, otherwise the
|
||||
* "al" condition is assumed by default.
|
||||
*
|
||||
* str1w ptr reg abort
|
||||
* str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
|
||||
* str1b ptr reg cond abort
|
||||
*
|
||||
* Same as their ldr* counterparts, but data is stored to 'ptr' location
|
||||
* rather than being loaded.
|
||||
*
|
||||
* enter reg1 reg2
|
||||
*
|
||||
* Preserve the provided registers on the stack plus any additional
|
||||
* data as needed by the implementation including this code. Called
|
||||
* upon code entry.
|
||||
*
|
||||
* exit reg1 reg2
|
||||
*
|
||||
* Restore registers with the values previously saved with the
|
||||
* 'preserv' macro. Called upon code termination.
|
||||
*/
|
||||
|
||||
|
||||
enter r4, lr
|
||||
|
||||
subs r2, r2, #4
|
||||
blt 8f
|
||||
ands ip, r0, #3
|
||||
PLD( pld [r1, #0] )
|
||||
bne 9f
|
||||
ands ip, r1, #3
|
||||
bne 10f
|
||||
|
||||
1: subs r2, r2, #(28)
|
||||
stmfd sp!, {r5 - r8}
|
||||
blt 5f
|
||||
|
||||
CALGN( ands ip, r1, #31 )
|
||||
CALGN( rsb r3, ip, #32 )
|
||||
CALGN( sbcnes r4, r3, r2 ) @ C is always set here
|
||||
CALGN( bcs 2f )
|
||||
CALGN( adr r4, 6f )
|
||||
CALGN( subs r2, r2, r3 ) @ C gets set
|
||||
CALGN( add pc, r4, ip )
|
||||
|
||||
PLD( pld [r1, #0] )
|
||||
2: PLD( subs r2, r2, #96 )
|
||||
PLD( pld [r1, #28] )
|
||||
PLD( blt 4f )
|
||||
PLD( pld [r1, #60] )
|
||||
PLD( pld [r1, #92] )
|
||||
|
||||
3: PLD( pld [r1, #124] )
|
||||
4: ldr8w r1, r3, r4, r5, r6, r7, r8, ip, lr, abort=20f
|
||||
subs r2, r2, #32
|
||||
str8w r0, r3, r4, r5, r6, r7, r8, ip, lr, abort=20f
|
||||
bge 3b
|
||||
PLD( cmn r2, #96 )
|
||||
PLD( bge 4b )
|
||||
|
||||
5: ands ip, r2, #28
|
||||
rsb ip, ip, #32
|
||||
addne pc, pc, ip @ C is always clear here
|
||||
b 7f
|
||||
6: nop
|
||||
ldr1w r1, r3, abort=20f
|
||||
ldr1w r1, r4, abort=20f
|
||||
ldr1w r1, r5, abort=20f
|
||||
ldr1w r1, r6, abort=20f
|
||||
ldr1w r1, r7, abort=20f
|
||||
ldr1w r1, r8, abort=20f
|
||||
ldr1w r1, lr, abort=20f
|
||||
|
||||
add pc, pc, ip
|
||||
nop
|
||||
nop
|
||||
str1w r0, r3, abort=20f
|
||||
str1w r0, r4, abort=20f
|
||||
str1w r0, r5, abort=20f
|
||||
str1w r0, r6, abort=20f
|
||||
str1w r0, r7, abort=20f
|
||||
str1w r0, r8, abort=20f
|
||||
str1w r0, lr, abort=20f
|
||||
|
||||
CALGN( bcs 2b )
|
||||
|
||||
7: ldmfd sp!, {r5 - r8}
|
||||
|
||||
8: movs r2, r2, lsl #31
|
||||
ldr1b r1, r3, ne, abort=21f
|
||||
ldr1b r1, r4, cs, abort=21f
|
||||
ldr1b r1, ip, cs, abort=21f
|
||||
str1b r0, r3, ne, abort=21f
|
||||
str1b r0, r4, cs, abort=21f
|
||||
str1b r0, ip, cs, abort=21f
|
||||
|
||||
exit r4, pc
|
||||
|
||||
9: rsb ip, ip, #4
|
||||
cmp ip, #2
|
||||
ldr1b r1, r3, gt, abort=21f
|
||||
ldr1b r1, r4, ge, abort=21f
|
||||
ldr1b r1, lr, abort=21f
|
||||
str1b r0, r3, gt, abort=21f
|
||||
str1b r0, r4, ge, abort=21f
|
||||
subs r2, r2, ip
|
||||
str1b r0, lr, abort=21f
|
||||
blt 8b
|
||||
ands ip, r1, #3
|
||||
beq 1b
|
||||
|
||||
10: bic r1, r1, #3
|
||||
cmp ip, #2
|
||||
ldr1w r1, lr, abort=21f
|
||||
beq 17f
|
||||
bgt 18f
|
||||
|
||||
|
||||
.macro forward_copy_shift pull push
|
||||
|
||||
subs r2, r2, #28
|
||||
blt 14f
|
||||
|
||||
CALGN( ands ip, r1, #31 )
|
||||
CALGN( rsb ip, ip, #32 )
|
||||
CALGN( sbcnes r4, ip, r2 ) @ C is always set here
|
||||
CALGN( subcc r2, r2, ip )
|
||||
CALGN( bcc 15f )
|
||||
|
||||
11: stmfd sp!, {r5 - r9}
|
||||
|
||||
PLD( pld [r1, #0] )
|
||||
PLD( subs r2, r2, #96 )
|
||||
PLD( pld [r1, #28] )
|
||||
PLD( blt 13f )
|
||||
PLD( pld [r1, #60] )
|
||||
PLD( pld [r1, #92] )
|
||||
|
||||
12: PLD( pld [r1, #124] )
|
||||
13: ldr4w r1, r4, r5, r6, r7, abort=19f
|
||||
mov r3, lr, pull #\pull
|
||||
subs r2, r2, #32
|
||||
ldr4w r1, r8, r9, ip, lr, abort=19f
|
||||
orr r3, r3, r4, push #\push
|
||||
mov r4, r4, pull #\pull
|
||||
orr r4, r4, r5, push #\push
|
||||
mov r5, r5, pull #\pull
|
||||
orr r5, r5, r6, push #\push
|
||||
mov r6, r6, pull #\pull
|
||||
orr r6, r6, r7, push #\push
|
||||
mov r7, r7, pull #\pull
|
||||
orr r7, r7, r8, push #\push
|
||||
mov r8, r8, pull #\pull
|
||||
orr r8, r8, r9, push #\push
|
||||
mov r9, r9, pull #\pull
|
||||
orr r9, r9, ip, push #\push
|
||||
mov ip, ip, pull #\pull
|
||||
orr ip, ip, lr, push #\push
|
||||
str8w r0, r3, r4, r5, r6, r7, r8, r9, ip, , abort=19f
|
||||
bge 12b
|
||||
PLD( cmn r2, #96 )
|
||||
PLD( bge 13b )
|
||||
|
||||
ldmfd sp!, {r5 - r9}
|
||||
|
||||
14: ands ip, r2, #28
|
||||
beq 16f
|
||||
|
||||
15: mov r3, lr, pull #\pull
|
||||
ldr1w r1, lr, abort=21f
|
||||
subs ip, ip, #4
|
||||
orr r3, r3, lr, push #\push
|
||||
str1w r0, r3, abort=21f
|
||||
bgt 15b
|
||||
CALGN( cmp r2, #0 )
|
||||
CALGN( bge 11b )
|
||||
|
||||
16: sub r1, r1, #(\push / 8)
|
||||
b 8b
|
||||
|
||||
.endm
|
||||
|
||||
|
||||
forward_copy_shift pull=8 push=24
|
||||
|
||||
17: forward_copy_shift pull=16 push=16
|
||||
|
||||
18: forward_copy_shift pull=24 push=8
|
||||
|
||||
|
||||
/*
|
||||
* Abort preanble and completion macros.
|
||||
* If a fixup handler is required then those macros must surround it.
|
||||
* It is assumed that the fixup code will handle the private part of
|
||||
* the exit macro.
|
||||
*/
|
||||
|
||||
.macro copy_abort_preamble
|
||||
19: ldmfd sp!, {r5 - r9}
|
||||
b 21f
|
||||
20: ldmfd sp!, {r5 - r8}
|
||||
21:
|
||||
.endm
|
||||
|
||||
.macro copy_abort_end
|
||||
ldmfd sp!, {r4, pc}
|
||||
.endm
|
||||
|
101
arch/arm/lib/copy_to_user.S
Normal file
101
arch/arm/lib/copy_to_user.S
Normal file
|
@ -0,0 +1,101 @@
|
|||
/*
|
||||
* linux/arch/arm/lib/copy_to_user.S
|
||||
*
|
||||
* Author: Nicolas Pitre
|
||||
* Created: Sep 29, 2005
|
||||
* Copyright: MontaVista Software, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
/*
|
||||
* Prototype:
|
||||
*
|
||||
* size_t __arch_copy_to_user(void *to, const void *from, size_t n)
|
||||
*
|
||||
* Purpose:
|
||||
*
|
||||
* copy a block to user memory from kernel memory
|
||||
*
|
||||
* Params:
|
||||
*
|
||||
* to = user memory
|
||||
* from = kernel memory
|
||||
* n = number of bytes to copy
|
||||
*
|
||||
* Return value:
|
||||
*
|
||||
* Number of bytes NOT copied.
|
||||
*/
|
||||
|
||||
.macro ldr1w ptr reg abort
|
||||
ldr \reg, [\ptr], #4
|
||||
.endm
|
||||
|
||||
.macro ldr4w ptr reg1 reg2 reg3 reg4 abort
|
||||
ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4}
|
||||
.endm
|
||||
|
||||
.macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
|
||||
ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
|
||||
.endm
|
||||
|
||||
.macro ldr1b ptr reg cond=al abort
|
||||
ldr\cond\()b \reg, [\ptr], #1
|
||||
.endm
|
||||
|
||||
.macro str1w ptr reg abort
|
||||
100: strt \reg, [\ptr], #4
|
||||
.section __ex_table, "a"
|
||||
.long 100b, \abort
|
||||
.previous
|
||||
.endm
|
||||
|
||||
.macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
|
||||
str1w \ptr, \reg1, \abort
|
||||
str1w \ptr, \reg2, \abort
|
||||
str1w \ptr, \reg3, \abort
|
||||
str1w \ptr, \reg4, \abort
|
||||
str1w \ptr, \reg5, \abort
|
||||
str1w \ptr, \reg6, \abort
|
||||
str1w \ptr, \reg7, \abort
|
||||
str1w \ptr, \reg8, \abort
|
||||
.endm
|
||||
|
||||
.macro str1b ptr reg cond=al abort
|
||||
100: str\cond\()bt \reg, [\ptr], #1
|
||||
.section __ex_table, "a"
|
||||
.long 100b, \abort
|
||||
.previous
|
||||
.endm
|
||||
|
||||
.macro enter reg1 reg2
|
||||
mov r3, #0
|
||||
stmdb sp!, {r0, r2, r3, \reg1, \reg2}
|
||||
.endm
|
||||
|
||||
.macro exit reg1 reg2
|
||||
add sp, sp, #8
|
||||
ldmfd sp!, {r0, \reg1, \reg2}
|
||||
.endm
|
||||
|
||||
.text
|
||||
|
||||
ENTRY(__arch_copy_to_user)
|
||||
|
||||
#include "copy_template.S"
|
||||
|
||||
.section .fixup,"ax"
|
||||
.align 0
|
||||
copy_abort_preamble
|
||||
ldmfd sp!, {r1, r2, r3}
|
||||
sub r0, r0, r1
|
||||
rsb r0, r0, r2
|
||||
copy_abort_end
|
||||
.previous
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
/* gcclib.h -- definitions for various functions 'borrowed' from gcc-2.95.3 */
|
||||
/* I Molton 29/07/01 */
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define BITS_PER_UNIT 8
|
||||
#define SI_TYPE_SIZE (sizeof(s32) * BITS_PER_UNIT)
|
||||
|
||||
#ifdef __ARMEB__
|
||||
struct DIstruct {
|
||||
s32 high, low;
|
||||
};
|
||||
#else
|
||||
struct DIstruct {
|
||||
s32 low, high;
|
||||
};
|
||||
#endif
|
||||
|
||||
typedef union {
|
||||
struct DIstruct s;
|
||||
s64 ll;
|
||||
} DIunion;
|
48
arch/arm/lib/lshrdi3.S
Normal file
48
arch/arm/lib/lshrdi3.S
Normal file
|
@ -0,0 +1,48 @@
|
|||
/* Copyright 1995, 1996, 1998, 1999, 2000, 2003, 2004, 2005
|
||||
Free Software Foundation, Inc.
|
||||
|
||||
This file is free software; you can redistribute it and/or modify it
|
||||
under the terms of the GNU General Public License as published by the
|
||||
Free Software Foundation; either version 2, or (at your option) any
|
||||
later version.
|
||||
|
||||
In addition to the permissions in the GNU General Public License, the
|
||||
Free Software Foundation gives you unlimited permission to link the
|
||||
compiled version of this file into combinations with other programs,
|
||||
and to distribute those combinations without any restriction coming
|
||||
from the use of this file. (The General Public License restrictions
|
||||
do apply in other respects; for example, they cover modification of
|
||||
the file, and distribution when not linked into a combine
|
||||
executable.)
|
||||
|
||||
This file is distributed in the hope that it will be useful, but
|
||||
WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||
General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with this program; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 51 Franklin Street, Fifth Floor,
|
||||
Boston, MA 02110-1301, USA. */
|
||||
|
||||
|
||||
#include <linux/linkage.h>
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define al r1
|
||||
#define ah r0
|
||||
#else
|
||||
#define al r0
|
||||
#define ah r1
|
||||
#endif
|
||||
|
||||
ENTRY(__lshrdi3)
|
||||
|
||||
subs r3, r2, #32
|
||||
rsb ip, r2, #32
|
||||
movmi al, al, lsr r2
|
||||
movpl al, ah, lsr r3
|
||||
orrmi al, al, ah, lsl ip
|
||||
mov ah, ah, lsr r2
|
||||
mov pc, lr
|
||||
|
|
@ -1,56 +0,0 @@
|
|||
/* More subroutines needed by GCC output code on some machines. */
|
||||
/* Compile this one with gcc. */
|
||||
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
||||
GNU CC is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU CC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU CC; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* As a special exception, if you link this library with other files,
|
||||
some of which are compiled with GCC, to produce an executable,
|
||||
this library does not by itself cause the resulting executable
|
||||
to be covered by the GNU General Public License.
|
||||
This exception does not however invalidate any other reasons why
|
||||
the executable file might be covered by the GNU General Public License.
|
||||
*/
|
||||
/* support functions required by the kernel. based on code from gcc-2.95.3 */
|
||||
/* I Molton 29/07/01 */
|
||||
|
||||
#include "gcclib.h"
|
||||
|
||||
s64 __lshrdi3(s64 u, int b)
|
||||
{
|
||||
DIunion w;
|
||||
int bm;
|
||||
DIunion uu;
|
||||
|
||||
if (b == 0)
|
||||
return u;
|
||||
|
||||
uu.ll = u;
|
||||
|
||||
bm = (sizeof(s32) * BITS_PER_UNIT) - b;
|
||||
if (bm <= 0) {
|
||||
w.s.high = 0;
|
||||
w.s.low = (u32) uu.s.high >> -bm;
|
||||
} else {
|
||||
u32 carries = (u32) uu.s.high << bm;
|
||||
w.s.high = (u32) uu.s.high >> b;
|
||||
w.s.low = ((u32) uu.s.low >> b) | carries;
|
||||
}
|
||||
|
||||
return w.ll;
|
||||
}
|
|
@ -1,393 +1,59 @@
|
|||
/*
|
||||
* linux/arch/arm/lib/memcpy.S
|
||||
*
|
||||
* Copyright (C) 1995-1999 Russell King
|
||||
* Author: Nicolas Pitre
|
||||
* Created: Sep 28, 2005
|
||||
* Copyright: MontaVista Software, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*
|
||||
* ASM optimised string functions
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
.text
|
||||
.macro ldr1w ptr reg abort
|
||||
ldr \reg, [\ptr], #4
|
||||
.endm
|
||||
|
||||
#define ENTER \
|
||||
mov ip,sp ;\
|
||||
stmfd sp!,{r0,r4-r9,fp,ip,lr,pc} ;\
|
||||
sub fp,ip,#4
|
||||
.macro ldr4w ptr reg1 reg2 reg3 reg4 abort
|
||||
ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4}
|
||||
.endm
|
||||
|
||||
#define EXIT \
|
||||
LOADREGS(ea, fp, {r0, r4 - r9, fp, sp, pc})
|
||||
.macro ldr8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
|
||||
ldmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
|
||||
.endm
|
||||
|
||||
#define EXITEQ \
|
||||
LOADREGS(eqea, fp, {r0, r4 - r9, fp, sp, pc})
|
||||
.macro ldr1b ptr reg cond=al abort
|
||||
ldr\cond\()b \reg, [\ptr], #1
|
||||
.endm
|
||||
|
||||
.macro str1w ptr reg abort
|
||||
str \reg, [\ptr], #4
|
||||
.endm
|
||||
|
||||
.macro str8w ptr reg1 reg2 reg3 reg4 reg5 reg6 reg7 reg8 abort
|
||||
stmia \ptr!, {\reg1, \reg2, \reg3, \reg4, \reg5, \reg6, \reg7, \reg8}
|
||||
.endm
|
||||
|
||||
.macro str1b ptr reg cond=al abort
|
||||
str\cond\()b \reg, [\ptr], #1
|
||||
.endm
|
||||
|
||||
.macro enter reg1 reg2
|
||||
stmdb sp!, {r0, \reg1, \reg2}
|
||||
.endm
|
||||
|
||||
.macro exit reg1 reg2
|
||||
ldmfd sp!, {r0, \reg1, \reg2}
|
||||
.endm
|
||||
|
||||
.text
|
||||
|
||||
/* Prototype: void *memcpy(void *dest, const void *src, size_t n); */
|
||||
|
||||
/*
|
||||
* Prototype: void memcpy(void *to,const void *from,unsigned long n);
|
||||
*/
|
||||
ENTRY(memcpy)
|
||||
ENTRY(memmove)
|
||||
ENTER
|
||||
cmp r1, r0
|
||||
bcc 23f
|
||||
subs r2, r2, #4
|
||||
blt 6f
|
||||
PLD( pld [r1, #0] )
|
||||
ands ip, r0, #3
|
||||
bne 7f
|
||||
ands ip, r1, #3
|
||||
bne 8f
|
||||
|
||||
1: subs r2, r2, #8
|
||||
blt 5f
|
||||
subs r2, r2, #20
|
||||
blt 4f
|
||||
PLD( pld [r1, #28] )
|
||||
PLD( subs r2, r2, #64 )
|
||||
PLD( blt 3f )
|
||||
2: PLD( pld [r1, #60] )
|
||||
PLD( pld [r1, #92] )
|
||||
ldmia r1!, {r3 - r9, ip}
|
||||
subs r2, r2, #32
|
||||
stmgeia r0!, {r3 - r9, ip}
|
||||
ldmgeia r1!, {r3 - r9, ip}
|
||||
subges r2, r2, #32
|
||||
stmia r0!, {r3 - r9, ip}
|
||||
bge 2b
|
||||
3: PLD( ldmia r1!, {r3 - r9, ip} )
|
||||
PLD( adds r2, r2, #32 )
|
||||
PLD( stmgeia r0!, {r3 - r9, ip} )
|
||||
PLD( ldmgeia r1!, {r3 - r9, ip} )
|
||||
PLD( subges r2, r2, #32 )
|
||||
PLD( stmia r0!, {r3 - r9, ip} )
|
||||
4: cmn r2, #16
|
||||
ldmgeia r1!, {r3 - r6}
|
||||
subge r2, r2, #16
|
||||
stmgeia r0!, {r3 - r6}
|
||||
adds r2, r2, #20
|
||||
ldmgeia r1!, {r3 - r5}
|
||||
subge r2, r2, #12
|
||||
stmgeia r0!, {r3 - r5}
|
||||
5: adds r2, r2, #8
|
||||
blt 6f
|
||||
subs r2, r2, #4
|
||||
ldrlt r3, [r1], #4
|
||||
ldmgeia r1!, {r4, r5}
|
||||
subge r2, r2, #4
|
||||
strlt r3, [r0], #4
|
||||
stmgeia r0!, {r4, r5}
|
||||
|
||||
6: adds r2, r2, #4
|
||||
EXITEQ
|
||||
cmp r2, #2
|
||||
ldrb r3, [r1], #1
|
||||
ldrgeb r4, [r1], #1
|
||||
ldrgtb r5, [r1], #1
|
||||
strb r3, [r0], #1
|
||||
strgeb r4, [r0], #1
|
||||
strgtb r5, [r0], #1
|
||||
EXIT
|
||||
|
||||
7: rsb ip, ip, #4
|
||||
cmp ip, #2
|
||||
ldrb r3, [r1], #1
|
||||
ldrgeb r4, [r1], #1
|
||||
ldrgtb r5, [r1], #1
|
||||
strb r3, [r0], #1
|
||||
strgeb r4, [r0], #1
|
||||
strgtb r5, [r0], #1
|
||||
subs r2, r2, ip
|
||||
blt 6b
|
||||
ands ip, r1, #3
|
||||
beq 1b
|
||||
|
||||
8: bic r1, r1, #3
|
||||
ldr r7, [r1], #4
|
||||
cmp ip, #2
|
||||
bgt 18f
|
||||
beq 13f
|
||||
cmp r2, #12
|
||||
blt 11f
|
||||
PLD( pld [r1, #12] )
|
||||
sub r2, r2, #12
|
||||
PLD( subs r2, r2, #32 )
|
||||
PLD( blt 10f )
|
||||
PLD( pld [r1, #28] )
|
||||
9: PLD( pld [r1, #44] )
|
||||
10: mov r3, r7, pull #8
|
||||
ldmia r1!, {r4 - r7}
|
||||
subs r2, r2, #16
|
||||
orr r3, r3, r4, push #24
|
||||
mov r4, r4, pull #8
|
||||
orr r4, r4, r5, push #24
|
||||
mov r5, r5, pull #8
|
||||
orr r5, r5, r6, push #24
|
||||
mov r6, r6, pull #8
|
||||
orr r6, r6, r7, push #24
|
||||
stmia r0!, {r3 - r6}
|
||||
bge 9b
|
||||
PLD( cmn r2, #32 )
|
||||
PLD( bge 10b )
|
||||
PLD( add r2, r2, #32 )
|
||||
adds r2, r2, #12
|
||||
blt 12f
|
||||
11: mov r3, r7, pull #8
|
||||
ldr r7, [r1], #4
|
||||
subs r2, r2, #4
|
||||
orr r3, r3, r7, push #24
|
||||
str r3, [r0], #4
|
||||
bge 11b
|
||||
12: sub r1, r1, #3
|
||||
b 6b
|
||||
|
||||
13: cmp r2, #12
|
||||
blt 16f
|
||||
PLD( pld [r1, #12] )
|
||||
sub r2, r2, #12
|
||||
PLD( subs r2, r2, #32 )
|
||||
PLD( blt 15f )
|
||||
PLD( pld [r1, #28] )
|
||||
14: PLD( pld [r1, #44] )
|
||||
15: mov r3, r7, pull #16
|
||||
ldmia r1!, {r4 - r7}
|
||||
subs r2, r2, #16
|
||||
orr r3, r3, r4, push #16
|
||||
mov r4, r4, pull #16
|
||||
orr r4, r4, r5, push #16
|
||||
mov r5, r5, pull #16
|
||||
orr r5, r5, r6, push #16
|
||||
mov r6, r6, pull #16
|
||||
orr r6, r6, r7, push #16
|
||||
stmia r0!, {r3 - r6}
|
||||
bge 14b
|
||||
PLD( cmn r2, #32 )
|
||||
PLD( bge 15b )
|
||||
PLD( add r2, r2, #32 )
|
||||
adds r2, r2, #12
|
||||
blt 17f
|
||||
16: mov r3, r7, pull #16
|
||||
ldr r7, [r1], #4
|
||||
subs r2, r2, #4
|
||||
orr r3, r3, r7, push #16
|
||||
str r3, [r0], #4
|
||||
bge 16b
|
||||
17: sub r1, r1, #2
|
||||
b 6b
|
||||
|
||||
18: cmp r2, #12
|
||||
blt 21f
|
||||
PLD( pld [r1, #12] )
|
||||
sub r2, r2, #12
|
||||
PLD( subs r2, r2, #32 )
|
||||
PLD( blt 20f )
|
||||
PLD( pld [r1, #28] )
|
||||
19: PLD( pld [r1, #44] )
|
||||
20: mov r3, r7, pull #24
|
||||
ldmia r1!, {r4 - r7}
|
||||
subs r2, r2, #16
|
||||
orr r3, r3, r4, push #8
|
||||
mov r4, r4, pull #24
|
||||
orr r4, r4, r5, push #8
|
||||
mov r5, r5, pull #24
|
||||
orr r5, r5, r6, push #8
|
||||
mov r6, r6, pull #24
|
||||
orr r6, r6, r7, push #8
|
||||
stmia r0!, {r3 - r6}
|
||||
bge 19b
|
||||
PLD( cmn r2, #32 )
|
||||
PLD( bge 20b )
|
||||
PLD( add r2, r2, #32 )
|
||||
adds r2, r2, #12
|
||||
blt 22f
|
||||
21: mov r3, r7, pull #24
|
||||
ldr r7, [r1], #4
|
||||
subs r2, r2, #4
|
||||
orr r3, r3, r7, push #8
|
||||
str r3, [r0], #4
|
||||
bge 21b
|
||||
22: sub r1, r1, #1
|
||||
b 6b
|
||||
|
||||
|
||||
23: add r1, r1, r2
|
||||
add r0, r0, r2
|
||||
subs r2, r2, #4
|
||||
blt 29f
|
||||
PLD( pld [r1, #-4] )
|
||||
ands ip, r0, #3
|
||||
bne 30f
|
||||
ands ip, r1, #3
|
||||
bne 31f
|
||||
|
||||
24: subs r2, r2, #8
|
||||
blt 28f
|
||||
subs r2, r2, #20
|
||||
blt 27f
|
||||
PLD( pld [r1, #-32] )
|
||||
PLD( subs r2, r2, #64 )
|
||||
PLD( blt 26f )
|
||||
25: PLD( pld [r1, #-64] )
|
||||
PLD( pld [r1, #-96] )
|
||||
ldmdb r1!, {r3 - r9, ip}
|
||||
subs r2, r2, #32
|
||||
stmgedb r0!, {r3 - r9, ip}
|
||||
ldmgedb r1!, {r3 - r9, ip}
|
||||
subges r2, r2, #32
|
||||
stmdb r0!, {r3 - r9, ip}
|
||||
bge 25b
|
||||
26: PLD( ldmdb r1!, {r3 - r9, ip} )
|
||||
PLD( adds r2, r2, #32 )
|
||||
PLD( stmgedb r0!, {r3 - r9, ip} )
|
||||
PLD( ldmgedb r1!, {r3 - r9, ip} )
|
||||
PLD( subges r2, r2, #32 )
|
||||
PLD( stmdb r0!, {r3 - r9, ip} )
|
||||
27: cmn r2, #16
|
||||
ldmgedb r1!, {r3 - r6}
|
||||
subge r2, r2, #16
|
||||
stmgedb r0!, {r3 - r6}
|
||||
adds r2, r2, #20
|
||||
ldmgedb r1!, {r3 - r5}
|
||||
subge r2, r2, #12
|
||||
stmgedb r0!, {r3 - r5}
|
||||
28: adds r2, r2, #8
|
||||
blt 29f
|
||||
subs r2, r2, #4
|
||||
ldrlt r3, [r1, #-4]!
|
||||
ldmgedb r1!, {r4, r5}
|
||||
subge r2, r2, #4
|
||||
strlt r3, [r0, #-4]!
|
||||
stmgedb r0!, {r4, r5}
|
||||
|
||||
29: adds r2, r2, #4
|
||||
EXITEQ
|
||||
cmp r2, #2
|
||||
ldrb r3, [r1, #-1]!
|
||||
ldrgeb r4, [r1, #-1]!
|
||||
ldrgtb r5, [r1, #-1]!
|
||||
strb r3, [r0, #-1]!
|
||||
strgeb r4, [r0, #-1]!
|
||||
strgtb r5, [r0, #-1]!
|
||||
EXIT
|
||||
|
||||
30: cmp ip, #2
|
||||
ldrb r3, [r1, #-1]!
|
||||
ldrgeb r4, [r1, #-1]!
|
||||
ldrgtb r5, [r1, #-1]!
|
||||
strb r3, [r0, #-1]!
|
||||
strgeb r4, [r0, #-1]!
|
||||
strgtb r5, [r0, #-1]!
|
||||
subs r2, r2, ip
|
||||
blt 29b
|
||||
ands ip, r1, #3
|
||||
beq 24b
|
||||
|
||||
31: bic r1, r1, #3
|
||||
ldr r3, [r1], #0
|
||||
cmp ip, #2
|
||||
blt 41f
|
||||
beq 36f
|
||||
cmp r2, #12
|
||||
blt 34f
|
||||
PLD( pld [r1, #-16] )
|
||||
sub r2, r2, #12
|
||||
PLD( subs r2, r2, #32 )
|
||||
PLD( blt 33f )
|
||||
PLD( pld [r1, #-32] )
|
||||
32: PLD( pld [r1, #-48] )
|
||||
33: mov r7, r3, push #8
|
||||
ldmdb r1!, {r3, r4, r5, r6}
|
||||
subs r2, r2, #16
|
||||
orr r7, r7, r6, pull #24
|
||||
mov r6, r6, push #8
|
||||
orr r6, r6, r5, pull #24
|
||||
mov r5, r5, push #8
|
||||
orr r5, r5, r4, pull #24
|
||||
mov r4, r4, push #8
|
||||
orr r4, r4, r3, pull #24
|
||||
stmdb r0!, {r4, r5, r6, r7}
|
||||
bge 32b
|
||||
PLD( cmn r2, #32 )
|
||||
PLD( bge 33b )
|
||||
PLD( add r2, r2, #32 )
|
||||
adds r2, r2, #12
|
||||
blt 35f
|
||||
34: mov ip, r3, push #8
|
||||
ldr r3, [r1, #-4]!
|
||||
subs r2, r2, #4
|
||||
orr ip, ip, r3, pull #24
|
||||
str ip, [r0, #-4]!
|
||||
bge 34b
|
||||
35: add r1, r1, #3
|
||||
b 29b
|
||||
|
||||
36: cmp r2, #12
|
||||
blt 39f
|
||||
PLD( pld [r1, #-16] )
|
||||
sub r2, r2, #12
|
||||
PLD( subs r2, r2, #32 )
|
||||
PLD( blt 38f )
|
||||
PLD( pld [r1, #-32] )
|
||||
37: PLD( pld [r1, #-48] )
|
||||
38: mov r7, r3, push #16
|
||||
ldmdb r1!, {r3, r4, r5, r6}
|
||||
subs r2, r2, #16
|
||||
orr r7, r7, r6, pull #16
|
||||
mov r6, r6, push #16
|
||||
orr r6, r6, r5, pull #16
|
||||
mov r5, r5, push #16
|
||||
orr r5, r5, r4, pull #16
|
||||
mov r4, r4, push #16
|
||||
orr r4, r4, r3, pull #16
|
||||
stmdb r0!, {r4, r5, r6, r7}
|
||||
bge 37b
|
||||
PLD( cmn r2, #32 )
|
||||
PLD( bge 38b )
|
||||
PLD( add r2, r2, #32 )
|
||||
adds r2, r2, #12
|
||||
blt 40f
|
||||
39: mov ip, r3, push #16
|
||||
ldr r3, [r1, #-4]!
|
||||
subs r2, r2, #4
|
||||
orr ip, ip, r3, pull #16
|
||||
str ip, [r0, #-4]!
|
||||
bge 39b
|
||||
40: add r1, r1, #2
|
||||
b 29b
|
||||
|
||||
41: cmp r2, #12
|
||||
blt 44f
|
||||
PLD( pld [r1, #-16] )
|
||||
sub r2, r2, #12
|
||||
PLD( subs r2, r2, #32 )
|
||||
PLD( blt 43f )
|
||||
PLD( pld [r1, #-32] )
|
||||
42: PLD( pld [r1, #-48] )
|
||||
43: mov r7, r3, push #24
|
||||
ldmdb r1!, {r3, r4, r5, r6}
|
||||
subs r2, r2, #16
|
||||
orr r7, r7, r6, pull #8
|
||||
mov r6, r6, push #24
|
||||
orr r6, r6, r5, pull #8
|
||||
mov r5, r5, push #24
|
||||
orr r5, r5, r4, pull #8
|
||||
mov r4, r4, push #24
|
||||
orr r4, r4, r3, pull #8
|
||||
stmdb r0!, {r4, r5, r6, r7}
|
||||
bge 42b
|
||||
PLD( cmn r2, #32 )
|
||||
PLD( bge 43b )
|
||||
PLD( add r2, r2, #32 )
|
||||
adds r2, r2, #12
|
||||
blt 45f
|
||||
44: mov ip, r3, push #24
|
||||
ldr r3, [r1, #-4]!
|
||||
subs r2, r2, #4
|
||||
orr ip, ip, r3, pull #8
|
||||
str ip, [r0, #-4]!
|
||||
bge 44b
|
||||
45: add r1, r1, #1
|
||||
b 29b
|
||||
#include "copy_template.S"
|
||||
|
||||
|
|
206
arch/arm/lib/memmove.S
Normal file
206
arch/arm/lib/memmove.S
Normal file
|
@ -0,0 +1,206 @@
|
|||
/*
|
||||
* linux/arch/arm/lib/memmove.S
|
||||
*
|
||||
* Author: Nicolas Pitre
|
||||
* Created: Sep 28, 2005
|
||||
* Copyright: (C) MontaVista Software Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
#include <asm/assembler.h>
|
||||
|
||||
/*
|
||||
* This can be used to enable code to cacheline align the source pointer.
|
||||
* Experiments on tested architectures (StrongARM and XScale) didn't show
|
||||
* this a worthwhile thing to do. That might be different in the future.
|
||||
*/
|
||||
//#define CALGN(code...) code
|
||||
#define CALGN(code...)
|
||||
|
||||
.text
|
||||
|
||||
/*
|
||||
* Prototype: void *memmove(void *dest, const void *src, size_t n);
|
||||
*
|
||||
* Note:
|
||||
*
|
||||
* If the memory regions don't overlap, we simply branch to memcpy which is
|
||||
* normally a bit faster. Otherwise the copy is done going downwards. This
|
||||
* is a transposition of the code from copy_template.S but with the copy
|
||||
* occurring in the opposite direction.
|
||||
*/
|
||||
|
||||
ENTRY(memmove)
|
||||
|
||||
subs ip, r0, r1
|
||||
cmphi r2, ip
|
||||
bls memcpy
|
||||
|
||||
stmfd sp!, {r0, r4, lr}
|
||||
add r1, r1, r2
|
||||
add r0, r0, r2
|
||||
subs r2, r2, #4
|
||||
blt 8f
|
||||
ands ip, r0, #3
|
||||
PLD( pld [r1, #-4] )
|
||||
bne 9f
|
||||
ands ip, r1, #3
|
||||
bne 10f
|
||||
|
||||
1: subs r2, r2, #(28)
|
||||
stmfd sp!, {r5 - r8}
|
||||
blt 5f
|
||||
|
||||
CALGN( ands ip, r1, #31 )
|
||||
CALGN( sbcnes r4, ip, r2 ) @ C is always set here
|
||||
CALGN( bcs 2f )
|
||||
CALGN( adr r4, 6f )
|
||||
CALGN( subs r2, r2, ip ) @ C is set here
|
||||
CALGN( add pc, r4, ip )
|
||||
|
||||
PLD( pld [r1, #-4] )
|
||||
2: PLD( subs r2, r2, #96 )
|
||||
PLD( pld [r1, #-32] )
|
||||
PLD( blt 4f )
|
||||
PLD( pld [r1, #-64] )
|
||||
PLD( pld [r1, #-96] )
|
||||
|
||||
3: PLD( pld [r1, #-128] )
|
||||
4: ldmdb r1!, {r3, r4, r5, r6, r7, r8, ip, lr}
|
||||
subs r2, r2, #32
|
||||
stmdb r0!, {r3, r4, r5, r6, r7, r8, ip, lr}
|
||||
bge 3b
|
||||
PLD( cmn r2, #96 )
|
||||
PLD( bge 4b )
|
||||
|
||||
5: ands ip, r2, #28
|
||||
rsb ip, ip, #32
|
||||
addne pc, pc, ip @ C is always clear here
|
||||
b 7f
|
||||
6: nop
|
||||
ldr r3, [r1, #-4]!
|
||||
ldr r4, [r1, #-4]!
|
||||
ldr r5, [r1, #-4]!
|
||||
ldr r6, [r1, #-4]!
|
||||
ldr r7, [r1, #-4]!
|
||||
ldr r8, [r1, #-4]!
|
||||
ldr lr, [r1, #-4]!
|
||||
|
||||
add pc, pc, ip
|
||||
nop
|
||||
nop
|
||||
str r3, [r0, #-4]!
|
||||
str r4, [r0, #-4]!
|
||||
str r5, [r0, #-4]!
|
||||
str r6, [r0, #-4]!
|
||||
str r7, [r0, #-4]!
|
||||
str r8, [r0, #-4]!
|
||||
str lr, [r0, #-4]!
|
||||
|
||||
CALGN( bcs 2b )
|
||||
|
||||
7: ldmfd sp!, {r5 - r8}
|
||||
|
||||
8: movs r2, r2, lsl #31
|
||||
ldrneb r3, [r1, #-1]!
|
||||
ldrcsb r4, [r1, #-1]!
|
||||
ldrcsb ip, [r1, #-1]
|
||||
strneb r3, [r0, #-1]!
|
||||
strcsb r4, [r0, #-1]!
|
||||
strcsb ip, [r0, #-1]
|
||||
ldmfd sp!, {r0, r4, pc}
|
||||
|
||||
9: cmp ip, #2
|
||||
ldrgtb r3, [r1, #-1]!
|
||||
ldrgeb r4, [r1, #-1]!
|
||||
ldrb lr, [r1, #-1]!
|
||||
strgtb r3, [r0, #-1]!
|
||||
strgeb r4, [r0, #-1]!
|
||||
subs r2, r2, ip
|
||||
strb lr, [r0, #-1]!
|
||||
blt 8b
|
||||
ands ip, r1, #3
|
||||
beq 1b
|
||||
|
||||
10: bic r1, r1, #3
|
||||
cmp ip, #2
|
||||
ldr r3, [r1, #0]
|
||||
beq 17f
|
||||
blt 18f
|
||||
|
||||
|
||||
.macro backward_copy_shift push pull
|
||||
|
||||
subs r2, r2, #28
|
||||
blt 14f
|
||||
|
||||
CALGN( ands ip, r1, #31 )
|
||||
CALGN( rsb ip, ip, #32 )
|
||||
CALGN( sbcnes r4, ip, r2 ) @ C is always set here
|
||||
CALGN( subcc r2, r2, ip )
|
||||
CALGN( bcc 15f )
|
||||
|
||||
11: stmfd sp!, {r5 - r9}
|
||||
|
||||
PLD( pld [r1, #-4] )
|
||||
PLD( subs r2, r2, #96 )
|
||||
PLD( pld [r1, #-32] )
|
||||
PLD( blt 13f )
|
||||
PLD( pld [r1, #-64] )
|
||||
PLD( pld [r1, #-96] )
|
||||
|
||||
12: PLD( pld [r1, #-128] )
|
||||
13: ldmdb r1!, {r7, r8, r9, ip}
|
||||
mov lr, r3, push #\push
|
||||
subs r2, r2, #32
|
||||
ldmdb r1!, {r3, r4, r5, r6}
|
||||
orr lr, lr, ip, pull #\pull
|
||||
mov ip, ip, push #\push
|
||||
orr ip, ip, r9, pull #\pull
|
||||
mov r9, r9, push #\push
|
||||
orr r9, r9, r8, pull #\pull
|
||||
mov r8, r8, push #\push
|
||||
orr r8, r8, r7, pull #\pull
|
||||
mov r7, r7, push #\push
|
||||
orr r7, r7, r6, pull #\pull
|
||||
mov r6, r6, push #\push
|
||||
orr r6, r6, r5, pull #\pull
|
||||
mov r5, r5, push #\push
|
||||
orr r5, r5, r4, pull #\pull
|
||||
mov r4, r4, push #\push
|
||||
orr r4, r4, r3, pull #\pull
|
||||
stmdb r0!, {r4 - r9, ip, lr}
|
||||
bge 12b
|
||||
PLD( cmn r2, #96 )
|
||||
PLD( bge 13b )
|
||||
|
||||
ldmfd sp!, {r5 - r9}
|
||||
|
||||
14: ands ip, r2, #28
|
||||
beq 16f
|
||||
|
||||
15: mov lr, r3, push #\push
|
||||
ldr r3, [r1, #-4]!
|
||||
subs ip, ip, #4
|
||||
orr lr, lr, r3, pull #\pull
|
||||
str lr, [r0, #-4]!
|
||||
bgt 15b
|
||||
CALGN( cmp r2, #0 )
|
||||
CALGN( bge 11b )
|
||||
|
||||
16: add r1, r1, #(\pull / 8)
|
||||
b 8b
|
||||
|
||||
.endm
|
||||
|
||||
|
||||
backward_copy_shift push=8 pull=24
|
||||
|
||||
17: backward_copy_shift push=16 pull=16
|
||||
|
||||
18: backward_copy_shift push=24 pull=8
|
||||
|
44
arch/arm/lib/muldi3.S
Normal file
44
arch/arm/lib/muldi3.S
Normal file
|
@ -0,0 +1,44 @@
|
|||
/*
|
||||
* linux/arch/arm/lib/muldi3.S
|
||||
*
|
||||
* Author: Nicolas Pitre
|
||||
* Created: Oct 19, 2005
|
||||
* Copyright: Monta Vista Software, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define xh r0
|
||||
#define xl r1
|
||||
#define yh r2
|
||||
#define yl r3
|
||||
#else
|
||||
#define xl r0
|
||||
#define xh r1
|
||||
#define yl r2
|
||||
#define yh r3
|
||||
#endif
|
||||
|
||||
ENTRY(__muldi3)
|
||||
|
||||
mul xh, yl, xh
|
||||
mla xh, xl, yh, xh
|
||||
mov ip, xl, asr #16
|
||||
mov yh, yl, asr #16
|
||||
bic xl, xl, ip, lsl #16
|
||||
bic yl, yl, yh, lsl #16
|
||||
mla xh, yh, ip, xh
|
||||
mul yh, xl, yh
|
||||
mul xl, yl, xl
|
||||
mul ip, yl, ip
|
||||
adds xl, xl, yh, lsl #16
|
||||
adc xh, xh, yh, lsr #16
|
||||
adds xl, xl, ip, lsl #16
|
||||
adc xh, xh, ip, lsr #16
|
||||
mov pc, lr
|
||||
|
|
@ -1,72 +0,0 @@
|
|||
/* More subroutines needed by GCC output code on some machines. */
|
||||
/* Compile this one with gcc. */
|
||||
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
||||
GNU CC is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU CC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU CC; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* As a special exception, if you link this library with other files,
|
||||
some of which are compiled with GCC, to produce an executable,
|
||||
this library does not by itself cause the resulting executable
|
||||
to be covered by the GNU General Public License.
|
||||
This exception does not however invalidate any other reasons why
|
||||
the executable file might be covered by the GNU General Public License.
|
||||
*/
|
||||
/* support functions required by the kernel. based on code from gcc-2.95.3 */
|
||||
/* I Molton 29/07/01 */
|
||||
|
||||
#include "gcclib.h"
|
||||
|
||||
#define umul_ppmm(xh, xl, a, b) \
|
||||
{register u32 __t0, __t1, __t2; \
|
||||
__asm__ ("%@ Inlined umul_ppmm \n\
|
||||
mov %2, %5, lsr #16 \n\
|
||||
mov %0, %6, lsr #16 \n\
|
||||
bic %3, %5, %2, lsl #16 \n\
|
||||
bic %4, %6, %0, lsl #16 \n\
|
||||
mul %1, %3, %4 \n\
|
||||
mul %4, %2, %4 \n\
|
||||
mul %3, %0, %3 \n\
|
||||
mul %0, %2, %0 \n\
|
||||
adds %3, %4, %3 \n\
|
||||
addcs %0, %0, #65536 \n\
|
||||
adds %1, %1, %3, lsl #16 \n\
|
||||
adc %0, %0, %3, lsr #16" \
|
||||
: "=&r" ((u32) (xh)), \
|
||||
"=r" ((u32) (xl)), \
|
||||
"=&r" (__t0), "=&r" (__t1), "=r" (__t2) \
|
||||
: "r" ((u32) (a)), \
|
||||
"r" ((u32) (b)));}
|
||||
|
||||
#define __umulsidi3(u, v) \
|
||||
({DIunion __w; \
|
||||
umul_ppmm (__w.s.high, __w.s.low, u, v); \
|
||||
__w.ll; })
|
||||
|
||||
s64 __muldi3(s64 u, s64 v)
|
||||
{
|
||||
DIunion w;
|
||||
DIunion uu, vv;
|
||||
|
||||
uu.ll = u, vv.ll = v;
|
||||
|
||||
w.ll = __umulsidi3(uu.s.low, vv.s.low);
|
||||
w.s.high += ((u32) uu.s.low * (u32) vv.s.high
|
||||
+ (u32) uu.s.high * (u32) vv.s.low);
|
||||
|
||||
return w.ll;
|
||||
}
|
|
@ -43,8 +43,6 @@ ENTRY(__arch_copy_to_user)
|
|||
stmfd sp!, {r2, r4 - r7, lr}
|
||||
cmp r2, #4
|
||||
blt .c2u_not_enough
|
||||
PLD( pld [r1, #0] )
|
||||
PLD( pld [r0, #0] )
|
||||
ands ip, r0, #3
|
||||
bne .c2u_dest_not_aligned
|
||||
.c2u_dest_aligned:
|
||||
|
@ -73,25 +71,13 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
sub r2, r2, ip
|
||||
subs ip, ip, #32
|
||||
blt .c2u_0rem8lp
|
||||
PLD( pld [r1, #28] )
|
||||
PLD( pld [r0, #28] )
|
||||
PLD( subs ip, ip, #64 )
|
||||
PLD( blt .c2u_0cpynopld )
|
||||
PLD( pld [r1, #60] )
|
||||
PLD( pld [r0, #60] )
|
||||
|
||||
.c2u_0cpy8lp:
|
||||
PLD( pld [r1, #92] )
|
||||
PLD( pld [r0, #92] )
|
||||
.c2u_0cpynopld: ldmia r1!, {r3 - r6}
|
||||
.c2u_0cpy8lp: ldmia r1!, {r3 - r6}
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
ldmia r1!, {r3 - r6}
|
||||
subs ip, ip, #32
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
bpl .c2u_0cpy8lp
|
||||
PLD( cmn ip, #64 )
|
||||
PLD( bge .c2u_0cpynopld )
|
||||
PLD( add ip, ip, #64 )
|
||||
|
||||
.c2u_0rem8lp: cmn ip, #16
|
||||
ldmgeia r1!, {r3 - r6}
|
||||
|
@ -143,17 +129,8 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .c2u_1rem8lp
|
||||
PLD( pld [r1, #12] )
|
||||
PLD( pld [r0, #12] )
|
||||
PLD( subs ip, ip, #32 )
|
||||
PLD( blt .c2u_1cpynopld )
|
||||
PLD( pld [r1, #28] )
|
||||
PLD( pld [r0, #28] )
|
||||
|
||||
.c2u_1cpy8lp:
|
||||
PLD( pld [r1, #44] )
|
||||
PLD( pld [r0, #44] )
|
||||
.c2u_1cpynopld: mov r3, r7, pull #8
|
||||
.c2u_1cpy8lp: mov r3, r7, pull #8
|
||||
ldmia r1!, {r4 - r7}
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #24
|
||||
|
@ -165,9 +142,6 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
orr r6, r6, r7, push #24
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
bpl .c2u_1cpy8lp
|
||||
PLD( cmn ip, #32 )
|
||||
PLD( bge .c2u_1cpynopld )
|
||||
PLD( add ip, ip, #32 )
|
||||
|
||||
.c2u_1rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #8
|
||||
|
@ -210,17 +184,8 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .c2u_2rem8lp
|
||||
PLD( pld [r1, #12] )
|
||||
PLD( pld [r0, #12] )
|
||||
PLD( subs ip, ip, #32 )
|
||||
PLD( blt .c2u_2cpynopld )
|
||||
PLD( pld [r1, #28] )
|
||||
PLD( pld [r0, #28] )
|
||||
|
||||
.c2u_2cpy8lp:
|
||||
PLD( pld [r1, #44] )
|
||||
PLD( pld [r0, #44] )
|
||||
.c2u_2cpynopld: mov r3, r7, pull #16
|
||||
.c2u_2cpy8lp: mov r3, r7, pull #16
|
||||
ldmia r1!, {r4 - r7}
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #16
|
||||
|
@ -232,9 +197,6 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
orr r6, r6, r7, push #16
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
bpl .c2u_2cpy8lp
|
||||
PLD( cmn ip, #32 )
|
||||
PLD( bge .c2u_2cpynopld )
|
||||
PLD( add ip, ip, #32 )
|
||||
|
||||
.c2u_2rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #16
|
||||
|
@ -277,17 +239,8 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .c2u_3rem8lp
|
||||
PLD( pld [r1, #12] )
|
||||
PLD( pld [r0, #12] )
|
||||
PLD( subs ip, ip, #32 )
|
||||
PLD( blt .c2u_3cpynopld )
|
||||
PLD( pld [r1, #28] )
|
||||
PLD( pld [r0, #28] )
|
||||
|
||||
.c2u_3cpy8lp:
|
||||
PLD( pld [r1, #44] )
|
||||
PLD( pld [r0, #44] )
|
||||
.c2u_3cpynopld: mov r3, r7, pull #24
|
||||
.c2u_3cpy8lp: mov r3, r7, pull #24
|
||||
ldmia r1!, {r4 - r7}
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #8
|
||||
|
@ -299,9 +252,6 @@ USER( strt r3, [r0], #4) @ May fault
|
|||
orr r6, r6, r7, push #8
|
||||
stmia r0!, {r3 - r6} @ Shouldnt fault
|
||||
bpl .c2u_3cpy8lp
|
||||
PLD( cmn ip, #32 )
|
||||
PLD( bge .c2u_3cpynopld )
|
||||
PLD( add ip, ip, #32 )
|
||||
|
||||
.c2u_3rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #24
|
||||
|
@ -356,8 +306,6 @@ ENTRY(__arch_copy_from_user)
|
|||
stmfd sp!, {r0, r2, r4 - r7, lr}
|
||||
cmp r2, #4
|
||||
blt .cfu_not_enough
|
||||
PLD( pld [r1, #0] )
|
||||
PLD( pld [r0, #0] )
|
||||
ands ip, r0, #3
|
||||
bne .cfu_dest_not_aligned
|
||||
.cfu_dest_aligned:
|
||||
|
@ -385,25 +333,13 @@ USER( ldrt r3, [r1], #4)
|
|||
sub r2, r2, ip
|
||||
subs ip, ip, #32
|
||||
blt .cfu_0rem8lp
|
||||
PLD( pld [r1, #28] )
|
||||
PLD( pld [r0, #28] )
|
||||
PLD( subs ip, ip, #64 )
|
||||
PLD( blt .cfu_0cpynopld )
|
||||
PLD( pld [r1, #60] )
|
||||
PLD( pld [r0, #60] )
|
||||
|
||||
.cfu_0cpy8lp:
|
||||
PLD( pld [r1, #92] )
|
||||
PLD( pld [r0, #92] )
|
||||
.cfu_0cpynopld: ldmia r1!, {r3 - r6} @ Shouldnt fault
|
||||
.cfu_0cpy8lp: ldmia r1!, {r3 - r6} @ Shouldnt fault
|
||||
stmia r0!, {r3 - r6}
|
||||
ldmia r1!, {r3 - r6} @ Shouldnt fault
|
||||
subs ip, ip, #32
|
||||
stmia r0!, {r3 - r6}
|
||||
bpl .cfu_0cpy8lp
|
||||
PLD( cmn ip, #64 )
|
||||
PLD( bge .cfu_0cpynopld )
|
||||
PLD( add ip, ip, #64 )
|
||||
|
||||
.cfu_0rem8lp: cmn ip, #16
|
||||
ldmgeia r1!, {r3 - r6} @ Shouldnt fault
|
||||
|
@ -456,17 +392,8 @@ USER( ldrt r7, [r1], #4) @ May fault
|
|||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .cfu_1rem8lp
|
||||
PLD( pld [r1, #12] )
|
||||
PLD( pld [r0, #12] )
|
||||
PLD( subs ip, ip, #32 )
|
||||
PLD( blt .cfu_1cpynopld )
|
||||
PLD( pld [r1, #28] )
|
||||
PLD( pld [r0, #28] )
|
||||
|
||||
.cfu_1cpy8lp:
|
||||
PLD( pld [r1, #44] )
|
||||
PLD( pld [r0, #44] )
|
||||
.cfu_1cpynopld: mov r3, r7, pull #8
|
||||
.cfu_1cpy8lp: mov r3, r7, pull #8
|
||||
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #24
|
||||
|
@ -478,9 +405,6 @@ USER( ldrt r7, [r1], #4) @ May fault
|
|||
orr r6, r6, r7, push #24
|
||||
stmia r0!, {r3 - r6}
|
||||
bpl .cfu_1cpy8lp
|
||||
PLD( cmn ip, #32 )
|
||||
PLD( bge .cfu_1cpynopld )
|
||||
PLD( add ip, ip, #32 )
|
||||
|
||||
.cfu_1rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #8
|
||||
|
@ -523,17 +447,8 @@ USER( ldrt r7, [r1], #4) @ May fault
|
|||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .cfu_2rem8lp
|
||||
PLD( pld [r1, #12] )
|
||||
PLD( pld [r0, #12] )
|
||||
PLD( subs ip, ip, #32 )
|
||||
PLD( blt .cfu_2cpynopld )
|
||||
PLD( pld [r1, #28] )
|
||||
PLD( pld [r0, #28] )
|
||||
|
||||
.cfu_2cpy8lp:
|
||||
PLD( pld [r1, #44] )
|
||||
PLD( pld [r0, #44] )
|
||||
.cfu_2cpynopld: mov r3, r7, pull #16
|
||||
.cfu_2cpy8lp: mov r3, r7, pull #16
|
||||
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||
subs ip, ip, #16
|
||||
orr r3, r3, r4, push #16
|
||||
|
@ -545,9 +460,6 @@ USER( ldrt r7, [r1], #4) @ May fault
|
|||
orr r6, r6, r7, push #16
|
||||
stmia r0!, {r3 - r6}
|
||||
bpl .cfu_2cpy8lp
|
||||
PLD( cmn ip, #32 )
|
||||
PLD( bge .cfu_2cpynopld )
|
||||
PLD( add ip, ip, #32 )
|
||||
|
||||
.cfu_2rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #16
|
||||
|
@ -590,17 +502,8 @@ USER( ldrt r7, [r1], #4) @ May fault
|
|||
sub r2, r2, ip
|
||||
subs ip, ip, #16
|
||||
blt .cfu_3rem8lp
|
||||
PLD( pld [r1, #12] )
|
||||
PLD( pld [r0, #12] )
|
||||
PLD( subs ip, ip, #32 )
|
||||
PLD( blt .cfu_3cpynopld )
|
||||
PLD( pld [r1, #28] )
|
||||
PLD( pld [r0, #28] )
|
||||
|
||||
.cfu_3cpy8lp:
|
||||
PLD( pld [r1, #44] )
|
||||
PLD( pld [r0, #44] )
|
||||
.cfu_3cpynopld: mov r3, r7, pull #24
|
||||
.cfu_3cpy8lp: mov r3, r7, pull #24
|
||||
ldmia r1!, {r4 - r7} @ Shouldnt fault
|
||||
orr r3, r3, r4, push #8
|
||||
mov r4, r4, pull #24
|
||||
|
@ -612,9 +515,6 @@ USER( ldrt r7, [r1], #4) @ May fault
|
|||
stmia r0!, {r3 - r6}
|
||||
subs ip, ip, #16
|
||||
bpl .cfu_3cpy8lp
|
||||
PLD( cmn ip, #32 )
|
||||
PLD( bge .cfu_3cpynopld )
|
||||
PLD( add ip, ip, #32 )
|
||||
|
||||
.cfu_3rem8lp: tst ip, #8
|
||||
movne r3, r7, pull #24
|
||||
|
@ -657,41 +557,3 @@ USER( ldrgtbt r3, [r1], #1) @ May fault
|
|||
LOADREGS(fd,sp!, {r4 - r7, pc})
|
||||
.previous
|
||||
|
||||
/* Prototype: int __arch_clear_user(void *addr, size_t sz)
|
||||
* Purpose : clear some user memory
|
||||
* Params : addr - user memory address to clear
|
||||
* : sz - number of bytes to clear
|
||||
* Returns : number of bytes NOT cleared
|
||||
*/
|
||||
ENTRY(__arch_clear_user)
|
||||
stmfd sp!, {r1, lr}
|
||||
mov r2, #0
|
||||
cmp r1, #4
|
||||
blt 2f
|
||||
ands ip, r0, #3
|
||||
beq 1f
|
||||
cmp ip, #2
|
||||
USER( strbt r2, [r0], #1)
|
||||
USER( strlebt r2, [r0], #1)
|
||||
USER( strltbt r2, [r0], #1)
|
||||
rsb ip, ip, #4
|
||||
sub r1, r1, ip @ 7 6 5 4 3 2 1
|
||||
1: subs r1, r1, #8 @ -1 -2 -3 -4 -5 -6 -7
|
||||
USER( strplt r2, [r0], #4)
|
||||
USER( strplt r2, [r0], #4)
|
||||
bpl 1b
|
||||
adds r1, r1, #4 @ 3 2 1 0 -1 -2 -3
|
||||
USER( strplt r2, [r0], #4)
|
||||
2: tst r1, #2 @ 1x 1x 0x 0x 1x 1x 0x
|
||||
USER( strnebt r2, [r0], #1)
|
||||
USER( strnebt r2, [r0], #1)
|
||||
tst r1, #1 @ x1 x0 x1 x0 x1 x0 x1
|
||||
USER( strnebt r2, [r0], #1)
|
||||
mov r0, #0
|
||||
LOADREGS(fd,sp!, {r1, pc})
|
||||
|
||||
.section .fixup,"ax"
|
||||
.align 0
|
||||
9001: LOADREGS(fd,sp!, {r0, pc})
|
||||
.previous
|
||||
|
||||
|
|
35
arch/arm/lib/ucmpdi2.S
Normal file
35
arch/arm/lib/ucmpdi2.S
Normal file
|
@ -0,0 +1,35 @@
|
|||
/*
|
||||
* linux/arch/arm/lib/ucmpdi2.S
|
||||
*
|
||||
* Author: Nicolas Pitre
|
||||
* Created: Oct 19, 2005
|
||||
* Copyright: Monta Vista Software, Inc.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
|
||||
#include <linux/linkage.h>
|
||||
|
||||
#ifdef __ARMEB__
|
||||
#define xh r0
|
||||
#define xl r1
|
||||
#define yh r2
|
||||
#define yl r3
|
||||
#else
|
||||
#define xl r0
|
||||
#define xh r1
|
||||
#define yl r2
|
||||
#define yh r3
|
||||
#endif
|
||||
|
||||
ENTRY(__ucmpdi2)
|
||||
|
||||
cmp xh, yh
|
||||
cmpeq xl, yl
|
||||
movlo r0, #0
|
||||
moveq r0, #1
|
||||
movhi r0, #2
|
||||
mov pc, lr
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
/* More subroutines needed by GCC output code on some machines. */
|
||||
/* Compile this one with gcc. */
|
||||
/* Copyright (C) 1989, 92-98, 1999 Free Software Foundation, Inc.
|
||||
|
||||
This file is part of GNU CC.
|
||||
|
||||
GNU CC is free software; you can redistribute it and/or modify
|
||||
it under the terms of the GNU General Public License as published by
|
||||
the Free Software Foundation; either version 2, or (at your option)
|
||||
any later version.
|
||||
|
||||
GNU CC is distributed in the hope that it will be useful,
|
||||
but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
GNU General Public License for more details.
|
||||
|
||||
You should have received a copy of the GNU General Public License
|
||||
along with GNU CC; see the file COPYING. If not, write to
|
||||
the Free Software Foundation, 59 Temple Place - Suite 330,
|
||||
Boston, MA 02111-1307, USA. */
|
||||
|
||||
/* As a special exception, if you link this library with other files,
|
||||
some of which are compiled with GCC, to produce an executable,
|
||||
this library does not by itself cause the resulting executable
|
||||
to be covered by the GNU General Public License.
|
||||
This exception does not however invalidate any other reasons why
|
||||
the executable file might be covered by the GNU General Public License.
|
||||
*/
|
||||
/* support functions required by the kernel. based on code from gcc-2.95.3 */
|
||||
/* I Molton 29/07/01 */
|
||||
|
||||
#include "gcclib.h"
|
||||
|
||||
int __ucmpdi2(s64 a, s64 b)
|
||||
{
|
||||
DIunion au, bu;
|
||||
|
||||
au.ll = a, bu.ll = b;
|
||||
|
||||
if ((u32) au.s.high < (u32) bu.s.high)
|
||||
return 0;
|
||||
else if ((u32) au.s.high > (u32) bu.s.high)
|
||||
return 2;
|
||||
if ((u32) au.s.low < (u32) bu.s.low)
|
||||
return 0;
|
||||
else if ((u32) au.s.low > (u32) bu.s.low)
|
||||
return 2;
|
||||
return 1;
|
||||
}
|
|
@ -13,7 +13,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
|
|
|
@ -69,17 +69,6 @@ config EP72XX_ROM_BOOT
|
|||
|
||||
You almost surely want to say N here.
|
||||
|
||||
config MACH_MP1000
|
||||
bool "MACH_MP1000"
|
||||
help
|
||||
Say Y if you intend to run the kernel on the Comdial MP1000 platform.
|
||||
|
||||
config MP1000_90MHZ
|
||||
bool "MP1000_90MHZ"
|
||||
depends on MACH_MP1000
|
||||
help
|
||||
Say Y if you have the MP1000 configured to be set at 90MHZ rather than 74MHZ
|
||||
|
||||
endmenu
|
||||
|
||||
endif
|
||||
|
|
|
@ -15,7 +15,6 @@ obj-$(CONFIG_ARCH_CDB89712) += cdb89712.o
|
|||
obj-$(CONFIG_ARCH_CLEP7312) += clep7312.o
|
||||
obj-$(CONFIG_ARCH_EDB7211) += edb7211-arch.o edb7211-mm.o
|
||||
obj-$(CONFIG_ARCH_FORTUNET) += fortunet.o
|
||||
obj-$(CONFIG_MACH_MP1000) += mp1000-mach.o mp1000-mm.o mp1000-seprom.o
|
||||
obj-$(CONFIG_ARCH_P720T) += p720t.o
|
||||
leds-$(CONFIG_ARCH_P720T) += p720t-leds.o
|
||||
obj-$(CONFIG_LEDS) += $(leds-y)
|
||||
|
|
|
@ -55,22 +55,22 @@ static struct map_desc edb7211_io_desc[] __initdata = {
|
|||
.virtual = EP7211_VIRT_EXTKBD,
|
||||
.pfn = __phys_to_pfn(EP7211_PHYS_EXTKBD),
|
||||
.length = SZ_1M,
|
||||
.type - MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
}, { /* and CS8900A Ethernet chip */
|
||||
.virtual = EP7211_VIRT_CS8900A,
|
||||
.pfn = __phys_to_pfn(EP7211_PHYS_CS8900A),
|
||||
.length = SZ_1M,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
}, { /* flash banks */
|
||||
.virtual = EP7211_VIRT_FLASH1,
|
||||
.pfn = __phys_to_pfn(EP7211_PHYS_FLASH1),
|
||||
.length = SZ_8M,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
}, {
|
||||
.virtual = EP7211_VIRT_FLASH2,
|
||||
.pfn = __phys_to_pfn(EP7211_PHYS_FLASH2),
|
||||
.length = SZ_8M,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE,
|
||||
}
|
||||
};
|
||||
|
||||
|
|
|
@ -1,47 +0,0 @@
|
|||
/*
|
||||
* linux/arch/arm/mach-mp1000/mm.c
|
||||
*
|
||||
* Extra MM routines for the MP1000
|
||||
*
|
||||
* Copyright (C) 2005 Comdial Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/sizes.h>
|
||||
|
||||
#include <asm/mach/map.h>
|
||||
|
||||
extern void clps711x_map_io(void);
|
||||
|
||||
static struct map_desc mp1000_io_desc[] __initdata = {
|
||||
{ MP1000_EIO_BASE, MP1000_EIO_START, MP1000_EIO_SIZE, MT_DEVICE },
|
||||
{ MP1000_FIO_BASE, MP1000_FIO_START, MP1000_FIO_SIZE, MT_DEVICE },
|
||||
{ MP1000_LIO_BASE, MP1000_LIO_START, MP1000_LIO_SIZE, MT_DEVICE },
|
||||
{ MP1000_NIO_BASE, MP1000_NIO_START, MP1000_NIO_SIZE, MT_DEVICE },
|
||||
{ MP1000_IDE_BASE, MP1000_IDE_START, MP1000_IDE_SIZE, MT_DEVICE },
|
||||
{ MP1000_DSP_BASE, MP1000_DSP_START, MP1000_DSP_SIZE, MT_DEVICE }
|
||||
};
|
||||
|
||||
void __init mp1000_map_io(void)
|
||||
{
|
||||
clps711x_map_io();
|
||||
iotable_init(mp1000_io_desc, ARRAY_SIZE(mp1000_io_desc));
|
||||
}
|
|
@ -1,195 +0,0 @@
|
|||
/*`
|
||||
* mp1000-seprom.c
|
||||
*
|
||||
* This file contains the Serial EEPROM code for the MP1000 board
|
||||
*
|
||||
* Copyright (C) 2005 Comdial Corporation
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU General Public License as published by
|
||||
* the Free Software Foundation; either version 2 of the License, or
|
||||
* (at your option) any later version.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful,
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||
* GNU General Public License for more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License
|
||||
* along with this program; if not, write to the Free Software
|
||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/hardware/clps7111.h>
|
||||
#include <asm/arch/mp1000-seprom.h>
|
||||
|
||||
/* If SepromInit() can initialize and checksum the seprom successfully, */
|
||||
/* then it will point seprom_data_ptr at the shadow copy. */
|
||||
|
||||
static eeprom_struct seprom_data; /* shadow copy of seprom content */
|
||||
|
||||
eeprom_struct *seprom_data_ptr = 0; /* 0 => not initialized */
|
||||
|
||||
/*
|
||||
* Port D Bit 5 is Chip Select for EEPROM
|
||||
* Port E Bit 0 is Input, Data out from EEPROM
|
||||
* Port E Bit 1 is Output, Data in to EEPROM
|
||||
* Port E Bit 2 is Output, CLK to EEPROM
|
||||
*/
|
||||
|
||||
static char *port_d_ptr = (char *)(CLPS7111_VIRT_BASE + PDDR);
|
||||
static char *port_e_ptr = (char *)(CLPS7111_VIRT_BASE + PEDR);
|
||||
|
||||
#define NO_OF_SHORTS 64 // Device is 64 x 16 bits
|
||||
#define ENABLE_RW 0
|
||||
#define DISABLE_RW 1
|
||||
|
||||
static inline void toggle_seprom_clock(void)
|
||||
{
|
||||
*port_e_ptr |= HwPortESepromCLK;
|
||||
*port_e_ptr &= ~(HwPortESepromCLK);
|
||||
}
|
||||
|
||||
static inline void select_eeprom(void)
|
||||
{
|
||||
*port_d_ptr |= HwPortDEECS;
|
||||
*port_e_ptr &= ~(HwPortESepromCLK);
|
||||
}
|
||||
|
||||
static inline void deselect_eeprom(void)
|
||||
{
|
||||
*port_d_ptr &= ~(HwPortDEECS);
|
||||
*port_e_ptr &= ~(HwPortESepromDIn);
|
||||
}
|
||||
|
||||
/*
|
||||
* GetSepromDataPtr - returns pointer to shadow (RAM) copy of seprom
|
||||
* and returns 0 if seprom is not initialized or
|
||||
* has a checksum error.
|
||||
*/
|
||||
|
||||
eeprom_struct* get_seprom_ptr(void)
|
||||
{
|
||||
return seprom_data_ptr;
|
||||
}
|
||||
|
||||
unsigned char* get_eeprom_mac_address(void)
|
||||
{
|
||||
return seprom_data_ptr->variant.eprom_struct.mac_Address;
|
||||
}
|
||||
|
||||
/*
|
||||
* ReadSProm, Physically reads data from the Serial PROM
|
||||
*/
|
||||
static void read_sprom(short address, int length, eeprom_struct *buffer)
|
||||
{
|
||||
short data = COMMAND_READ | (address & 0x3F);
|
||||
short bit;
|
||||
int i;
|
||||
|
||||
select_eeprom();
|
||||
|
||||
// Clock in 9 bits of the command
|
||||
for (i = 0, bit = 0x100; i < 9; i++, bit >>= 1) {
|
||||
if (data & bit)
|
||||
*port_e_ptr |= HwPortESepromDIn;
|
||||
else
|
||||
*port_e_ptr &= ~(HwPortESepromDIn);
|
||||
|
||||
toggle_seprom_clock();
|
||||
}
|
||||
|
||||
//
|
||||
// Now read one or more shorts of data from the Seprom
|
||||
//
|
||||
while (length-- > 0) {
|
||||
data = 0;
|
||||
|
||||
// Read 16 bits at a time
|
||||
for (i = 0; i < 16; i++) {
|
||||
data <<= 1;
|
||||
toggle_seprom_clock();
|
||||
data |= *port_e_ptr & HwPortESepromDOut;
|
||||
|
||||
}
|
||||
|
||||
buffer->variant.eprom_short_data[address++] = data;
|
||||
}
|
||||
|
||||
deselect_eeprom();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
||||
|
||||
/*
|
||||
* ReadSerialPROM
|
||||
*
|
||||
* Input: Pointer to array of 64 x 16 Bits
|
||||
*
|
||||
* Output: if no problem reading data is filled in
|
||||
*/
|
||||
static void read_serial_prom(eeprom_struct *data)
|
||||
{
|
||||
read_sprom(0, 64, data);
|
||||
}
|
||||
|
||||
|
||||
//
|
||||
// Compute Serial EEPROM checksum
|
||||
//
|
||||
// Input: Pointer to struct with Eprom data
|
||||
//
|
||||
// Output: The computed Eprom checksum
|
||||
//
|
||||
static short compute_seprom_checksum(eeprom_struct *data)
|
||||
{
|
||||
short checksum = 0;
|
||||
int i;
|
||||
|
||||
for (i = 0; i < 126; i++) {
|
||||
checksum += (short)data->variant.eprom_byte_data[i];
|
||||
}
|
||||
|
||||
return((short)(0x5555 - (checksum & 0xFFFF)));
|
||||
}
|
||||
|
||||
//
|
||||
// Make sure the data port bits for the SEPROM are correctly initialised
|
||||
//
|
||||
|
||||
void __init seprom_init(void)
|
||||
{
|
||||
short checksum;
|
||||
|
||||
// Init Port D
|
||||
*(char *)(CLPS7111_VIRT_BASE + PDDDR) = 0x0;
|
||||
*(char *)(CLPS7111_VIRT_BASE + PDDR) = 0x15;
|
||||
|
||||
// Init Port E
|
||||
*(int *)(CLPS7111_VIRT_BASE + PEDDR) = 0x06;
|
||||
*(int *)(CLPS7111_VIRT_BASE + PEDR) = 0x04;
|
||||
|
||||
//
|
||||
// Make sure that EEPROM struct size never exceeds 128 bytes
|
||||
//
|
||||
if (sizeof(eeprom_struct) > 128) {
|
||||
panic("Serial PROM struct size > 128, aborting read\n");
|
||||
}
|
||||
|
||||
read_serial_prom(&seprom_data);
|
||||
|
||||
checksum = compute_seprom_checksum(&seprom_data);
|
||||
|
||||
if (checksum != seprom_data.variant.eprom_short_data[63]) {
|
||||
panic("Serial EEPROM checksum failed\n");
|
||||
}
|
||||
|
||||
seprom_data_ptr = &seprom_data;
|
||||
}
|
||||
|
|
@ -251,9 +251,33 @@ static struct platform_device serial_device = {
|
|||
},
|
||||
};
|
||||
|
||||
static struct resource am79c961_resources[] = {
|
||||
{
|
||||
.start = 0x220,
|
||||
.end = 0x238,
|
||||
.flags = IORESOURCE_IO,
|
||||
}, {
|
||||
.start = IRQ_EBSA110_ETHERNET,
|
||||
.end = IRQ_EBSA110_ETHERNET,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device am79c961_device = {
|
||||
.name = "am79c961",
|
||||
.id = -1,
|
||||
.num_resources = ARRAY_SIZE(am79c961_resources),
|
||||
.resource = am79c961_resources,
|
||||
};
|
||||
|
||||
static struct platform_device *ebsa110_devices[] = {
|
||||
&serial_device,
|
||||
&am79c961_device,
|
||||
};
|
||||
|
||||
static int __init ebsa110_init(void)
|
||||
{
|
||||
return platform_device_register(&serial_device);
|
||||
return platform_add_devices(ebsa110_devices, ARRAY_SIZE(ebsa110_devices));
|
||||
}
|
||||
|
||||
arch_initcall(ebsa110_init);
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/types.h>
|
||||
|
|
|
@ -22,10 +22,12 @@
|
|||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||
*
|
||||
*/
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include <asm/arch/imxfb.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/arch/imx-regs.h>
|
||||
|
|
|
@ -14,6 +14,7 @@
|
|||
|
||||
#include <linux/device.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <asm/system.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#include <linux/list.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/err.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include <asm/semaphore.h>
|
||||
#include <asm/hardware/clock.h>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/sysdev.h>
|
||||
|
@ -30,6 +30,7 @@
|
|||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/setup.h>
|
||||
#include <asm/param.h> /* HZ */
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/hardware/amba.h>
|
||||
#include <asm/hardware/amba_kmi.h>
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/string.h>
|
||||
|
|
|
@ -10,6 +10,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/arch/lm.h>
|
||||
|
||||
|
|
|
@ -16,7 +16,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/serial_core.h>
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/serial_core.h>
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
|
|
|
@ -14,6 +14,8 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
|
|
|
@ -13,6 +13,8 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/string.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#
|
||||
# Makefile for the linux kernel.
|
||||
#
|
||||
obj-y := core.o pci.o
|
||||
obj-y := core.o pci.o uengine.o
|
||||
obj-m :=
|
||||
obj-n :=
|
||||
obj- :=
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
/*
|
||||
* arch/arm/mach-ixp2000/common.c
|
||||
* arch/arm/mach-ixp2000/core.c
|
||||
*
|
||||
* Common routines used by all IXP2400/2800 based platforms.
|
||||
*
|
||||
|
@ -49,7 +49,6 @@ static unsigned long ixp2000_slowport_irq_flags;
|
|||
*************************************************************************/
|
||||
void ixp2000_acquire_slowport(struct slowport_cfg *new_cfg, struct slowport_cfg *old_cfg)
|
||||
{
|
||||
|
||||
spin_lock_irqsave(&ixp2000_slowport_lock, ixp2000_slowport_irq_flags);
|
||||
|
||||
old_cfg->CCR = *IXP2000_SLOWPORT_CCR;
|
||||
|
@ -62,7 +61,7 @@ void ixp2000_acquire_slowport(struct slowport_cfg *new_cfg, struct slowport_cfg
|
|||
ixp2000_reg_write(IXP2000_SLOWPORT_WTC2, new_cfg->WTC);
|
||||
ixp2000_reg_write(IXP2000_SLOWPORT_RTC2, new_cfg->RTC);
|
||||
ixp2000_reg_write(IXP2000_SLOWPORT_PCR, new_cfg->PCR);
|
||||
ixp2000_reg_write(IXP2000_SLOWPORT_ADC, new_cfg->ADC);
|
||||
ixp2000_reg_wrb(IXP2000_SLOWPORT_ADC, new_cfg->ADC);
|
||||
}
|
||||
|
||||
void ixp2000_release_slowport(struct slowport_cfg *old_cfg)
|
||||
|
@ -71,7 +70,7 @@ void ixp2000_release_slowport(struct slowport_cfg *old_cfg)
|
|||
ixp2000_reg_write(IXP2000_SLOWPORT_WTC2, old_cfg->WTC);
|
||||
ixp2000_reg_write(IXP2000_SLOWPORT_RTC2, old_cfg->RTC);
|
||||
ixp2000_reg_write(IXP2000_SLOWPORT_PCR, old_cfg->PCR);
|
||||
ixp2000_reg_write(IXP2000_SLOWPORT_ADC, old_cfg->ADC);
|
||||
ixp2000_reg_wrb(IXP2000_SLOWPORT_ADC, old_cfg->ADC);
|
||||
|
||||
spin_unlock_irqrestore(&ixp2000_slowport_lock,
|
||||
ixp2000_slowport_irq_flags);
|
||||
|
@ -145,7 +144,7 @@ void __init ixp2000_map_io(void)
|
|||
iotable_init(ixp2000_io_desc, ARRAY_SIZE(ixp2000_io_desc));
|
||||
|
||||
/* Set slowport to 8-bit mode. */
|
||||
ixp2000_reg_write(IXP2000_SLOWPORT_FRM, 1);
|
||||
ixp2000_reg_wrb(IXP2000_SLOWPORT_FRM, 1);
|
||||
}
|
||||
|
||||
|
||||
|
@ -209,7 +208,7 @@ static int ixp2000_timer_interrupt(int irq, void *dev_id, struct pt_regs *regs)
|
|||
write_seqlock(&xtime_lock);
|
||||
|
||||
/* clear timer 1 */
|
||||
ixp2000_reg_write(IXP2000_T1_CLR, 1);
|
||||
ixp2000_reg_wrb(IXP2000_T1_CLR, 1);
|
||||
|
||||
while ((next_jiffy_time - *missing_jiffy_timer_csr) > ticks_per_jiffy) {
|
||||
timer_tick(regs);
|
||||
|
@ -252,12 +251,12 @@ void __init ixp2000_init_time(unsigned long tick_rate)
|
|||
|
||||
ixp2000_reg_write(IXP2000_T4_CLR, 0);
|
||||
ixp2000_reg_write(IXP2000_T4_CLD, -1);
|
||||
ixp2000_reg_write(IXP2000_T4_CTL, (1 << 7));
|
||||
ixp2000_reg_wrb(IXP2000_T4_CTL, (1 << 7));
|
||||
missing_jiffy_timer_csr = IXP2000_T4_CSR;
|
||||
} else {
|
||||
ixp2000_reg_write(IXP2000_T2_CLR, 0);
|
||||
ixp2000_reg_write(IXP2000_T2_CLD, -1);
|
||||
ixp2000_reg_write(IXP2000_T2_CTL, (1 << 7));
|
||||
ixp2000_reg_wrb(IXP2000_T2_CTL, (1 << 7));
|
||||
missing_jiffy_timer_csr = IXP2000_T2_CSR;
|
||||
}
|
||||
next_jiffy_time = 0xffffffff;
|
||||
|
@ -279,7 +278,7 @@ static void update_gpio_int_csrs(void)
|
|||
ixp2000_reg_write(IXP2000_GPIO_FEDR, GPIO_IRQ_falling_edge);
|
||||
ixp2000_reg_write(IXP2000_GPIO_REDR, GPIO_IRQ_rising_edge);
|
||||
ixp2000_reg_write(IXP2000_GPIO_LSLR, GPIO_IRQ_level_low);
|
||||
ixp2000_reg_write(IXP2000_GPIO_LSHR, GPIO_IRQ_level_high);
|
||||
ixp2000_reg_wrb(IXP2000_GPIO_LSHR, GPIO_IRQ_level_high);
|
||||
}
|
||||
|
||||
void gpio_line_config(int line, int direction)
|
||||
|
@ -297,9 +296,9 @@ void gpio_line_config(int line, int direction)
|
|||
GPIO_IRQ_level_high &= ~(1 << line);
|
||||
update_gpio_int_csrs();
|
||||
|
||||
ixp2000_reg_write(IXP2000_GPIO_PDSR, 1 << line);
|
||||
ixp2000_reg_wrb(IXP2000_GPIO_PDSR, 1 << line);
|
||||
} else if (direction == GPIO_IN) {
|
||||
ixp2000_reg_write(IXP2000_GPIO_PDCR, 1 << line);
|
||||
ixp2000_reg_wrb(IXP2000_GPIO_PDCR, 1 << line);
|
||||
}
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
@ -365,12 +364,12 @@ static void ixp2000_GPIO_irq_mask_ack(unsigned int irq)
|
|||
|
||||
ixp2000_reg_write(IXP2000_GPIO_EDSR, (1 << (irq - IRQ_IXP2000_GPIO0)));
|
||||
ixp2000_reg_write(IXP2000_GPIO_LDSR, (1 << (irq - IRQ_IXP2000_GPIO0)));
|
||||
ixp2000_reg_write(IXP2000_GPIO_INST, (1 << (irq - IRQ_IXP2000_GPIO0)));
|
||||
ixp2000_reg_wrb(IXP2000_GPIO_INST, (1 << (irq - IRQ_IXP2000_GPIO0)));
|
||||
}
|
||||
|
||||
static void ixp2000_GPIO_irq_mask(unsigned int irq)
|
||||
{
|
||||
ixp2000_reg_write(IXP2000_GPIO_INCR, (1 << (irq - IRQ_IXP2000_GPIO0)));
|
||||
ixp2000_reg_wrb(IXP2000_GPIO_INCR, (1 << (irq - IRQ_IXP2000_GPIO0)));
|
||||
}
|
||||
|
||||
static void ixp2000_GPIO_irq_unmask(unsigned int irq)
|
||||
|
@ -389,9 +388,9 @@ static void ixp2000_pci_irq_mask(unsigned int irq)
|
|||
{
|
||||
unsigned long temp = *IXP2000_PCI_XSCALE_INT_ENABLE;
|
||||
if (irq == IRQ_IXP2000_PCIA)
|
||||
ixp2000_reg_write(IXP2000_PCI_XSCALE_INT_ENABLE, (temp & ~(1 << 26)));
|
||||
ixp2000_reg_wrb(IXP2000_PCI_XSCALE_INT_ENABLE, (temp & ~(1 << 26)));
|
||||
else if (irq == IRQ_IXP2000_PCIB)
|
||||
ixp2000_reg_write(IXP2000_PCI_XSCALE_INT_ENABLE, (temp & ~(1 << 27)));
|
||||
ixp2000_reg_wrb(IXP2000_PCI_XSCALE_INT_ENABLE, (temp & ~(1 << 27)));
|
||||
}
|
||||
|
||||
static void ixp2000_pci_irq_unmask(unsigned int irq)
|
||||
|
@ -403,6 +402,40 @@ static void ixp2000_pci_irq_unmask(unsigned int irq)
|
|||
ixp2000_reg_write(IXP2000_PCI_XSCALE_INT_ENABLE, (temp | (1 << 27)));
|
||||
}
|
||||
|
||||
/*
|
||||
* Error interrupts. These are used extensively by the microengine drivers
|
||||
*/
|
||||
static void ixp2000_err_irq_handler(unsigned int irq, struct irqdesc *desc, struct pt_regs *regs)
|
||||
{
|
||||
int i;
|
||||
unsigned long status = *IXP2000_IRQ_ERR_STATUS;
|
||||
|
||||
for(i = 31; i >= 0; i--) {
|
||||
if(status & (1 << i)) {
|
||||
desc = irq_desc + IRQ_IXP2000_DRAM0_MIN_ERR + i;
|
||||
desc->handle(IRQ_IXP2000_DRAM0_MIN_ERR + i, desc, regs);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
static void ixp2000_err_irq_mask(unsigned int irq)
|
||||
{
|
||||
ixp2000_reg_write(IXP2000_IRQ_ERR_ENABLE_CLR,
|
||||
(1 << (irq - IRQ_IXP2000_DRAM0_MIN_ERR)));
|
||||
}
|
||||
|
||||
static void ixp2000_err_irq_unmask(unsigned int irq)
|
||||
{
|
||||
ixp2000_reg_write(IXP2000_IRQ_ERR_ENABLE_SET,
|
||||
(1 << (irq - IRQ_IXP2000_DRAM0_MIN_ERR)));
|
||||
}
|
||||
|
||||
static struct irqchip ixp2000_err_irq_chip = {
|
||||
.ack = ixp2000_err_irq_mask,
|
||||
.mask = ixp2000_err_irq_mask,
|
||||
.unmask = ixp2000_err_irq_unmask
|
||||
};
|
||||
|
||||
static struct irqchip ixp2000_pci_irq_chip = {
|
||||
.ack = ixp2000_pci_irq_mask,
|
||||
.mask = ixp2000_pci_irq_mask,
|
||||
|
@ -411,7 +444,7 @@ static struct irqchip ixp2000_pci_irq_chip = {
|
|||
|
||||
static void ixp2000_irq_mask(unsigned int irq)
|
||||
{
|
||||
ixp2000_reg_write(IXP2000_IRQ_ENABLE_CLR, (1 << irq));
|
||||
ixp2000_reg_wrb(IXP2000_IRQ_ENABLE_CLR, (1 << irq));
|
||||
}
|
||||
|
||||
static void ixp2000_irq_unmask(unsigned int irq)
|
||||
|
@ -443,7 +476,7 @@ void __init ixp2000_init_irq(void)
|
|||
ixp2000_reg_write(IXP2000_GPIO_INCR, -1);
|
||||
|
||||
/* clear PCI interrupt sources */
|
||||
ixp2000_reg_write(IXP2000_PCI_XSCALE_INT_ENABLE, 0);
|
||||
ixp2000_reg_wrb(IXP2000_PCI_XSCALE_INT_ENABLE, 0);
|
||||
|
||||
/*
|
||||
* Certain bits in the IRQ status register of the
|
||||
|
@ -460,6 +493,18 @@ void __init ixp2000_init_irq(void)
|
|||
} else set_irq_flags(irq, 0);
|
||||
}
|
||||
|
||||
for (irq = IRQ_IXP2000_DRAM0_MIN_ERR; irq <= IRQ_IXP2000_SP_INT; irq++) {
|
||||
if((1 << (irq - IRQ_IXP2000_DRAM0_MIN_ERR)) &
|
||||
IXP2000_VALID_ERR_IRQ_MASK) {
|
||||
set_irq_chip(irq, &ixp2000_err_irq_chip);
|
||||
set_irq_handler(irq, do_level_IRQ);
|
||||
set_irq_flags(irq, IRQF_VALID);
|
||||
}
|
||||
else
|
||||
set_irq_flags(irq, 0);
|
||||
}
|
||||
set_irq_chained_handler(IRQ_IXP2000_ERRSUM, ixp2000_err_irq_handler);
|
||||
|
||||
/*
|
||||
* GPIO IRQs are invalid until someone sets the interrupt mode
|
||||
* by calling set_irq_type().
|
||||
|
|
|
@ -32,7 +32,7 @@
|
|||
#include <linux/serial.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
@ -63,6 +63,35 @@ static struct sys_timer enp2611_timer = {
|
|||
};
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* ENP-2611 I/O
|
||||
*************************************************************************/
|
||||
static struct map_desc enp2611_io_desc[] __initdata = {
|
||||
{
|
||||
.virtual = ENP2611_CALEB_VIRT_BASE,
|
||||
.pfn = __phys_to_pfn(ENP2611_CALEB_PHYS_BASE),
|
||||
.length = ENP2611_CALEB_SIZE,
|
||||
.type = MT_IXP2000_DEVICE,
|
||||
}, {
|
||||
.virtual = ENP2611_PM3386_0_VIRT_BASE,
|
||||
.pfn = __phys_to_pfn(ENP2611_PM3386_0_PHYS_BASE),
|
||||
.length = ENP2611_PM3386_0_SIZE,
|
||||
.type = MT_IXP2000_DEVICE,
|
||||
}, {
|
||||
.virtual = ENP2611_PM3386_1_VIRT_BASE,
|
||||
.pfn = __phys_to_pfn(ENP2611_PM3386_1_PHYS_BASE),
|
||||
.length = ENP2611_PM3386_1_SIZE,
|
||||
.type = MT_IXP2000_DEVICE,
|
||||
}
|
||||
};
|
||||
|
||||
void __init enp2611_map_io(void)
|
||||
{
|
||||
ixp2000_map_io();
|
||||
iotable_init(enp2611_io_desc, ARRAY_SIZE(enp2611_io_desc));
|
||||
}
|
||||
|
||||
|
||||
/*************************************************************************
|
||||
* ENP-2611 PCI
|
||||
*************************************************************************/
|
||||
|
@ -229,7 +258,7 @@ MACHINE_START(ENP2611, "Radisys ENP-2611 PCI network processor board")
|
|||
.phys_io = IXP2000_UART_PHYS_BASE,
|
||||
.io_pg_offst = ((IXP2000_UART_VIRT_BASE) >> 18) & 0xfffc,
|
||||
.boot_params = 0x00000100,
|
||||
.map_io = ixp2000_map_io,
|
||||
.map_io = enp2611_map_io,
|
||||
.init_irq = ixp2000_init_irq,
|
||||
.timer = &enp2611_timer,
|
||||
.init_machine = enp2611_init_machine,
|
||||
|
|
|
@ -20,7 +20,7 @@
|
|||
#include <linux/mm.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/bitops.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/ioport.h>
|
||||
|
@ -81,7 +81,7 @@ static void ixdp2x00_irq_mask(unsigned int irq)
|
|||
|
||||
dummy = *board_irq_mask;
|
||||
dummy |= IXP2000_BOARD_IRQ_MASK(irq);
|
||||
ixp2000_reg_write(board_irq_mask, dummy);
|
||||
ixp2000_reg_wrb(board_irq_mask, dummy);
|
||||
|
||||
#ifdef CONFIG_ARCH_IXDP2400
|
||||
if (machine_is_ixdp2400())
|
||||
|
@ -101,7 +101,7 @@ static void ixdp2x00_irq_unmask(unsigned int irq)
|
|||
|
||||
dummy = *board_irq_mask;
|
||||
dummy &= ~IXP2000_BOARD_IRQ_MASK(irq);
|
||||
ixp2000_reg_write(board_irq_mask, dummy);
|
||||
ixp2000_reg_wrb(board_irq_mask, dummy);
|
||||
|
||||
if (machine_is_ixdp2400())
|
||||
ixp2000_release_slowport(&old_cfg);
|
||||
|
|
|
@ -29,7 +29,7 @@
|
|||
#include <linux/serial.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/io.h>
|
||||
#include <asm/irq.h>
|
||||
|
@ -51,7 +51,7 @@
|
|||
*************************************************************************/
|
||||
static void ixdp2x01_irq_mask(unsigned int irq)
|
||||
{
|
||||
ixp2000_reg_write(IXDP2X01_INT_MASK_SET_REG,
|
||||
ixp2000_reg_wrb(IXDP2X01_INT_MASK_SET_REG,
|
||||
IXP2000_BOARD_IRQ_MASK(irq));
|
||||
}
|
||||
|
||||
|
@ -114,7 +114,7 @@ void __init ixdp2x01_init_irq(void)
|
|||
|
||||
/* Mask all interrupts from CPLD, disable simulation */
|
||||
ixp2000_reg_write(IXDP2X01_INT_MASK_SET_REG, 0xffffffff);
|
||||
ixp2000_reg_write(IXDP2X01_INT_SIM_REG, 0);
|
||||
ixp2000_reg_wrb(IXDP2X01_INT_SIM_REG, 0);
|
||||
|
||||
for (irq = NR_IXP2000_IRQS; irq < NR_IXDP2X01_IRQS; irq++) {
|
||||
if (irq & valid_irq_mask) {
|
||||
|
@ -299,7 +299,6 @@ struct hw_pci ixdp2x01_pci __initdata = {
|
|||
|
||||
int __init ixdp2x01_pci_init(void)
|
||||
{
|
||||
|
||||
pci_common_init(&ixdp2x01_pci);
|
||||
return 0;
|
||||
}
|
||||
|
@ -316,7 +315,7 @@ static struct flash_platform_data ixdp2x01_flash_platform_data = {
|
|||
|
||||
static unsigned long ixdp2x01_flash_bank_setup(unsigned long ofs)
|
||||
{
|
||||
ixp2000_reg_write(IXDP2X01_CPLD_FLASH_REG,
|
||||
ixp2000_reg_wrb(IXDP2X01_CPLD_FLASH_REG,
|
||||
((ofs >> IXDP2X01_FLASH_WINDOW_BITS) | IXDP2X01_CPLD_FLASH_INTERN));
|
||||
return (ofs & IXDP2X01_FLASH_WINDOW_MASK);
|
||||
}
|
||||
|
@ -363,7 +362,7 @@ static struct platform_device *ixdp2x01_devices[] __initdata = {
|
|||
|
||||
static void __init ixdp2x01_init_machine(void)
|
||||
{
|
||||
ixp2000_reg_write(IXDP2X01_CPLD_FLASH_REG,
|
||||
ixp2000_reg_wrb(IXDP2X01_CPLD_FLASH_REG,
|
||||
(IXDP2X01_CPLD_FLASH_BANK_MASK | IXDP2X01_CPLD_FLASH_INTERN));
|
||||
|
||||
ixdp2x01_flash_data.nr_banks =
|
||||
|
|
|
@ -148,7 +148,7 @@ int ixp2000_pci_abort_handler(unsigned long addr, unsigned int fsr, struct pt_re
|
|||
local_irq_save(flags);
|
||||
temp = *(IXP2000_PCI_CONTROL);
|
||||
if (temp & ((1 << 8) | (1 << 5))) {
|
||||
ixp2000_reg_write(IXP2000_PCI_CONTROL, temp);
|
||||
ixp2000_reg_wrb(IXP2000_PCI_CONTROL, temp);
|
||||
}
|
||||
|
||||
temp = *(IXP2000_PCI_CMDSTAT);
|
||||
|
@ -178,8 +178,8 @@ clear_master_aborts(void)
|
|||
|
||||
local_irq_save(flags);
|
||||
temp = *(IXP2000_PCI_CONTROL);
|
||||
if (temp & ((1 << 8) | (1 << 5))) {
|
||||
ixp2000_reg_write(IXP2000_PCI_CONTROL, temp);
|
||||
if (temp & ((1 << 8) | (1 << 5))) {
|
||||
ixp2000_reg_wrb(IXP2000_PCI_CONTROL, temp);
|
||||
}
|
||||
|
||||
temp = *(IXP2000_PCI_CMDSTAT);
|
||||
|
|
474
arch/arm/mach-ixp2000/uengine.c
Normal file
474
arch/arm/mach-ixp2000/uengine.c
Normal file
|
@ -0,0 +1,474 @@
|
|||
/*
|
||||
* Generic library functions for the microengines found on the Intel
|
||||
* IXP2000 series of network processors.
|
||||
*
|
||||
* Copyright (C) 2004, 2005 Lennert Buytenhek <buytenh@wantstofly.org>
|
||||
* Dedicated to Marija Kulikova.
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify
|
||||
* it under the terms of the GNU Lesser General Public License as
|
||||
* published by the Free Software Foundation; either version 2.1 of the
|
||||
* License, or (at your option) any later version.
|
||||
*/
|
||||
|
||||
#include <linux/config.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/string.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/arch/ixp2000-regs.h>
|
||||
#include <asm/arch/uengine.h>
|
||||
#include <asm/io.h>
|
||||
|
||||
#define USTORE_ADDRESS 0x000
|
||||
#define USTORE_DATA_LOWER 0x004
|
||||
#define USTORE_DATA_UPPER 0x008
|
||||
#define CTX_ENABLES 0x018
|
||||
#define CC_ENABLE 0x01c
|
||||
#define CSR_CTX_POINTER 0x020
|
||||
#define INDIRECT_CTX_STS 0x040
|
||||
#define ACTIVE_CTX_STS 0x044
|
||||
#define INDIRECT_CTX_SIG_EVENTS 0x048
|
||||
#define INDIRECT_CTX_WAKEUP_EVENTS 0x050
|
||||
#define NN_PUT 0x080
|
||||
#define NN_GET 0x084
|
||||
#define TIMESTAMP_LOW 0x0c0
|
||||
#define TIMESTAMP_HIGH 0x0c4
|
||||
#define T_INDEX_BYTE_INDEX 0x0f4
|
||||
#define LOCAL_CSR_STATUS 0x180
|
||||
|
||||
u32 ixp2000_uengine_mask;
|
||||
|
||||
static void *ixp2000_uengine_csr_area(int uengine)
|
||||
{
|
||||
return ((void *)IXP2000_UENGINE_CSR_VIRT_BASE) + (uengine << 10);
|
||||
}
|
||||
|
||||
/*
|
||||
* LOCAL_CSR_STATUS=1 after a read or write to a microengine's CSR
|
||||
* space means that the microengine we tried to access was also trying
|
||||
* to access its own CSR space on the same clock cycle as we did. When
|
||||
* this happens, we lose the arbitration process by default, and the
|
||||
* read or write we tried to do was not actually performed, so we try
|
||||
* again until it succeeds.
|
||||
*/
|
||||
u32 ixp2000_uengine_csr_read(int uengine, int offset)
|
||||
{
|
||||
void *uebase;
|
||||
u32 *local_csr_status;
|
||||
u32 *reg;
|
||||
u32 value;
|
||||
|
||||
uebase = ixp2000_uengine_csr_area(uengine);
|
||||
|
||||
local_csr_status = (u32 *)(uebase + LOCAL_CSR_STATUS);
|
||||
reg = (u32 *)(uebase + offset);
|
||||
do {
|
||||
value = ixp2000_reg_read(reg);
|
||||
} while (ixp2000_reg_read(local_csr_status) & 1);
|
||||
|
||||
return value;
|
||||
}
|
||||
EXPORT_SYMBOL(ixp2000_uengine_csr_read);
|
||||
|
||||
void ixp2000_uengine_csr_write(int uengine, int offset, u32 value)
|
||||
{
|
||||
void *uebase;
|
||||
u32 *local_csr_status;
|
||||
u32 *reg;
|
||||
|
||||
uebase = ixp2000_uengine_csr_area(uengine);
|
||||
|
||||
local_csr_status = (u32 *)(uebase + LOCAL_CSR_STATUS);
|
||||
reg = (u32 *)(uebase + offset);
|
||||
do {
|
||||
ixp2000_reg_write(reg, value);
|
||||
} while (ixp2000_reg_read(local_csr_status) & 1);
|
||||
}
|
||||
EXPORT_SYMBOL(ixp2000_uengine_csr_write);
|
||||
|
||||
void ixp2000_uengine_reset(u32 uengine_mask)
|
||||
{
|
||||
ixp2000_reg_write(IXP2000_RESET1, uengine_mask & ixp2000_uengine_mask);
|
||||
ixp2000_reg_write(IXP2000_RESET1, 0);
|
||||
}
|
||||
EXPORT_SYMBOL(ixp2000_uengine_reset);
|
||||
|
||||
void ixp2000_uengine_set_mode(int uengine, u32 mode)
|
||||
{
|
||||
/*
|
||||
* CTL_STR_PAR_EN: unconditionally enable parity checking on
|
||||
* control store.
|
||||
*/
|
||||
mode |= 0x10000000;
|
||||
ixp2000_uengine_csr_write(uengine, CTX_ENABLES, mode);
|
||||
|
||||
/*
|
||||
* Enable updating of condition codes.
|
||||
*/
|
||||
ixp2000_uengine_csr_write(uengine, CC_ENABLE, 0x00002000);
|
||||
|
||||
/*
|
||||
* Initialise other per-microengine registers.
|
||||
*/
|
||||
ixp2000_uengine_csr_write(uengine, NN_PUT, 0x00);
|
||||
ixp2000_uengine_csr_write(uengine, NN_GET, 0x00);
|
||||
ixp2000_uengine_csr_write(uengine, T_INDEX_BYTE_INDEX, 0);
|
||||
}
|
||||
EXPORT_SYMBOL(ixp2000_uengine_set_mode);
|
||||
|
||||
static int make_even_parity(u32 x)
|
||||
{
|
||||
return hweight32(x) & 1;
|
||||
}
|
||||
|
||||
static void ustore_write(int uengine, u64 insn)
|
||||
{
|
||||
/*
|
||||
* Generate even parity for top and bottom 20 bits.
|
||||
*/
|
||||
insn |= (u64)make_even_parity((insn >> 20) & 0x000fffff) << 41;
|
||||
insn |= (u64)make_even_parity(insn & 0x000fffff) << 40;
|
||||
|
||||
/*
|
||||
* Write to microstore. The second write auto-increments
|
||||
* the USTORE_ADDRESS index register.
|
||||
*/
|
||||
ixp2000_uengine_csr_write(uengine, USTORE_DATA_LOWER, (u32)insn);
|
||||
ixp2000_uengine_csr_write(uengine, USTORE_DATA_UPPER, (u32)(insn >> 32));
|
||||
}
|
||||
|
||||
void ixp2000_uengine_load_microcode(int uengine, u8 *ucode, int insns)
|
||||
{
|
||||
int i;
|
||||
|
||||
/*
|
||||
* Start writing to microstore at address 0.
|
||||
*/
|
||||
ixp2000_uengine_csr_write(uengine, USTORE_ADDRESS, 0x80000000);
|
||||
for (i = 0; i < insns; i++) {
|
||||
u64 insn;
|
||||
|
||||
insn = (((u64)ucode[0]) << 32) |
|
||||
(((u64)ucode[1]) << 24) |
|
||||
(((u64)ucode[2]) << 16) |
|
||||
(((u64)ucode[3]) << 8) |
|
||||
((u64)ucode[4]);
|
||||
ucode += 5;
|
||||
|
||||
ustore_write(uengine, insn);
|
||||
}
|
||||
|
||||
/*
|
||||
* Pad with a few NOPs at the end (to avoid the microengine
|
||||
* aborting as it prefetches beyond the last instruction), unless
|
||||
* we run off the end of the instruction store first, at which
|
||||
* point the address register will wrap back to zero.
|
||||
*/
|
||||
for (i = 0; i < 4; i++) {
|
||||
u32 addr;
|
||||
|
||||
addr = ixp2000_uengine_csr_read(uengine, USTORE_ADDRESS);
|
||||
if (addr == 0x80000000)
|
||||
break;
|
||||
ustore_write(uengine, 0xf0000c0300ULL);
|
||||
}
|
||||
|
||||
/*
|
||||
* End programming.
|
||||
*/
|
||||
ixp2000_uengine_csr_write(uengine, USTORE_ADDRESS, 0x00000000);
|
||||
}
|
||||
EXPORT_SYMBOL(ixp2000_uengine_load_microcode);
|
||||
|
||||
void ixp2000_uengine_init_context(int uengine, int context, int pc)
|
||||
{
|
||||
/*
|
||||
* Select the right context for indirect access.
|
||||
*/
|
||||
ixp2000_uengine_csr_write(uengine, CSR_CTX_POINTER, context);
|
||||
|
||||
/*
|
||||
* Initialise signal masks to immediately go to Ready state.
|
||||
*/
|
||||
ixp2000_uengine_csr_write(uengine, INDIRECT_CTX_SIG_EVENTS, 1);
|
||||
ixp2000_uengine_csr_write(uengine, INDIRECT_CTX_WAKEUP_EVENTS, 1);
|
||||
|
||||
/*
|
||||
* Set program counter.
|
||||
*/
|
||||
ixp2000_uengine_csr_write(uengine, INDIRECT_CTX_STS, pc);
|
||||
}
|
||||
EXPORT_SYMBOL(ixp2000_uengine_init_context);
|
||||
|
||||
void ixp2000_uengine_start_contexts(int uengine, u8 ctx_mask)
|
||||
{
|
||||
u32 mask;
|
||||
|
||||
/*
|
||||
* Enable the specified context to go to Executing state.
|
||||
*/
|
||||
mask = ixp2000_uengine_csr_read(uengine, CTX_ENABLES);
|
||||
mask |= ctx_mask << 8;
|
||||
ixp2000_uengine_csr_write(uengine, CTX_ENABLES, mask);
|
||||
}
|
||||
EXPORT_SYMBOL(ixp2000_uengine_start_contexts);
|
||||
|
||||
void ixp2000_uengine_stop_contexts(int uengine, u8 ctx_mask)
|
||||
{
|
||||
u32 mask;
|
||||
|
||||
/*
|
||||
* Disable the Ready->Executing transition. Note that this
|
||||
* does not stop the context until it voluntarily yields.
|
||||
*/
|
||||
mask = ixp2000_uengine_csr_read(uengine, CTX_ENABLES);
|
||||
mask &= ~(ctx_mask << 8);
|
||||
ixp2000_uengine_csr_write(uengine, CTX_ENABLES, mask);
|
||||
}
|
||||
EXPORT_SYMBOL(ixp2000_uengine_stop_contexts);
|
||||
|
||||
static int check_ixp_type(struct ixp2000_uengine_code *c)
|
||||
{
|
||||
u32 product_id;
|
||||
u32 rev;
|
||||
|
||||
product_id = ixp2000_reg_read(IXP2000_PRODUCT_ID);
|
||||
if (((product_id >> 16) & 0x1f) != 0)
|
||||
return 0;
|
||||
|
||||
switch ((product_id >> 8) & 0xff) {
|
||||
case 0: /* IXP2800 */
|
||||
if (!(c->cpu_model_bitmask & 4))
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case 1: /* IXP2850 */
|
||||
if (!(c->cpu_model_bitmask & 8))
|
||||
return 0;
|
||||
break;
|
||||
|
||||
case 2: /* IXP2400 */
|
||||
if (!(c->cpu_model_bitmask & 2))
|
||||
return 0;
|
||||
break;
|
||||
|
||||
default:
|
||||
return 0;
|
||||
}
|
||||
|
||||
rev = product_id & 0xff;
|
||||
if (rev < c->cpu_min_revision || rev > c->cpu_max_revision)
|
||||
return 0;
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
static void generate_ucode(u8 *ucode, u32 *gpr_a, u32 *gpr_b)
|
||||
{
|
||||
int offset;
|
||||
int i;
|
||||
|
||||
offset = 0;
|
||||
|
||||
for (i = 0; i < 128; i++) {
|
||||
u8 b3;
|
||||
u8 b2;
|
||||
u8 b1;
|
||||
u8 b0;
|
||||
|
||||
b3 = (gpr_a[i] >> 24) & 0xff;
|
||||
b2 = (gpr_a[i] >> 16) & 0xff;
|
||||
b1 = (gpr_a[i] >> 8) & 0xff;
|
||||
b0 = gpr_a[i] & 0xff;
|
||||
|
||||
// immed[@ai, (b1 << 8) | b0]
|
||||
// 11110000 0000VVVV VVVV11VV VVVVVV00 1IIIIIII
|
||||
ucode[offset++] = 0xf0;
|
||||
ucode[offset++] = (b1 >> 4);
|
||||
ucode[offset++] = (b1 << 4) | 0x0c | (b0 >> 6);
|
||||
ucode[offset++] = (b0 << 2);
|
||||
ucode[offset++] = 0x80 | i;
|
||||
|
||||
// immed_w1[@ai, (b3 << 8) | b2]
|
||||
// 11110100 0100VVVV VVVV11VV VVVVVV00 1IIIIIII
|
||||
ucode[offset++] = 0xf4;
|
||||
ucode[offset++] = 0x40 | (b3 >> 4);
|
||||
ucode[offset++] = (b3 << 4) | 0x0c | (b2 >> 6);
|
||||
ucode[offset++] = (b2 << 2);
|
||||
ucode[offset++] = 0x80 | i;
|
||||
}
|
||||
|
||||
for (i = 0; i < 128; i++) {
|
||||
u8 b3;
|
||||
u8 b2;
|
||||
u8 b1;
|
||||
u8 b0;
|
||||
|
||||
b3 = (gpr_b[i] >> 24) & 0xff;
|
||||
b2 = (gpr_b[i] >> 16) & 0xff;
|
||||
b1 = (gpr_b[i] >> 8) & 0xff;
|
||||
b0 = gpr_b[i] & 0xff;
|
||||
|
||||
// immed[@bi, (b1 << 8) | b0]
|
||||
// 11110000 0000VVVV VVVV001I IIIIII11 VVVVVVVV
|
||||
ucode[offset++] = 0xf0;
|
||||
ucode[offset++] = (b1 >> 4);
|
||||
ucode[offset++] = (b1 << 4) | 0x02 | (i >> 6);
|
||||
ucode[offset++] = (i << 2) | 0x03;
|
||||
ucode[offset++] = b0;
|
||||
|
||||
// immed_w1[@bi, (b3 << 8) | b2]
|
||||
// 11110100 0100VVVV VVVV001I IIIIII11 VVVVVVVV
|
||||
ucode[offset++] = 0xf4;
|
||||
ucode[offset++] = 0x40 | (b3 >> 4);
|
||||
ucode[offset++] = (b3 << 4) | 0x02 | (i >> 6);
|
||||
ucode[offset++] = (i << 2) | 0x03;
|
||||
ucode[offset++] = b2;
|
||||
}
|
||||
|
||||
// ctx_arb[kill]
|
||||
ucode[offset++] = 0xe0;
|
||||
ucode[offset++] = 0x00;
|
||||
ucode[offset++] = 0x01;
|
||||
ucode[offset++] = 0x00;
|
||||
ucode[offset++] = 0x00;
|
||||
}
|
||||
|
||||
static int set_initial_registers(int uengine, struct ixp2000_uengine_code *c)
|
||||
{
|
||||
int per_ctx_regs;
|
||||
u32 *gpr_a;
|
||||
u32 *gpr_b;
|
||||
u8 *ucode;
|
||||
int i;
|
||||
|
||||
gpr_a = kmalloc(128 * sizeof(u32), GFP_KERNEL);
|
||||
gpr_b = kmalloc(128 * sizeof(u32), GFP_KERNEL);
|
||||
ucode = kmalloc(513 * 5, GFP_KERNEL);
|
||||
if (gpr_a == NULL || gpr_b == NULL || ucode == NULL) {
|
||||
kfree(ucode);
|
||||
kfree(gpr_b);
|
||||
kfree(gpr_a);
|
||||
return 1;
|
||||
}
|
||||
|
||||
per_ctx_regs = 16;
|
||||
if (c->uengine_parameters & IXP2000_UENGINE_4_CONTEXTS)
|
||||
per_ctx_regs = 32;
|
||||
|
||||
memset(gpr_a, 0, sizeof(gpr_a));
|
||||
memset(gpr_b, 0, sizeof(gpr_b));
|
||||
for (i = 0; i < 256; i++) {
|
||||
struct ixp2000_reg_value *r = c->initial_reg_values + i;
|
||||
u32 *bank;
|
||||
int inc;
|
||||
int j;
|
||||
|
||||
if (r->reg == -1)
|
||||
break;
|
||||
|
||||
bank = (r->reg & 0x400) ? gpr_b : gpr_a;
|
||||
inc = (r->reg & 0x80) ? 128 : per_ctx_regs;
|
||||
|
||||
j = r->reg & 0x7f;
|
||||
while (j < 128) {
|
||||
bank[j] = r->value;
|
||||
j += inc;
|
||||
}
|
||||
}
|
||||
|
||||
generate_ucode(ucode, gpr_a, gpr_b);
|
||||
ixp2000_uengine_load_microcode(uengine, ucode, 513);
|
||||
ixp2000_uengine_init_context(uengine, 0, 0);
|
||||
ixp2000_uengine_start_contexts(uengine, 0x01);
|
||||
for (i = 0; i < 100; i++) {
|
||||
u32 status;
|
||||
|
||||
status = ixp2000_uengine_csr_read(uengine, ACTIVE_CTX_STS);
|
||||
if (!(status & 0x80000000))
|
||||
break;
|
||||
}
|
||||
ixp2000_uengine_stop_contexts(uengine, 0x01);
|
||||
|
||||
kfree(ucode);
|
||||
kfree(gpr_b);
|
||||
kfree(gpr_a);
|
||||
|
||||
return !!(i == 100);
|
||||
}
|
||||
|
||||
int ixp2000_uengine_load(int uengine, struct ixp2000_uengine_code *c)
|
||||
{
|
||||
int ctx;
|
||||
|
||||
if (!check_ixp_type(c))
|
||||
return 1;
|
||||
|
||||
if (!(ixp2000_uengine_mask & (1 << uengine)))
|
||||
return 1;
|
||||
|
||||
ixp2000_uengine_reset(1 << uengine);
|
||||
ixp2000_uengine_set_mode(uengine, c->uengine_parameters);
|
||||
if (set_initial_registers(uengine, c))
|
||||
return 1;
|
||||
ixp2000_uengine_load_microcode(uengine, c->insns, c->num_insns);
|
||||
|
||||
for (ctx = 0; ctx < 8; ctx++)
|
||||
ixp2000_uengine_init_context(uengine, ctx, 0);
|
||||
|
||||
return 0;
|
||||
}
|
||||
EXPORT_SYMBOL(ixp2000_uengine_load);
|
||||
|
||||
|
||||
static int __init ixp2000_uengine_init(void)
|
||||
{
|
||||
int uengine;
|
||||
u32 value;
|
||||
|
||||
/*
|
||||
* Determine number of microengines present.
|
||||
*/
|
||||
switch ((ixp2000_reg_read(IXP2000_PRODUCT_ID) >> 8) & 0x1fff) {
|
||||
case 0: /* IXP2800 */
|
||||
case 1: /* IXP2850 */
|
||||
ixp2000_uengine_mask = 0x00ff00ff;
|
||||
break;
|
||||
|
||||
case 2: /* IXP2400 */
|
||||
ixp2000_uengine_mask = 0x000f000f;
|
||||
break;
|
||||
|
||||
default:
|
||||
printk(KERN_INFO "Detected unknown IXP2000 model (%.8x)\n",
|
||||
(unsigned int)ixp2000_reg_read(IXP2000_PRODUCT_ID));
|
||||
ixp2000_uengine_mask = 0x00000000;
|
||||
break;
|
||||
}
|
||||
|
||||
/*
|
||||
* Reset microengines.
|
||||
*/
|
||||
ixp2000_reg_write(IXP2000_RESET1, ixp2000_uengine_mask);
|
||||
ixp2000_reg_write(IXP2000_RESET1, 0);
|
||||
|
||||
/*
|
||||
* Synchronise timestamp counters across all microengines.
|
||||
*/
|
||||
value = ixp2000_reg_read(IXP2000_MISC_CONTROL);
|
||||
ixp2000_reg_write(IXP2000_MISC_CONTROL, value & ~0x80);
|
||||
for (uengine = 0; uengine < 32; uengine++) {
|
||||
if (ixp2000_uengine_mask & (1 << uengine)) {
|
||||
ixp2000_uengine_csr_write(uengine, TIMESTAMP_LOW, 0);
|
||||
ixp2000_uengine_csr_write(uengine, TIMESTAMP_HIGH, 0);
|
||||
}
|
||||
}
|
||||
ixp2000_reg_write(IXP2000_MISC_CONTROL, value | 0x80);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
subsys_initcall(ixp2000_uengine_init);
|
|
@ -20,6 +20,7 @@
|
|||
#include <linux/serial.h>
|
||||
#include <linux/sched.h>
|
||||
#include <linux/tty.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/serial_core.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
|
|
@ -10,7 +10,7 @@
|
|||
|
||||
#include <linux/tty.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
|
|
|
@ -21,7 +21,7 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
|
|
@ -19,7 +19,7 @@
|
|||
#include <linux/init.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
|
|
@ -11,7 +11,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
|
|
|
@ -28,7 +28,7 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
||||
#include <linux/mtd/mtd.h>
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
*/
|
||||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/kernel.h>
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/io.h>
|
||||
|
|
|
@ -14,7 +14,7 @@
|
|||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/fs.h>
|
||||
#include <linux/interrupt.h>
|
||||
|
@ -33,6 +33,7 @@
|
|||
|
||||
#include <asm/arch/pxa-regs.h>
|
||||
#include <asm/arch/irq.h>
|
||||
#include <asm/arch/irda.h>
|
||||
#include <asm/arch/mmc.h>
|
||||
#include <asm/arch/udc.h>
|
||||
#include <asm/arch/corgi.h>
|
||||
|
@ -224,6 +225,22 @@ static struct pxamci_platform_data corgi_mci_platform_data = {
|
|||
};
|
||||
|
||||
|
||||
/*
|
||||
* Irda
|
||||
*/
|
||||
static void corgi_irda_transceiver_mode(struct device *dev, int mode)
|
||||
{
|
||||
if (mode & IR_OFF)
|
||||
GPSR(CORGI_GPIO_IR_ON) = GPIO_bit(CORGI_GPIO_IR_ON);
|
||||
else
|
||||
GPCR(CORGI_GPIO_IR_ON) = GPIO_bit(CORGI_GPIO_IR_ON);
|
||||
}
|
||||
|
||||
static struct pxaficp_platform_data corgi_ficp_platform_data = {
|
||||
.transceiver_cap = IR_SIRMODE | IR_OFF,
|
||||
.transceiver_mode = corgi_irda_transceiver_mode,
|
||||
};
|
||||
|
||||
|
||||
/*
|
||||
* USB Device Controller
|
||||
|
@ -269,10 +286,13 @@ static void __init corgi_init(void)
|
|||
|
||||
corgi_ssp_set_machinfo(&corgi_ssp_machinfo);
|
||||
|
||||
pxa_gpio_mode(CORGI_GPIO_IR_ON | GPIO_OUT);
|
||||
pxa_gpio_mode(CORGI_GPIO_USB_PULLUP | GPIO_OUT);
|
||||
pxa_gpio_mode(CORGI_GPIO_HSYNC | GPIO_IN);
|
||||
|
||||
pxa_set_udc_info(&udc_info);
|
||||
pxa_set_mci_info(&corgi_mci_platform_data);
|
||||
pxa_set_ficp_info(&corgi_ficp_platform_data);
|
||||
|
||||
scoop_num = 1;
|
||||
scoop_devs = &corgi_pcmcia_scoop[0];
|
||||
|
|
|
@ -17,7 +17,7 @@
|
|||
|
||||
#include <linux/delay.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/module.h>
|
||||
#include <asm/arch/akita.h>
|
||||
#include <asm/arch/corgi.h>
|
||||
|
|
|
@ -15,7 +15,7 @@
|
|||
#include <linux/sched.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
|
|
|
@ -20,9 +20,10 @@
|
|||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/pm.h>
|
||||
#include <linux/string.h>
|
||||
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
|
|
|
@ -18,7 +18,7 @@
|
|||
|
||||
#include <linux/init.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/fb.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
|
|
|
@ -14,21 +14,25 @@
|
|||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/sysdev.h>
|
||||
#include <linux/major.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/mtd/mtd.h>
|
||||
#include <linux/mtd/partitions.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/memory.h>
|
||||
#include <asm/mach-types.h>
|
||||
#include <asm/hardware.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/sizes.h>
|
||||
|
||||
#include <asm/mach/arch.h>
|
||||
#include <asm/mach/map.h>
|
||||
#include <asm/mach/irq.h>
|
||||
#include <asm/mach/flash.h>
|
||||
|
||||
#include <asm/hardware/sa1111.h>
|
||||
|
||||
|
@ -175,7 +179,7 @@ static struct platform_device sa1111_device = {
|
|||
static struct resource smc91x_resources[] = {
|
||||
[0] = {
|
||||
.name = "smc91x-regs",
|
||||
.start = 0x0c000000,
|
||||
.start = 0x0c000c00,
|
||||
.end = 0x0c0fffff,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
|
@ -199,10 +203,75 @@ static struct platform_device smc91x_device = {
|
|||
.resource = smc91x_resources,
|
||||
};
|
||||
|
||||
static struct resource flash_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x00000000,
|
||||
.end = SZ_64M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
[1] = {
|
||||
.start = 0x04000000,
|
||||
.end = 0x04000000 + SZ_64M - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct mtd_partition lubbock_partitions[] = {
|
||||
{
|
||||
.name = "Bootloader",
|
||||
.size = 0x00040000,
|
||||
.offset = 0,
|
||||
.mask_flags = MTD_WRITEABLE /* force read-only */
|
||||
},{
|
||||
.name = "Kernel",
|
||||
.size = 0x00100000,
|
||||
.offset = 0x00040000,
|
||||
},{
|
||||
.name = "Filesystem",
|
||||
.size = MTDPART_SIZ_FULL,
|
||||
.offset = 0x00140000
|
||||
}
|
||||
};
|
||||
|
||||
static struct flash_platform_data lubbock_flash_data[2] = {
|
||||
{
|
||||
.map_name = "cfi_probe",
|
||||
.parts = lubbock_partitions,
|
||||
.nr_parts = ARRAY_SIZE(lubbock_partitions),
|
||||
}, {
|
||||
.map_name = "cfi_probe",
|
||||
.parts = NULL,
|
||||
.nr_parts = 0,
|
||||
}
|
||||
};
|
||||
|
||||
static struct platform_device lubbock_flash_device[2] = {
|
||||
{
|
||||
.name = "pxa2xx-flash",
|
||||
.id = 0,
|
||||
.dev = {
|
||||
.platform_data = &lubbock_flash_data[0],
|
||||
},
|
||||
.resource = &flash_resources[0],
|
||||
.num_resources = 1,
|
||||
},
|
||||
{
|
||||
.name = "pxa2xx-flash",
|
||||
.id = 1,
|
||||
.dev = {
|
||||
.platform_data = &lubbock_flash_data[1],
|
||||
},
|
||||
.resource = &flash_resources[1],
|
||||
.num_resources = 1,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *devices[] __initdata = {
|
||||
&sa1111_device,
|
||||
&lub_audio_device,
|
||||
&smc91x_device,
|
||||
&lubbock_flash_device[0],
|
||||
&lubbock_flash_device[1],
|
||||
};
|
||||
|
||||
static struct pxafb_mach_info sharp_lm8v31 __initdata = {
|
||||
|
@ -224,18 +293,75 @@ static struct pxafb_mach_info sharp_lm8v31 __initdata = {
|
|||
.lccr3 = LCCR3_PCP | LCCR3_Acb(255),
|
||||
};
|
||||
|
||||
static int lubbock_mci_init(struct device *dev, irqreturn_t (*lubbock_detect_int)(int, void *, struct pt_regs *), void *data)
|
||||
#define MMC_POLL_RATE msecs_to_jiffies(1000)
|
||||
|
||||
static void lubbock_mmc_poll(unsigned long);
|
||||
static irqreturn_t (*mmc_detect_int)(int, void *, struct pt_regs *);
|
||||
|
||||
static struct timer_list mmc_timer = {
|
||||
.function = lubbock_mmc_poll,
|
||||
};
|
||||
|
||||
static void lubbock_mmc_poll(unsigned long data)
|
||||
{
|
||||
unsigned long flags;
|
||||
|
||||
/* clear any previous irq state, then ... */
|
||||
local_irq_save(flags);
|
||||
LUB_IRQ_SET_CLR &= ~(1 << 0);
|
||||
local_irq_restore(flags);
|
||||
|
||||
/* poll until mmc/sd card is removed */
|
||||
if (LUB_IRQ_SET_CLR & (1 << 0))
|
||||
mod_timer(&mmc_timer, jiffies + MMC_POLL_RATE);
|
||||
else {
|
||||
(void) mmc_detect_int(LUBBOCK_SD_IRQ, (void *)data, NULL);
|
||||
enable_irq(LUBBOCK_SD_IRQ);
|
||||
}
|
||||
}
|
||||
|
||||
static irqreturn_t lubbock_detect_int(int irq, void *data, struct pt_regs *regs)
|
||||
{
|
||||
/* IRQ is level triggered; disable, and poll for removal */
|
||||
disable_irq(irq);
|
||||
mod_timer(&mmc_timer, jiffies + MMC_POLL_RATE);
|
||||
|
||||
return mmc_detect_int(irq, data, regs);
|
||||
}
|
||||
|
||||
static int lubbock_mci_init(struct device *dev,
|
||||
irqreturn_t (*detect_int)(int, void *, struct pt_regs *),
|
||||
void *data)
|
||||
{
|
||||
/* setup GPIO for PXA25x MMC controller */
|
||||
pxa_gpio_mode(GPIO6_MMCCLK_MD);
|
||||
pxa_gpio_mode(GPIO8_MMCCS0_MD);
|
||||
|
||||
return 0;
|
||||
/* detect card insert/eject */
|
||||
mmc_detect_int = detect_int;
|
||||
init_timer(&mmc_timer);
|
||||
mmc_timer.data = (unsigned long) data;
|
||||
return request_irq(LUBBOCK_SD_IRQ, lubbock_detect_int,
|
||||
SA_SAMPLE_RANDOM, "lubbock-sd-detect", data);
|
||||
}
|
||||
|
||||
static int lubbock_mci_get_ro(struct device *dev)
|
||||
{
|
||||
return (LUB_MISC_RD & (1 << 2)) != 0;
|
||||
}
|
||||
|
||||
static void lubbock_mci_exit(struct device *dev, void *data)
|
||||
{
|
||||
free_irq(LUBBOCK_SD_IRQ, data);
|
||||
del_timer_sync(&mmc_timer);
|
||||
}
|
||||
|
||||
static struct pxamci_platform_data lubbock_mci_platform_data = {
|
||||
.ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
|
||||
.detect_delay = 1,
|
||||
.init = lubbock_mci_init,
|
||||
.get_ro = lubbock_mci_get_ro,
|
||||
.exit = lubbock_mci_exit,
|
||||
};
|
||||
|
||||
static void lubbock_irda_transceiver_mode(struct device *dev, int mode)
|
||||
|
@ -258,10 +384,21 @@ static struct pxaficp_platform_data lubbock_ficp_platform_data = {
|
|||
|
||||
static void __init lubbock_init(void)
|
||||
{
|
||||
int flashboot = (LUB_CONF_SWITCHES & 1);
|
||||
|
||||
pxa_set_udc_info(&udc_info);
|
||||
set_pxa_fb_info(&sharp_lm8v31);
|
||||
pxa_set_mci_info(&lubbock_mci_platform_data);
|
||||
pxa_set_ficp_info(&lubbock_ficp_platform_data);
|
||||
|
||||
lubbock_flash_data[0].width = lubbock_flash_data[1].width =
|
||||
(BOOT_DEF & 1) ? 2 : 4;
|
||||
/* Compensate for the nROMBT switch which swaps the flash banks */
|
||||
printk(KERN_NOTICE "Lubbock configured to boot from %s (bank %d)\n",
|
||||
flashboot?"Flash":"ROM", flashboot);
|
||||
|
||||
lubbock_flash_data[flashboot^1].name = "application-flash";
|
||||
lubbock_flash_data[flashboot].name = "boot-rom";
|
||||
(void) platform_add_devices(devices, ARRAY_SIZE(devices));
|
||||
}
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue