Merge branch 'master' into next
Conflicts: include/linux/personality.h Use Linus' version. Signed-off-by: James Morris <jmorris@namei.org>
This commit is contained in:
commit
7d45ecafb6
|
@ -27,6 +27,7 @@
|
||||||
*.gz
|
*.gz
|
||||||
*.lzma
|
*.lzma
|
||||||
*.patch
|
*.patch
|
||||||
|
*.gcno
|
||||||
|
|
||||||
#
|
#
|
||||||
# Top-level generic files
|
# Top-level generic files
|
||||||
|
|
|
@ -184,8 +184,6 @@ usage should require reading the full document.
|
||||||
!Finclude/net/mac80211.h ieee80211_ctstoself_get
|
!Finclude/net/mac80211.h ieee80211_ctstoself_get
|
||||||
!Finclude/net/mac80211.h ieee80211_ctstoself_duration
|
!Finclude/net/mac80211.h ieee80211_ctstoself_duration
|
||||||
!Finclude/net/mac80211.h ieee80211_generic_frame_duration
|
!Finclude/net/mac80211.h ieee80211_generic_frame_duration
|
||||||
!Finclude/net/mac80211.h ieee80211_get_hdrlen_from_skb
|
|
||||||
!Finclude/net/mac80211.h ieee80211_hdrlen
|
|
||||||
!Finclude/net/mac80211.h ieee80211_wake_queue
|
!Finclude/net/mac80211.h ieee80211_wake_queue
|
||||||
!Finclude/net/mac80211.h ieee80211_stop_queue
|
!Finclude/net/mac80211.h ieee80211_stop_queue
|
||||||
!Finclude/net/mac80211.h ieee80211_wake_queues
|
!Finclude/net/mac80211.h ieee80211_wake_queues
|
||||||
|
|
|
@ -50,7 +50,7 @@ encouraged them to allow separation of the data and integrity metadata
|
||||||
scatter-gather lists.
|
scatter-gather lists.
|
||||||
|
|
||||||
The controller will interleave the buffers on write and split them on
|
The controller will interleave the buffers on write and split them on
|
||||||
read. This means that the Linux can DMA the data buffers to and from
|
read. This means that Linux can DMA the data buffers to and from
|
||||||
host memory without changes to the page cache.
|
host memory without changes to the page cache.
|
||||||
|
|
||||||
Also, the 16-bit CRC checksum mandated by both the SCSI and SATA specs
|
Also, the 16-bit CRC checksum mandated by both the SCSI and SATA specs
|
||||||
|
@ -66,7 +66,7 @@ software RAID5).
|
||||||
|
|
||||||
The IP checksum is weaker than the CRC in terms of detecting bit
|
The IP checksum is weaker than the CRC in terms of detecting bit
|
||||||
errors. However, the strength is really in the separation of the data
|
errors. However, the strength is really in the separation of the data
|
||||||
buffers and the integrity metadata. These two distinct buffers much
|
buffers and the integrity metadata. These two distinct buffers must
|
||||||
match up for an I/O to complete.
|
match up for an I/O to complete.
|
||||||
|
|
||||||
The separation of the data and integrity metadata buffers as well as
|
The separation of the data and integrity metadata buffers as well as
|
||||||
|
|
|
@ -777,6 +777,18 @@ in cpuset directories:
|
||||||
# /bin/echo 1-4 > cpus -> set cpus list to cpus 1,2,3,4
|
# /bin/echo 1-4 > cpus -> set cpus list to cpus 1,2,3,4
|
||||||
# /bin/echo 1,2,3,4 > cpus -> set cpus list to cpus 1,2,3,4
|
# /bin/echo 1,2,3,4 > cpus -> set cpus list to cpus 1,2,3,4
|
||||||
|
|
||||||
|
To add a CPU to a cpuset, write the new list of CPUs including the
|
||||||
|
CPU to be added. To add 6 to the above cpuset:
|
||||||
|
|
||||||
|
# /bin/echo 1-4,6 > cpus -> set cpus list to cpus 1,2,3,4,6
|
||||||
|
|
||||||
|
Similarly to remove a CPU from a cpuset, write the new list of CPUs
|
||||||
|
without the CPU to be removed.
|
||||||
|
|
||||||
|
To remove all the CPUs:
|
||||||
|
|
||||||
|
# /bin/echo "" > cpus -> clear cpus list
|
||||||
|
|
||||||
2.3 Setting flags
|
2.3 Setting flags
|
||||||
-----------------
|
-----------------
|
||||||
|
|
||||||
|
|
|
@ -25,7 +25,7 @@ use IO::Handle;
|
||||||
"tda10046lifeview", "av7110", "dec2000t", "dec2540t",
|
"tda10046lifeview", "av7110", "dec2000t", "dec2540t",
|
||||||
"dec3000s", "vp7041", "dibusb", "nxt2002", "nxt2004",
|
"dec3000s", "vp7041", "dibusb", "nxt2002", "nxt2004",
|
||||||
"or51211", "or51132_qam", "or51132_vsb", "bluebird",
|
"or51211", "or51132_qam", "or51132_vsb", "bluebird",
|
||||||
"opera1", "cx231xx", "cx18", "cx23885", "pvrusb2" );
|
"opera1", "cx231xx", "cx18", "cx23885", "pvrusb2", "mpc718" );
|
||||||
|
|
||||||
# Check args
|
# Check args
|
||||||
syntax() if (scalar(@ARGV) != 1);
|
syntax() if (scalar(@ARGV) != 1);
|
||||||
|
@ -381,6 +381,57 @@ sub cx18 {
|
||||||
$allfiles;
|
$allfiles;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
sub mpc718 {
|
||||||
|
my $archive = 'Yuan MPC718 TV Tuner Card 2.13.10.1016.zip';
|
||||||
|
my $url = "ftp://ftp.work.acer-euro.com/desktop/aspire_idea510/vista/Drivers/$archive";
|
||||||
|
my $fwfile = "dvb-cx18-mpc718-mt352.fw";
|
||||||
|
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
||||||
|
|
||||||
|
checkstandard();
|
||||||
|
wgetfile($archive, $url);
|
||||||
|
unzip($archive, $tmpdir);
|
||||||
|
|
||||||
|
my $sourcefile = "$tmpdir/Yuan MPC718 TV Tuner Card 2.13.10.1016/mpc718_32bit/yuanrap.sys";
|
||||||
|
my $found = 0;
|
||||||
|
|
||||||
|
open IN, '<', $sourcefile or die "Couldn't open $sourcefile to extract $fwfile data\n";
|
||||||
|
binmode IN;
|
||||||
|
open OUT, '>', $fwfile;
|
||||||
|
binmode OUT;
|
||||||
|
{
|
||||||
|
# Block scope because we change the line terminator variable $/
|
||||||
|
my $prevlen = 0;
|
||||||
|
my $currlen;
|
||||||
|
|
||||||
|
# Buried in the data segment are 3 runs of almost identical
|
||||||
|
# register-value pairs that end in 0x5d 0x01 which is a "TUNER GO"
|
||||||
|
# command for the MT352.
|
||||||
|
# Pull out the middle run (because it's easy) of register-value
|
||||||
|
# pairs to make the "firmware" file.
|
||||||
|
|
||||||
|
local $/ = "\x5d\x01"; # MT352 "TUNER GO"
|
||||||
|
|
||||||
|
while (<IN>) {
|
||||||
|
$currlen = length($_);
|
||||||
|
if ($prevlen == $currlen && $currlen <= 64) {
|
||||||
|
chop; chop; # Get rid of "TUNER GO"
|
||||||
|
s/^\0\0//; # get rid of leading 00 00 if it's there
|
||||||
|
printf OUT "$_";
|
||||||
|
$found = 1;
|
||||||
|
last;
|
||||||
|
}
|
||||||
|
$prevlen = $currlen;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
close OUT;
|
||||||
|
close IN;
|
||||||
|
if (!$found) {
|
||||||
|
unlink $fwfile;
|
||||||
|
die "Couldn't find valid register-value sequence in $sourcefile for $fwfile\n";
|
||||||
|
}
|
||||||
|
$fwfile;
|
||||||
|
}
|
||||||
|
|
||||||
sub cx23885 {
|
sub cx23885 {
|
||||||
my $url = "http://linuxtv.org/downloads/firmware/";
|
my $url = "http://linuxtv.org/downloads/firmware/";
|
||||||
|
|
||||||
|
|
|
@ -458,3 +458,13 @@ Why: Remove the old legacy 32bit machine check code. This has been
|
||||||
but the old version has been kept around for easier testing. Note this
|
but the old version has been kept around for easier testing. Note this
|
||||||
doesn't impact the old P5 and WinChip machine check handlers.
|
doesn't impact the old P5 and WinChip machine check handlers.
|
||||||
Who: Andi Kleen <andi@firstfloor.org>
|
Who: Andi Kleen <andi@firstfloor.org>
|
||||||
|
|
||||||
|
----------------------------
|
||||||
|
|
||||||
|
What: lock_policy_rwsem_* and unlock_policy_rwsem_* will not be
|
||||||
|
exported interface anymore.
|
||||||
|
When: 2.6.33
|
||||||
|
Why: cpu_policy_rwsem has a new cleaner definition making it local to
|
||||||
|
cpufreq core and contained inside cpufreq.c. Other dependent
|
||||||
|
drivers should not use it in order to safely avoid lockdep issues.
|
||||||
|
Who: Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
||||||
|
|
|
@ -188,13 +188,18 @@ Solution: Exclude affected source files from profiling by specifying
|
||||||
GCOV_PROFILE := n or GCOV_PROFILE_basename.o := n in the
|
GCOV_PROFILE := n or GCOV_PROFILE_basename.o := n in the
|
||||||
corresponding Makefile.
|
corresponding Makefile.
|
||||||
|
|
||||||
|
Problem: Files copied from sysfs appear empty or incomplete.
|
||||||
|
Cause: Due to the way seq_file works, some tools such as cp or tar
|
||||||
|
may not correctly copy files from sysfs.
|
||||||
|
Solution: Use 'cat' to read .gcda files and 'cp -d' to copy links.
|
||||||
|
Alternatively use the mechanism shown in Appendix B.
|
||||||
|
|
||||||
|
|
||||||
Appendix A: gather_on_build.sh
|
Appendix A: gather_on_build.sh
|
||||||
==============================
|
==============================
|
||||||
|
|
||||||
Sample script to gather coverage meta files on the build machine
|
Sample script to gather coverage meta files on the build machine
|
||||||
(see 6a):
|
(see 6a):
|
||||||
|
|
||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
KSRC=$1
|
KSRC=$1
|
||||||
|
@ -226,7 +231,7 @@ Appendix B: gather_on_test.sh
|
||||||
Sample script to gather coverage data files on the test machine
|
Sample script to gather coverage data files on the test machine
|
||||||
(see 6b):
|
(see 6b):
|
||||||
|
|
||||||
#!/bin/bash
|
#!/bin/bash -e
|
||||||
|
|
||||||
DEST=$1
|
DEST=$1
|
||||||
GCDA=/sys/kernel/debug/gcov
|
GCDA=/sys/kernel/debug/gcov
|
||||||
|
@ -236,11 +241,13 @@ if [ -z "$DEST" ] ; then
|
||||||
exit 1
|
exit 1
|
||||||
fi
|
fi
|
||||||
|
|
||||||
find $GCDA -name '*.gcno' -o -name '*.gcda' | tar cfz $DEST -T -
|
TEMPDIR=$(mktemp -d)
|
||||||
|
echo Collecting data..
|
||||||
|
find $GCDA -type d -exec mkdir -p $TEMPDIR/\{\} \;
|
||||||
|
find $GCDA -name '*.gcda' -exec sh -c 'cat < $0 > '$TEMPDIR'/$0' {} \;
|
||||||
|
find $GCDA -name '*.gcno' -exec sh -c 'cp -d $0 '$TEMPDIR'/$0' {} \;
|
||||||
|
tar czf $DEST -C $TEMPDIR sys
|
||||||
|
rm -rf $TEMPDIR
|
||||||
|
|
||||||
if [ $? -eq 0 ] ; then
|
echo "$DEST successfully created, copy to build system and unpack with:"
|
||||||
echo "$DEST successfully created, copy to build system and unpack with:"
|
echo " tar xfz $DEST"
|
||||||
echo " tar xfz $DEST"
|
|
||||||
else
|
|
||||||
echo "Could not create file $DEST"
|
|
||||||
fi
|
|
||||||
|
|
|
@ -1720,8 +1720,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
oprofile.cpu_type= Force an oprofile cpu type
|
oprofile.cpu_type= Force an oprofile cpu type
|
||||||
This might be useful if you have an older oprofile
|
This might be useful if you have an older oprofile
|
||||||
userland or if you want common events.
|
userland or if you want common events.
|
||||||
Format: { archperfmon }
|
Format: { arch_perfmon }
|
||||||
archperfmon: [X86] Force use of architectural
|
arch_perfmon: [X86] Force use of architectural
|
||||||
perfmon on Intel CPUs instead of the
|
perfmon on Intel CPUs instead of the
|
||||||
CPU specific event set.
|
CPU specific event set.
|
||||||
|
|
||||||
|
|
|
@ -16,13 +16,17 @@ Usage
|
||||||
-----
|
-----
|
||||||
|
|
||||||
CONFIG_DEBUG_KMEMLEAK in "Kernel hacking" has to be enabled. A kernel
|
CONFIG_DEBUG_KMEMLEAK in "Kernel hacking" has to be enabled. A kernel
|
||||||
thread scans the memory every 10 minutes (by default) and prints any new
|
thread scans the memory every 10 minutes (by default) and prints the
|
||||||
unreferenced objects found. To trigger an intermediate scan and display
|
number of new unreferenced objects found. To display the details of all
|
||||||
all the possible memory leaks:
|
the possible memory leaks:
|
||||||
|
|
||||||
# mount -t debugfs nodev /sys/kernel/debug/
|
# mount -t debugfs nodev /sys/kernel/debug/
|
||||||
# cat /sys/kernel/debug/kmemleak
|
# cat /sys/kernel/debug/kmemleak
|
||||||
|
|
||||||
|
To trigger an intermediate memory scan:
|
||||||
|
|
||||||
|
# echo scan > /sys/kernel/debug/kmemleak
|
||||||
|
|
||||||
Note that the orphan objects are listed in the order they were allocated
|
Note that the orphan objects are listed in the order they were allocated
|
||||||
and one object at the beginning of the list may cause other subsequent
|
and one object at the beginning of the list may cause other subsequent
|
||||||
objects to be reported as orphan.
|
objects to be reported as orphan.
|
||||||
|
@ -31,16 +35,21 @@ Memory scanning parameters can be modified at run-time by writing to the
|
||||||
/sys/kernel/debug/kmemleak file. The following parameters are supported:
|
/sys/kernel/debug/kmemleak file. The following parameters are supported:
|
||||||
|
|
||||||
off - disable kmemleak (irreversible)
|
off - disable kmemleak (irreversible)
|
||||||
stack=on - enable the task stacks scanning
|
stack=on - enable the task stacks scanning (default)
|
||||||
stack=off - disable the tasks stacks scanning
|
stack=off - disable the tasks stacks scanning
|
||||||
scan=on - start the automatic memory scanning thread
|
scan=on - start the automatic memory scanning thread (default)
|
||||||
scan=off - stop the automatic memory scanning thread
|
scan=off - stop the automatic memory scanning thread
|
||||||
scan=<secs> - set the automatic memory scanning period in seconds (0
|
scan=<secs> - set the automatic memory scanning period in seconds
|
||||||
to disable it)
|
(default 600, 0 to stop the automatic scanning)
|
||||||
|
scan - trigger a memory scan
|
||||||
|
|
||||||
Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on
|
Kmemleak can also be disabled at boot-time by passing "kmemleak=off" on
|
||||||
the kernel command line.
|
the kernel command line.
|
||||||
|
|
||||||
|
Memory may be allocated or freed before kmemleak is initialised and
|
||||||
|
these actions are stored in an early log buffer. The size of this buffer
|
||||||
|
is configured via the CONFIG_DEBUG_KMEMLEAK_EARLY_LOG_SIZE option.
|
||||||
|
|
||||||
Basic Algorithm
|
Basic Algorithm
|
||||||
---------------
|
---------------
|
||||||
|
|
||||||
|
|
|
@ -99,11 +99,13 @@ void parse_opts(int argc, char *argv[])
|
||||||
{ "lsb", 0, 0, 'L' },
|
{ "lsb", 0, 0, 'L' },
|
||||||
{ "cs-high", 0, 0, 'C' },
|
{ "cs-high", 0, 0, 'C' },
|
||||||
{ "3wire", 0, 0, '3' },
|
{ "3wire", 0, 0, '3' },
|
||||||
|
{ "no-cs", 0, 0, 'N' },
|
||||||
|
{ "ready", 0, 0, 'R' },
|
||||||
{ NULL, 0, 0, 0 },
|
{ NULL, 0, 0, 0 },
|
||||||
};
|
};
|
||||||
int c;
|
int c;
|
||||||
|
|
||||||
c = getopt_long(argc, argv, "D:s:d:b:lHOLC3", lopts, NULL);
|
c = getopt_long(argc, argv, "D:s:d:b:lHOLC3NR", lopts, NULL);
|
||||||
|
|
||||||
if (c == -1)
|
if (c == -1)
|
||||||
break;
|
break;
|
||||||
|
@ -139,6 +141,12 @@ void parse_opts(int argc, char *argv[])
|
||||||
case '3':
|
case '3':
|
||||||
mode |= SPI_3WIRE;
|
mode |= SPI_3WIRE;
|
||||||
break;
|
break;
|
||||||
|
case 'N':
|
||||||
|
mode |= SPI_NO_CS;
|
||||||
|
break;
|
||||||
|
case 'R':
|
||||||
|
mode |= SPI_READY;
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
print_usage(argv[0]);
|
print_usage(argv[0]);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -66,3 +66,4 @@
|
||||||
68 -> Terratec AV350 (em2860) [0ccd:0084]
|
68 -> Terratec AV350 (em2860) [0ccd:0084]
|
||||||
69 -> KWorld ATSC 315U HDTV TV Box (em2882) [eb1a:a313]
|
69 -> KWorld ATSC 315U HDTV TV Box (em2882) [eb1a:a313]
|
||||||
70 -> Evga inDtube (em2882)
|
70 -> Evga inDtube (em2882)
|
||||||
|
71 -> Silvercrest Webcam 1.3mpix (em2820/em2840)
|
||||||
|
|
|
@ -2,3 +2,5 @@
|
||||||
- this file
|
- this file
|
||||||
mtrr.txt
|
mtrr.txt
|
||||||
- how to use x86 Memory Type Range Registers to increase performance
|
- how to use x86 Memory Type Range Registers to increase performance
|
||||||
|
exception-tables.txt
|
||||||
|
- why and how Linux kernel uses exception tables on x86
|
||||||
|
|
|
@ -1,123 +1,123 @@
|
||||||
Kernel level exception handling in Linux 2.1.8
|
Kernel level exception handling in Linux
|
||||||
Commentary by Joerg Pommnitz <joerg@raleigh.ibm.com>
|
Commentary by Joerg Pommnitz <joerg@raleigh.ibm.com>
|
||||||
|
|
||||||
When a process runs in kernel mode, it often has to access user
|
When a process runs in kernel mode, it often has to access user
|
||||||
mode memory whose address has been passed by an untrusted program.
|
mode memory whose address has been passed by an untrusted program.
|
||||||
To protect itself the kernel has to verify this address.
|
To protect itself the kernel has to verify this address.
|
||||||
|
|
||||||
In older versions of Linux this was done with the
|
In older versions of Linux this was done with the
|
||||||
int verify_area(int type, const void * addr, unsigned long size)
|
int verify_area(int type, const void * addr, unsigned long size)
|
||||||
function (which has since been replaced by access_ok()).
|
function (which has since been replaced by access_ok()).
|
||||||
|
|
||||||
This function verified that the memory area starting at address
|
This function verified that the memory area starting at address
|
||||||
'addr' and of size 'size' was accessible for the operation specified
|
'addr' and of size 'size' was accessible for the operation specified
|
||||||
in type (read or write). To do this, verify_read had to look up the
|
in type (read or write). To do this, verify_read had to look up the
|
||||||
virtual memory area (vma) that contained the address addr. In the
|
virtual memory area (vma) that contained the address addr. In the
|
||||||
normal case (correctly working program), this test was successful.
|
normal case (correctly working program), this test was successful.
|
||||||
It only failed for a few buggy programs. In some kernel profiling
|
It only failed for a few buggy programs. In some kernel profiling
|
||||||
tests, this normally unneeded verification used up a considerable
|
tests, this normally unneeded verification used up a considerable
|
||||||
amount of time.
|
amount of time.
|
||||||
|
|
||||||
To overcome this situation, Linus decided to let the virtual memory
|
To overcome this situation, Linus decided to let the virtual memory
|
||||||
hardware present in every Linux-capable CPU handle this test.
|
hardware present in every Linux-capable CPU handle this test.
|
||||||
|
|
||||||
How does this work?
|
How does this work?
|
||||||
|
|
||||||
Whenever the kernel tries to access an address that is currently not
|
Whenever the kernel tries to access an address that is currently not
|
||||||
accessible, the CPU generates a page fault exception and calls the
|
accessible, the CPU generates a page fault exception and calls the
|
||||||
page fault handler
|
page fault handler
|
||||||
|
|
||||||
void do_page_fault(struct pt_regs *regs, unsigned long error_code)
|
void do_page_fault(struct pt_regs *regs, unsigned long error_code)
|
||||||
|
|
||||||
in arch/i386/mm/fault.c. The parameters on the stack are set up by
|
in arch/x86/mm/fault.c. The parameters on the stack are set up by
|
||||||
the low level assembly glue in arch/i386/kernel/entry.S. The parameter
|
the low level assembly glue in arch/x86/kernel/entry_32.S. The parameter
|
||||||
regs is a pointer to the saved registers on the stack, error_code
|
regs is a pointer to the saved registers on the stack, error_code
|
||||||
contains a reason code for the exception.
|
contains a reason code for the exception.
|
||||||
|
|
||||||
do_page_fault first obtains the unaccessible address from the CPU
|
do_page_fault first obtains the unaccessible address from the CPU
|
||||||
control register CR2. If the address is within the virtual address
|
control register CR2. If the address is within the virtual address
|
||||||
space of the process, the fault probably occurred, because the page
|
space of the process, the fault probably occurred, because the page
|
||||||
was not swapped in, write protected or something similar. However,
|
was not swapped in, write protected or something similar. However,
|
||||||
we are interested in the other case: the address is not valid, there
|
we are interested in the other case: the address is not valid, there
|
||||||
is no vma that contains this address. In this case, the kernel jumps
|
is no vma that contains this address. In this case, the kernel jumps
|
||||||
to the bad_area label.
|
to the bad_area label.
|
||||||
|
|
||||||
There it uses the address of the instruction that caused the exception
|
There it uses the address of the instruction that caused the exception
|
||||||
(i.e. regs->eip) to find an address where the execution can continue
|
(i.e. regs->eip) to find an address where the execution can continue
|
||||||
(fixup). If this search is successful, the fault handler modifies the
|
(fixup). If this search is successful, the fault handler modifies the
|
||||||
return address (again regs->eip) and returns. The execution will
|
return address (again regs->eip) and returns. The execution will
|
||||||
continue at the address in fixup.
|
continue at the address in fixup.
|
||||||
|
|
||||||
Where does fixup point to?
|
Where does fixup point to?
|
||||||
|
|
||||||
Since we jump to the contents of fixup, fixup obviously points
|
Since we jump to the contents of fixup, fixup obviously points
|
||||||
to executable code. This code is hidden inside the user access macros.
|
to executable code. This code is hidden inside the user access macros.
|
||||||
I have picked the get_user macro defined in include/asm/uaccess.h as an
|
I have picked the get_user macro defined in arch/x86/include/asm/uaccess.h
|
||||||
example. The definition is somewhat hard to follow, so let's peek at
|
as an example. The definition is somewhat hard to follow, so let's peek at
|
||||||
the code generated by the preprocessor and the compiler. I selected
|
the code generated by the preprocessor and the compiler. I selected
|
||||||
the get_user call in drivers/char/console.c for a detailed examination.
|
the get_user call in drivers/char/sysrq.c for a detailed examination.
|
||||||
|
|
||||||
The original code in console.c line 1405:
|
The original code in sysrq.c line 587:
|
||||||
get_user(c, buf);
|
get_user(c, buf);
|
||||||
|
|
||||||
The preprocessor output (edited to become somewhat readable):
|
The preprocessor output (edited to become somewhat readable):
|
||||||
|
|
||||||
(
|
(
|
||||||
{
|
{
|
||||||
long __gu_err = - 14 , __gu_val = 0;
|
long __gu_err = - 14 , __gu_val = 0;
|
||||||
const __typeof__(*( ( buf ) )) *__gu_addr = ((buf));
|
const __typeof__(*( ( buf ) )) *__gu_addr = ((buf));
|
||||||
if (((((0 + current_set[0])->tss.segment) == 0x18 ) ||
|
if (((((0 + current_set[0])->tss.segment) == 0x18 ) ||
|
||||||
(((sizeof(*(buf))) <= 0xC0000000UL) &&
|
(((sizeof(*(buf))) <= 0xC0000000UL) &&
|
||||||
((unsigned long)(__gu_addr ) <= 0xC0000000UL - (sizeof(*(buf)))))))
|
((unsigned long)(__gu_addr ) <= 0xC0000000UL - (sizeof(*(buf)))))))
|
||||||
do {
|
do {
|
||||||
__gu_err = 0;
|
__gu_err = 0;
|
||||||
switch ((sizeof(*(buf)))) {
|
switch ((sizeof(*(buf)))) {
|
||||||
case 1:
|
case 1:
|
||||||
__asm__ __volatile__(
|
|
||||||
"1: mov" "b" " %2,%" "b" "1\n"
|
|
||||||
"2:\n"
|
|
||||||
".section .fixup,\"ax\"\n"
|
|
||||||
"3: movl %3,%0\n"
|
|
||||||
" xor" "b" " %" "b" "1,%" "b" "1\n"
|
|
||||||
" jmp 2b\n"
|
|
||||||
".section __ex_table,\"a\"\n"
|
|
||||||
" .align 4\n"
|
|
||||||
" .long 1b,3b\n"
|
|
||||||
".text" : "=r"(__gu_err), "=q" (__gu_val): "m"((*(struct __large_struct *)
|
|
||||||
( __gu_addr )) ), "i"(- 14 ), "0"( __gu_err )) ;
|
|
||||||
break;
|
|
||||||
case 2:
|
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"1: mov" "w" " %2,%" "w" "1\n"
|
"1: mov" "b" " %2,%" "b" "1\n"
|
||||||
"2:\n"
|
"2:\n"
|
||||||
".section .fixup,\"ax\"\n"
|
".section .fixup,\"ax\"\n"
|
||||||
"3: movl %3,%0\n"
|
"3: movl %3,%0\n"
|
||||||
" xor" "w" " %" "w" "1,%" "w" "1\n"
|
" xor" "b" " %" "b" "1,%" "b" "1\n"
|
||||||
" jmp 2b\n"
|
" jmp 2b\n"
|
||||||
".section __ex_table,\"a\"\n"
|
".section __ex_table,\"a\"\n"
|
||||||
" .align 4\n"
|
" .align 4\n"
|
||||||
" .long 1b,3b\n"
|
" .long 1b,3b\n"
|
||||||
|
".text" : "=r"(__gu_err), "=q" (__gu_val): "m"((*(struct __large_struct *)
|
||||||
|
( __gu_addr )) ), "i"(- 14 ), "0"( __gu_err )) ;
|
||||||
|
break;
|
||||||
|
case 2:
|
||||||
|
__asm__ __volatile__(
|
||||||
|
"1: mov" "w" " %2,%" "w" "1\n"
|
||||||
|
"2:\n"
|
||||||
|
".section .fixup,\"ax\"\n"
|
||||||
|
"3: movl %3,%0\n"
|
||||||
|
" xor" "w" " %" "w" "1,%" "w" "1\n"
|
||||||
|
" jmp 2b\n"
|
||||||
|
".section __ex_table,\"a\"\n"
|
||||||
|
" .align 4\n"
|
||||||
|
" .long 1b,3b\n"
|
||||||
".text" : "=r"(__gu_err), "=r" (__gu_val) : "m"((*(struct __large_struct *)
|
".text" : "=r"(__gu_err), "=r" (__gu_val) : "m"((*(struct __large_struct *)
|
||||||
( __gu_addr )) ), "i"(- 14 ), "0"( __gu_err ));
|
( __gu_addr )) ), "i"(- 14 ), "0"( __gu_err ));
|
||||||
break;
|
break;
|
||||||
case 4:
|
case 4:
|
||||||
__asm__ __volatile__(
|
__asm__ __volatile__(
|
||||||
"1: mov" "l" " %2,%" "" "1\n"
|
"1: mov" "l" " %2,%" "" "1\n"
|
||||||
"2:\n"
|
"2:\n"
|
||||||
".section .fixup,\"ax\"\n"
|
".section .fixup,\"ax\"\n"
|
||||||
"3: movl %3,%0\n"
|
"3: movl %3,%0\n"
|
||||||
" xor" "l" " %" "" "1,%" "" "1\n"
|
" xor" "l" " %" "" "1,%" "" "1\n"
|
||||||
" jmp 2b\n"
|
" jmp 2b\n"
|
||||||
".section __ex_table,\"a\"\n"
|
".section __ex_table,\"a\"\n"
|
||||||
" .align 4\n" " .long 1b,3b\n"
|
" .align 4\n" " .long 1b,3b\n"
|
||||||
".text" : "=r"(__gu_err), "=r" (__gu_val) : "m"((*(struct __large_struct *)
|
".text" : "=r"(__gu_err), "=r" (__gu_val) : "m"((*(struct __large_struct *)
|
||||||
( __gu_addr )) ), "i"(- 14 ), "0"(__gu_err));
|
( __gu_addr )) ), "i"(- 14 ), "0"(__gu_err));
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
(__gu_val) = __get_user_bad();
|
(__gu_val) = __get_user_bad();
|
||||||
}
|
}
|
||||||
} while (0) ;
|
} while (0) ;
|
||||||
((c)) = (__typeof__(*((buf))))__gu_val;
|
((c)) = (__typeof__(*((buf))))__gu_val;
|
||||||
__gu_err;
|
__gu_err;
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
|
@ -127,12 +127,12 @@ see what code gcc generates:
|
||||||
|
|
||||||
> xorl %edx,%edx
|
> xorl %edx,%edx
|
||||||
> movl current_set,%eax
|
> movl current_set,%eax
|
||||||
> cmpl $24,788(%eax)
|
> cmpl $24,788(%eax)
|
||||||
> je .L1424
|
> je .L1424
|
||||||
> cmpl $-1073741825,64(%esp)
|
> cmpl $-1073741825,64(%esp)
|
||||||
> ja .L1423
|
> ja .L1423
|
||||||
> .L1424:
|
> .L1424:
|
||||||
> movl %edx,%eax
|
> movl %edx,%eax
|
||||||
> movl 64(%esp),%ebx
|
> movl 64(%esp),%ebx
|
||||||
> #APP
|
> #APP
|
||||||
> 1: movb (%ebx),%dl /* this is the actual user access */
|
> 1: movb (%ebx),%dl /* this is the actual user access */
|
||||||
|
@ -149,17 +149,17 @@ see what code gcc generates:
|
||||||
> .L1423:
|
> .L1423:
|
||||||
> movzbl %dl,%esi
|
> movzbl %dl,%esi
|
||||||
|
|
||||||
The optimizer does a good job and gives us something we can actually
|
The optimizer does a good job and gives us something we can actually
|
||||||
understand. Can we? The actual user access is quite obvious. Thanks
|
understand. Can we? The actual user access is quite obvious. Thanks
|
||||||
to the unified address space we can just access the address in user
|
to the unified address space we can just access the address in user
|
||||||
memory. But what does the .section stuff do?????
|
memory. But what does the .section stuff do?????
|
||||||
|
|
||||||
To understand this we have to look at the final kernel:
|
To understand this we have to look at the final kernel:
|
||||||
|
|
||||||
> objdump --section-headers vmlinux
|
> objdump --section-headers vmlinux
|
||||||
>
|
>
|
||||||
> vmlinux: file format elf32-i386
|
> vmlinux: file format elf32-i386
|
||||||
>
|
>
|
||||||
> Sections:
|
> Sections:
|
||||||
> Idx Name Size VMA LMA File off Algn
|
> Idx Name Size VMA LMA File off Algn
|
||||||
> 0 .text 00098f40 c0100000 c0100000 00001000 2**4
|
> 0 .text 00098f40 c0100000 c0100000 00001000 2**4
|
||||||
|
@ -198,18 +198,18 @@ final kernel executable:
|
||||||
|
|
||||||
The whole user memory access is reduced to 10 x86 machine instructions.
|
The whole user memory access is reduced to 10 x86 machine instructions.
|
||||||
The instructions bracketed in the .section directives are no longer
|
The instructions bracketed in the .section directives are no longer
|
||||||
in the normal execution path. They are located in a different section
|
in the normal execution path. They are located in a different section
|
||||||
of the executable file:
|
of the executable file:
|
||||||
|
|
||||||
> objdump --disassemble --section=.fixup vmlinux
|
> objdump --disassemble --section=.fixup vmlinux
|
||||||
>
|
>
|
||||||
> c0199ff5 <.fixup+10b5> movl $0xfffffff2,%eax
|
> c0199ff5 <.fixup+10b5> movl $0xfffffff2,%eax
|
||||||
> c0199ffa <.fixup+10ba> xorb %dl,%dl
|
> c0199ffa <.fixup+10ba> xorb %dl,%dl
|
||||||
> c0199ffc <.fixup+10bc> jmp c017e7a7 <do_con_write+e3>
|
> c0199ffc <.fixup+10bc> jmp c017e7a7 <do_con_write+e3>
|
||||||
|
|
||||||
And finally:
|
And finally:
|
||||||
> objdump --full-contents --section=__ex_table vmlinux
|
> objdump --full-contents --section=__ex_table vmlinux
|
||||||
>
|
>
|
||||||
> c01aa7c4 93c017c0 e09f19c0 97c017c0 99c017c0 ................
|
> c01aa7c4 93c017c0 e09f19c0 97c017c0 99c017c0 ................
|
||||||
> c01aa7d4 f6c217c0 e99f19c0 a5e717c0 f59f19c0 ................
|
> c01aa7d4 f6c217c0 e99f19c0 a5e717c0 f59f19c0 ................
|
||||||
> c01aa7e4 080a18c0 01a019c0 0a0a18c0 04a019c0 ................
|
> c01aa7e4 080a18c0 01a019c0 0a0a18c0 04a019c0 ................
|
||||||
|
@ -235,8 +235,8 @@ sections in the ELF object file. So the instructions
|
||||||
ended up in the .fixup section of the object file and the addresses
|
ended up in the .fixup section of the object file and the addresses
|
||||||
.long 1b,3b
|
.long 1b,3b
|
||||||
ended up in the __ex_table section of the object file. 1b and 3b
|
ended up in the __ex_table section of the object file. 1b and 3b
|
||||||
are local labels. The local label 1b (1b stands for next label 1
|
are local labels. The local label 1b (1b stands for next label 1
|
||||||
backward) is the address of the instruction that might fault, i.e.
|
backward) is the address of the instruction that might fault, i.e.
|
||||||
in our case the address of the label 1 is c017e7a5:
|
in our case the address of the label 1 is c017e7a5:
|
||||||
the original assembly code: > 1: movb (%ebx),%dl
|
the original assembly code: > 1: movb (%ebx),%dl
|
||||||
and linked in vmlinux : > c017e7a5 <do_con_write+e1> movb (%ebx),%dl
|
and linked in vmlinux : > c017e7a5 <do_con_write+e1> movb (%ebx),%dl
|
||||||
|
@ -254,7 +254,7 @@ The assembly code
|
||||||
becomes the value pair
|
becomes the value pair
|
||||||
> c01aa7d4 c017c2f6 c0199fe9 c017e7a5 c0199ff5 ................
|
> c01aa7d4 c017c2f6 c0199fe9 c017e7a5 c0199ff5 ................
|
||||||
^this is ^this is
|
^this is ^this is
|
||||||
1b 3b
|
1b 3b
|
||||||
c017e7a5,c0199ff5 in the exception table of the kernel.
|
c017e7a5,c0199ff5 in the exception table of the kernel.
|
||||||
|
|
||||||
So, what actually happens if a fault from kernel mode with no suitable
|
So, what actually happens if a fault from kernel mode with no suitable
|
||||||
|
@ -266,9 +266,9 @@ vma occurs?
|
||||||
3.) CPU calls do_page_fault
|
3.) CPU calls do_page_fault
|
||||||
4.) do page fault calls search_exception_table (regs->eip == c017e7a5);
|
4.) do page fault calls search_exception_table (regs->eip == c017e7a5);
|
||||||
5.) search_exception_table looks up the address c017e7a5 in the
|
5.) search_exception_table looks up the address c017e7a5 in the
|
||||||
exception table (i.e. the contents of the ELF section __ex_table)
|
exception table (i.e. the contents of the ELF section __ex_table)
|
||||||
and returns the address of the associated fault handle code c0199ff5.
|
and returns the address of the associated fault handle code c0199ff5.
|
||||||
6.) do_page_fault modifies its own return address to point to the fault
|
6.) do_page_fault modifies its own return address to point to the fault
|
||||||
handle code and returns.
|
handle code and returns.
|
||||||
7.) execution continues in the fault handling code.
|
7.) execution continues in the fault handling code.
|
||||||
8.) 8a) EAX becomes -EFAULT (== -14)
|
8.) 8a) EAX becomes -EFAULT (== -14)
|
72
MAINTAINERS
72
MAINTAINERS
|
@ -867,12 +867,22 @@ M: alex@shark-linux.de
|
||||||
W: http://www.shark-linux.de/shark.html
|
W: http://www.shark-linux.de/shark.html
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
ARM/SAMSUNG ARM ARCHITECTURES
|
||||||
|
P: Ben Dooks
|
||||||
|
M: ben-linux@fluff.org
|
||||||
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
|
W: http://www.fluff.org/ben/linux/
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/plat-s3c/
|
||||||
|
F: arch/arm/plat-s3c24xx/
|
||||||
|
|
||||||
ARM/S3C2410 ARM ARCHITECTURE
|
ARM/S3C2410 ARM ARCHITECTURE
|
||||||
P: Ben Dooks
|
P: Ben Dooks
|
||||||
M: ben-linux@fluff.org
|
M: ben-linux@fluff.org
|
||||||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
W: http://www.fluff.org/ben/linux/
|
W: http://www.fluff.org/ben/linux/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s3c2410/
|
||||||
|
|
||||||
ARM/S3C2440 ARM ARCHITECTURE
|
ARM/S3C2440 ARM ARCHITECTURE
|
||||||
P: Ben Dooks
|
P: Ben Dooks
|
||||||
|
@ -880,6 +890,39 @@ M: ben-linux@fluff.org
|
||||||
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
W: http://www.fluff.org/ben/linux/
|
W: http://www.fluff.org/ben/linux/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s3c2440/
|
||||||
|
|
||||||
|
ARM/S3C2442 ARM ARCHITECTURE
|
||||||
|
P: Ben Dooks
|
||||||
|
M: ben-linux@fluff.org
|
||||||
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
|
W: http://www.fluff.org/ben/linux/
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s3c2442/
|
||||||
|
|
||||||
|
ARM/S3C2443 ARM ARCHITECTURE
|
||||||
|
P: Ben Dooks
|
||||||
|
M: ben-linux@fluff.org
|
||||||
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
|
W: http://www.fluff.org/ben/linux/
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s3c2443/
|
||||||
|
|
||||||
|
ARM/S3C6400 ARM ARCHITECTURE
|
||||||
|
P: Ben Dooks
|
||||||
|
M: ben-linux@fluff.org
|
||||||
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
|
W: http://www.fluff.org/ben/linux/
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s3c6400/
|
||||||
|
|
||||||
|
ARM/S3C6410 ARM ARCHITECTURE
|
||||||
|
P: Ben Dooks
|
||||||
|
M: ben-linux@fluff.org
|
||||||
|
L: linux-arm-kernel@lists.arm.linux.org.uk (subscribers-only)
|
||||||
|
W: http://www.fluff.org/ben/linux/
|
||||||
|
S: Maintained
|
||||||
|
F: arch/arm/mach-s3c6410/
|
||||||
|
|
||||||
ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
|
ARM/TECHNOLOGIC SYSTEMS TS7250 MACHINE SUPPORT
|
||||||
P: Lennert Buytenhek
|
P: Lennert Buytenhek
|
||||||
|
@ -2087,9 +2130,9 @@ F: drivers/edac/i5400_edac.c
|
||||||
|
|
||||||
EDAC-I82975X
|
EDAC-I82975X
|
||||||
P: Ranganathan Desikan
|
P: Ranganathan Desikan
|
||||||
M: rdesikan@jetzbroadband.com
|
M: ravi@jetztechnologies.com
|
||||||
P: Arvind R.
|
P: Arvind R.
|
||||||
M: arvind@acarlab.com
|
M: arvind@jetztechnologies.com
|
||||||
L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers)
|
L: bluesmoke-devel@lists.sourceforge.net (moderated for non-subscribers)
|
||||||
W: bluesmoke.sourceforge.net
|
W: bluesmoke.sourceforge.net
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -2808,7 +2851,9 @@ S: Maintained
|
||||||
|
|
||||||
IA64 (Itanium) PLATFORM
|
IA64 (Itanium) PLATFORM
|
||||||
P: Tony Luck
|
P: Tony Luck
|
||||||
|
P: Fenghua Yu
|
||||||
M: tony.luck@intel.com
|
M: tony.luck@intel.com
|
||||||
|
M: fenghua.yu@intel.com
|
||||||
L: linux-ia64@vger.kernel.org
|
L: linux-ia64@vger.kernel.org
|
||||||
W: http://www.ia64-linux.org/
|
W: http://www.ia64-linux.org/
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/aegl/linux-2.6.git
|
||||||
|
@ -2886,7 +2931,7 @@ P: Dmitry Eremin-Solenikov
|
||||||
M: dbaryshkov@gmail.com
|
M: dbaryshkov@gmail.com
|
||||||
P: Sergey Lapin
|
P: Sergey Lapin
|
||||||
M: slapin@ossfans.org
|
M: slapin@ossfans.org
|
||||||
L: linux-zigbee-devel@lists.sourceforge.net
|
L: linux-zigbee-devel@lists.sourceforge.net (moderated for non-subscribers)
|
||||||
W: http://apps.sourceforge.net/trac/linux-zigbee
|
W: http://apps.sourceforge.net/trac/linux-zigbee
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/lowpan/lowpan.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
@ -4362,7 +4407,7 @@ W: http://www.nongnu.org/orinoco/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/net/wireless/orinoco/
|
F: drivers/net/wireless/orinoco/
|
||||||
|
|
||||||
OSD LIBRARY
|
OSD LIBRARY and FILESYSTEM
|
||||||
P: Boaz Harrosh
|
P: Boaz Harrosh
|
||||||
M: bharrosh@panasas.com
|
M: bharrosh@panasas.com
|
||||||
P: Benny Halevy
|
P: Benny Halevy
|
||||||
|
@ -4371,6 +4416,9 @@ L: osd-dev@open-osd.org
|
||||||
W: http://open-osd.org
|
W: http://open-osd.org
|
||||||
T: git git://git.open-osd.org/open-osd.git
|
T: git git://git.open-osd.org/open-osd.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
F: drivers/scsi/osd/
|
||||||
|
F: drivers/include/scsi/osd_*
|
||||||
|
F: fs/exofs/
|
||||||
|
|
||||||
P54 WIRELESS DRIVER
|
P54 WIRELESS DRIVER
|
||||||
P: Michael Wu
|
P: Michael Wu
|
||||||
|
@ -5533,8 +5581,8 @@ F: drivers/staging/
|
||||||
|
|
||||||
STARFIRE/DURALAN NETWORK DRIVER
|
STARFIRE/DURALAN NETWORK DRIVER
|
||||||
P: Ion Badulescu
|
P: Ion Badulescu
|
||||||
M: ionut@cs.columbia.edu
|
M: ionut@badula.org
|
||||||
S: Maintained
|
S: Odd Fixes
|
||||||
F: drivers/net/starfire*
|
F: drivers/net/starfire*
|
||||||
|
|
||||||
STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
|
STARMODE RADIO IP (STRIP) PROTOCOL DRIVER
|
||||||
|
@ -5758,17 +5806,17 @@ P: Jiri Kosina
|
||||||
M: trivial@kernel.org
|
M: trivial@kernel.org
|
||||||
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git
|
T: git git://git.kernel.org/pub/scm/linux/kernel/git/jikos/trivial.git
|
||||||
S: Maintained
|
S: Maintained
|
||||||
F: drivers/char/tty_*
|
|
||||||
F: drivers/serial/serial_core.c
|
|
||||||
F: include/linux/serial_core.h
|
|
||||||
F: include/linux/serial.h
|
|
||||||
F: include/linux/tty.h
|
|
||||||
|
|
||||||
TTY LAYER
|
TTY LAYER
|
||||||
P: Alan Cox
|
P: Alan Cox
|
||||||
M: alan@lxorguk.ukuu.org.uk
|
M: alan@lxorguk.ukuu.org.uk
|
||||||
S: Maintained
|
S: Maintained
|
||||||
T: stgit http://zeniv.linux.org.uk/~alan/ttydev/
|
T: stgit http://zeniv.linux.org.uk/~alan/ttydev/
|
||||||
|
F: drivers/char/tty_*
|
||||||
|
F: drivers/serial/serial_core.c
|
||||||
|
F: include/linux/serial_core.h
|
||||||
|
F: include/linux/serial.h
|
||||||
|
F: include/linux/tty.h
|
||||||
|
|
||||||
TULIP NETWORK DRIVERS
|
TULIP NETWORK DRIVERS
|
||||||
P: Grant Grundler
|
P: Grant Grundler
|
||||||
|
@ -5806,7 +5854,7 @@ UBI FILE SYSTEM (UBIFS)
|
||||||
P: Artem Bityutskiy
|
P: Artem Bityutskiy
|
||||||
M: dedekind@infradead.org
|
M: dedekind@infradead.org
|
||||||
P: Adrian Hunter
|
P: Adrian Hunter
|
||||||
M: ext-adrian.hunter@nokia.com
|
M: adrian.hunter@nokia.com
|
||||||
L: linux-mtd@lists.infradead.org
|
L: linux-mtd@lists.infradead.org
|
||||||
T: git git://git.infradead.org/ubifs-2.6.git
|
T: git git://git.infradead.org/ubifs-2.6.git
|
||||||
W: http://www.linux-mtd.infradead.org/doc/ubifs.html
|
W: http://www.linux-mtd.infradead.org/doc/ubifs.html
|
||||||
|
|
11
Makefile
11
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 31
|
SUBLEVEL = 31
|
||||||
EXTRAVERSION = -rc1
|
EXTRAVERSION = -rc2
|
||||||
NAME = Man-Eating Seals of Antiquity
|
NAME = Man-Eating Seals of Antiquity
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -140,15 +140,13 @@ _all: modules
|
||||||
endif
|
endif
|
||||||
|
|
||||||
srctree := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR))
|
srctree := $(if $(KBUILD_SRC),$(KBUILD_SRC),$(CURDIR))
|
||||||
TOPDIR := $(srctree)
|
|
||||||
# FIXME - TOPDIR is obsolete, use srctree/objtree
|
|
||||||
objtree := $(CURDIR)
|
objtree := $(CURDIR)
|
||||||
src := $(srctree)
|
src := $(srctree)
|
||||||
obj := $(objtree)
|
obj := $(objtree)
|
||||||
|
|
||||||
VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
|
VPATH := $(srctree)$(if $(KBUILD_EXTMOD),:$(KBUILD_EXTMOD))
|
||||||
|
|
||||||
export srctree objtree VPATH TOPDIR
|
export srctree objtree VPATH
|
||||||
|
|
||||||
|
|
||||||
# SUBARCH tells the usermode build what the underlying arch is. That is set
|
# SUBARCH tells the usermode build what the underlying arch is. That is set
|
||||||
|
@ -344,7 +342,8 @@ KBUILD_CPPFLAGS := -D__KERNEL__
|
||||||
|
|
||||||
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
KBUILD_CFLAGS := -Wall -Wundef -Wstrict-prototypes -Wno-trigraphs \
|
||||||
-fno-strict-aliasing -fno-common \
|
-fno-strict-aliasing -fno-common \
|
||||||
-Werror-implicit-function-declaration
|
-Werror-implicit-function-declaration \
|
||||||
|
-Wno-format-security
|
||||||
KBUILD_AFLAGS := -D__ASSEMBLY__
|
KBUILD_AFLAGS := -D__ASSEMBLY__
|
||||||
|
|
||||||
# Read KERNELRELEASE from include/config/kernel.release (if it exists)
|
# Read KERNELRELEASE from include/config/kernel.release (if it exists)
|
||||||
|
@ -566,7 +565,7 @@ KBUILD_CFLAGS += $(call cc-option,-Wdeclaration-after-statement,)
|
||||||
KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
|
KBUILD_CFLAGS += $(call cc-option,-Wno-pointer-sign,)
|
||||||
|
|
||||||
# disable invalid "can't wrap" optimizations for signed / pointers
|
# disable invalid "can't wrap" optimizations for signed / pointers
|
||||||
KBUILD_CFLAGS += $(call cc-option,-fwrapv)
|
KBUILD_CFLAGS += $(call cc-option,-fno-strict-overflow)
|
||||||
|
|
||||||
# revert to pre-gcc-4.4 behaviour of .eh_frame
|
# revert to pre-gcc-4.4 behaviour of .eh_frame
|
||||||
KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)
|
KBUILD_CFLAGS += $(call cc-option,-fno-dwarf2-cfi-asm)
|
||||||
|
|
|
@ -30,7 +30,7 @@ extern unsigned long __per_cpu_offset[NR_CPUS];
|
||||||
|
|
||||||
#ifndef MODULE
|
#ifndef MODULE
|
||||||
#define SHIFT_PERCPU_PTR(var, offset) RELOC_HIDE(&per_cpu_var(var), (offset))
|
#define SHIFT_PERCPU_PTR(var, offset) RELOC_HIDE(&per_cpu_var(var), (offset))
|
||||||
#define PER_CPU_ATTRIBUTES
|
#define PER_CPU_DEF_ATTRIBUTES
|
||||||
#else
|
#else
|
||||||
/*
|
/*
|
||||||
* To calculate addresses of locally defined variables, GCC uses 32-bit
|
* To calculate addresses of locally defined variables, GCC uses 32-bit
|
||||||
|
@ -49,7 +49,7 @@ extern unsigned long __per_cpu_offset[NR_CPUS];
|
||||||
: "=&r"(__ptr), "=&r"(tmp_gp)); \
|
: "=&r"(__ptr), "=&r"(tmp_gp)); \
|
||||||
(typeof(&per_cpu_var(var)))(__ptr + (offset)); })
|
(typeof(&per_cpu_var(var)))(__ptr + (offset)); })
|
||||||
|
|
||||||
#define PER_CPU_ATTRIBUTES __used
|
#define PER_CPU_DEF_ATTRIBUTES __used
|
||||||
|
|
||||||
#endif /* MODULE */
|
#endif /* MODULE */
|
||||||
|
|
||||||
|
@ -71,7 +71,7 @@ extern unsigned long __per_cpu_offset[NR_CPUS];
|
||||||
#define __get_cpu_var(var) per_cpu_var(var)
|
#define __get_cpu_var(var) per_cpu_var(var)
|
||||||
#define __raw_get_cpu_var(var) per_cpu_var(var)
|
#define __raw_get_cpu_var(var) per_cpu_var(var)
|
||||||
|
|
||||||
#define PER_CPU_ATTRIBUTES
|
#define PER_CPU_DEF_ATTRIBUTES
|
||||||
|
|
||||||
#endif /* SMP */
|
#endif /* SMP */
|
||||||
|
|
||||||
|
|
|
@ -37,6 +37,7 @@ struct thread_info {
|
||||||
.task = &tsk, \
|
.task = &tsk, \
|
||||||
.exec_domain = &default_exec_domain, \
|
.exec_domain = &default_exec_domain, \
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
.restart_block = { \
|
.restart_block = { \
|
||||||
.fn = do_no_restart_syscall, \
|
.fn = do_no_restart_syscall, \
|
||||||
}, \
|
}, \
|
||||||
|
|
|
@ -8,7 +8,6 @@
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
|
|
|
@ -99,14 +99,6 @@ config DEBUG_CLPS711X_UART2
|
||||||
output to the second serial port on these devices. Saying N will
|
output to the second serial port on these devices. Saying N will
|
||||||
cause the debug messages to appear on the first serial port.
|
cause the debug messages to appear on the first serial port.
|
||||||
|
|
||||||
config DEBUG_S3C_PORT
|
|
||||||
depends on DEBUG_LL && PLAT_S3C
|
|
||||||
bool "Kernel low-level debugging messages via S3C UART"
|
|
||||||
help
|
|
||||||
Say Y here if you want debug print routines to go to one of the
|
|
||||||
S3C internal UARTs. The chosen UART must have been configured
|
|
||||||
before it is used.
|
|
||||||
|
|
||||||
config DEBUG_S3C_UART
|
config DEBUG_S3C_UART
|
||||||
depends on PLAT_S3C
|
depends on PLAT_S3C
|
||||||
int "S3C UART to use for low-level debug"
|
int "S3C UART to use for low-level debug"
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -260,6 +260,7 @@ CONFIG_MACH_NEXCODER_2440=y
|
||||||
CONFIG_SMDK2440_CPU2440=y
|
CONFIG_SMDK2440_CPU2440=y
|
||||||
CONFIG_MACH_AT2440EVB=y
|
CONFIG_MACH_AT2440EVB=y
|
||||||
CONFIG_CPU_S3C2442=y
|
CONFIG_CPU_S3C2442=y
|
||||||
|
CONFIG_MACH_MINI2440=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# S3C2442 Machines
|
# S3C2442 Machines
|
||||||
|
@ -2298,7 +2299,6 @@ CONFIG_DEBUG_ERRORS=y
|
||||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||||
CONFIG_DEBUG_LL=y
|
CONFIG_DEBUG_LL=y
|
||||||
# CONFIG_DEBUG_ICEDCC is not set
|
# CONFIG_DEBUG_ICEDCC is not set
|
||||||
CONFIG_DEBUG_S3C_PORT=y
|
|
||||||
CONFIG_DEBUG_S3C_UART=0
|
CONFIG_DEBUG_S3C_UART=0
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -816,7 +816,6 @@ CONFIG_DEBUG_ERRORS=y
|
||||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||||
CONFIG_DEBUG_LL=y
|
CONFIG_DEBUG_LL=y
|
||||||
# CONFIG_DEBUG_ICEDCC is not set
|
# CONFIG_DEBUG_ICEDCC is not set
|
||||||
CONFIG_DEBUG_S3C_PORT=y
|
|
||||||
CONFIG_DEBUG_S3C_UART=0
|
CONFIG_DEBUG_S3C_UART=0
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -857,7 +857,6 @@ CONFIG_DEBUG_ERRORS=y
|
||||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||||
CONFIG_DEBUG_LL=y
|
CONFIG_DEBUG_LL=y
|
||||||
# CONFIG_DEBUG_ICEDCC is not set
|
# CONFIG_DEBUG_ICEDCC is not set
|
||||||
# CONFIG_DEBUG_S3C_PORT is not set
|
|
||||||
CONFIG_DEBUG_S3C_UART=0
|
CONFIG_DEBUG_S3C_UART=0
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.30-rc6
|
# Linux kernel version: 2.6.31-rc1
|
||||||
# Mon Jun 1 09:18:22 2009
|
# Thu Jul 2 00:16:59 2009
|
||||||
#
|
#
|
||||||
CONFIG_ARM=y
|
CONFIG_ARM=y
|
||||||
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
CONFIG_SYS_SUPPORTS_APM_EMULATION=y
|
||||||
|
@ -9,7 +9,7 @@ CONFIG_GENERIC_GPIO=y
|
||||||
CONFIG_GENERIC_TIME=y
|
CONFIG_GENERIC_TIME=y
|
||||||
CONFIG_GENERIC_CLOCKEVENTS=y
|
CONFIG_GENERIC_CLOCKEVENTS=y
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
# CONFIG_NO_IOPORT is not set
|
CONFIG_HAVE_TCM=y
|
||||||
CONFIG_GENERIC_HARDIRQS=y
|
CONFIG_GENERIC_HARDIRQS=y
|
||||||
CONFIG_STACKTRACE_SUPPORT=y
|
CONFIG_STACKTRACE_SUPPORT=y
|
||||||
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
|
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
|
||||||
|
@ -18,13 +18,12 @@ CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||||
CONFIG_HARDIRQS_SW_RESEND=y
|
CONFIG_HARDIRQS_SW_RESEND=y
|
||||||
CONFIG_GENERIC_IRQ_PROBE=y
|
CONFIG_GENERIC_IRQ_PROBE=y
|
||||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
|
||||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
|
||||||
CONFIG_GENERIC_HWEIGHT=y
|
CONFIG_GENERIC_HWEIGHT=y
|
||||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||||
CONFIG_VECTORS_BASE=0xffff0000
|
CONFIG_VECTORS_BASE=0xffff0000
|
||||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||||
|
CONFIG_CONSTRUCTORS=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# General setup
|
# General setup
|
||||||
|
@ -68,7 +67,6 @@ CONFIG_SYSCTL_SYSCALL=y
|
||||||
CONFIG_KALLSYMS=y
|
CONFIG_KALLSYMS=y
|
||||||
# CONFIG_KALLSYMS_ALL is not set
|
# CONFIG_KALLSYMS_ALL is not set
|
||||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||||
# CONFIG_STRIP_ASM_SYMS is not set
|
|
||||||
CONFIG_HOTPLUG=y
|
CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
|
@ -81,8 +79,13 @@ CONFIG_TIMERFD=y
|
||||||
CONFIG_EVENTFD=y
|
CONFIG_EVENTFD=y
|
||||||
CONFIG_SHMEM=y
|
CONFIG_SHMEM=y
|
||||||
# CONFIG_AIO is not set
|
# CONFIG_AIO is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Performance Counters
|
||||||
|
#
|
||||||
# CONFIG_VM_EVENT_COUNTERS is not set
|
# CONFIG_VM_EVENT_COUNTERS is not set
|
||||||
CONFIG_SLUB_DEBUG=y
|
CONFIG_SLUB_DEBUG=y
|
||||||
|
# CONFIG_STRIP_ASM_SYMS is not set
|
||||||
CONFIG_COMPAT_BRK=y
|
CONFIG_COMPAT_BRK=y
|
||||||
# CONFIG_SLAB is not set
|
# CONFIG_SLAB is not set
|
||||||
CONFIG_SLUB=y
|
CONFIG_SLUB=y
|
||||||
|
@ -94,6 +97,10 @@ CONFIG_HAVE_OPROFILE=y
|
||||||
CONFIG_HAVE_KPROBES=y
|
CONFIG_HAVE_KPROBES=y
|
||||||
CONFIG_HAVE_KRETPROBES=y
|
CONFIG_HAVE_KRETPROBES=y
|
||||||
CONFIG_HAVE_CLK=y
|
CONFIG_HAVE_CLK=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# GCOV-based kernel profiling
|
||||||
|
#
|
||||||
# CONFIG_SLOW_WORK is not set
|
# CONFIG_SLOW_WORK is not set
|
||||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||||
CONFIG_SLABINFO=y
|
CONFIG_SLABINFO=y
|
||||||
|
@ -106,7 +113,7 @@ CONFIG_MODULE_UNLOAD=y
|
||||||
# CONFIG_MODVERSIONS is not set
|
# CONFIG_MODVERSIONS is not set
|
||||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||||
CONFIG_BLOCK=y
|
CONFIG_BLOCK=y
|
||||||
# CONFIG_LBD is not set
|
CONFIG_LBDAF=y
|
||||||
# CONFIG_BLK_DEV_BSG is not set
|
# CONFIG_BLK_DEV_BSG is not set
|
||||||
# CONFIG_BLK_DEV_INTEGRITY is not set
|
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||||
|
|
||||||
|
@ -138,9 +145,9 @@ CONFIG_DEFAULT_IOSCHED="deadline"
|
||||||
# CONFIG_ARCH_EP93XX is not set
|
# CONFIG_ARCH_EP93XX is not set
|
||||||
# CONFIG_ARCH_FOOTBRIDGE is not set
|
# CONFIG_ARCH_FOOTBRIDGE is not set
|
||||||
# CONFIG_ARCH_MXC is not set
|
# CONFIG_ARCH_MXC is not set
|
||||||
|
# CONFIG_ARCH_STMP3XXX is not set
|
||||||
# CONFIG_ARCH_NETX is not set
|
# CONFIG_ARCH_NETX is not set
|
||||||
# CONFIG_ARCH_H720X is not set
|
# CONFIG_ARCH_H720X is not set
|
||||||
# CONFIG_ARCH_IMX is not set
|
|
||||||
# CONFIG_ARCH_IOP13XX is not set
|
# CONFIG_ARCH_IOP13XX is not set
|
||||||
# CONFIG_ARCH_IOP32X is not set
|
# CONFIG_ARCH_IOP32X is not set
|
||||||
# CONFIG_ARCH_IOP33X is not set
|
# CONFIG_ARCH_IOP33X is not set
|
||||||
|
@ -216,8 +223,8 @@ CONFIG_ARM_THUMB=y
|
||||||
# CONFIG_CPU_DCACHE_DISABLE is not set
|
# CONFIG_CPU_DCACHE_DISABLE is not set
|
||||||
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
|
# CONFIG_CPU_DCACHE_WRITETHROUGH is not set
|
||||||
# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
|
# CONFIG_CPU_CACHE_ROUND_ROBIN is not set
|
||||||
# CONFIG_OUTER_CACHE is not set
|
|
||||||
CONFIG_ARM_VIC=y
|
CONFIG_ARM_VIC=y
|
||||||
|
CONFIG_ARM_VIC_NR=2
|
||||||
CONFIG_COMMON_CLKDEV=y
|
CONFIG_COMMON_CLKDEV=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -243,7 +250,6 @@ CONFIG_PREEMPT=y
|
||||||
CONFIG_HZ=100
|
CONFIG_HZ=100
|
||||||
CONFIG_AEABI=y
|
CONFIG_AEABI=y
|
||||||
CONFIG_OABI_COMPAT=y
|
CONFIG_OABI_COMPAT=y
|
||||||
CONFIG_ARCH_FLATMEM_HAS_HOLES=y
|
|
||||||
# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
|
# CONFIG_ARCH_SPARSEMEM_DEFAULT is not set
|
||||||
# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
|
# CONFIG_ARCH_SELECT_MEMORY_MODEL is not set
|
||||||
# CONFIG_HIGHMEM is not set
|
# CONFIG_HIGHMEM is not set
|
||||||
|
@ -258,17 +264,18 @@ CONFIG_SPLIT_PTLOCK_CPUS=4096
|
||||||
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
# CONFIG_PHYS_ADDR_T_64BIT is not set
|
||||||
CONFIG_ZONE_DMA_FLAG=0
|
CONFIG_ZONE_DMA_FLAG=0
|
||||||
CONFIG_VIRT_TO_BUS=y
|
CONFIG_VIRT_TO_BUS=y
|
||||||
CONFIG_UNEVICTABLE_LRU=y
|
|
||||||
CONFIG_HAVE_MLOCK=y
|
CONFIG_HAVE_MLOCK=y
|
||||||
CONFIG_HAVE_MLOCKED_PAGE_BIT=y
|
CONFIG_HAVE_MLOCKED_PAGE_BIT=y
|
||||||
|
CONFIG_DEFAULT_MMAP_MIN_ADDR=4096
|
||||||
CONFIG_ALIGNMENT_TRAP=y
|
CONFIG_ALIGNMENT_TRAP=y
|
||||||
|
# CONFIG_UACCESS_WITH_MEMCPY is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Boot options
|
# Boot options
|
||||||
#
|
#
|
||||||
CONFIG_ZBOOT_ROM_TEXT=0x0
|
CONFIG_ZBOOT_ROM_TEXT=0x0
|
||||||
CONFIG_ZBOOT_ROM_BSS=0x0
|
CONFIG_ZBOOT_ROM_BSS=0x0
|
||||||
CONFIG_CMDLINE="root=/dev/mtdblock2 rw rootfstype=yaffs2 console=ttyAMA0,115200n8 ab3100.force=0,0x48 mtdparts=u300nand:128k@0x0(bootrecords)ro,8064k@128k(free)ro,253952k@8192k(platform) lpj=515072"
|
CONFIG_CMDLINE="root=/dev/ram0 rw rootfstype=rootfs console=ttyAMA0,115200n8 lpj=515072"
|
||||||
# CONFIG_XIP_KERNEL is not set
|
# CONFIG_XIP_KERNEL is not set
|
||||||
# CONFIG_KEXEC is not set
|
# CONFIG_KEXEC is not set
|
||||||
|
|
||||||
|
@ -359,6 +366,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||||
# CONFIG_ECONET is not set
|
# CONFIG_ECONET is not set
|
||||||
# CONFIG_WAN_ROUTER is not set
|
# CONFIG_WAN_ROUTER is not set
|
||||||
# CONFIG_PHONET is not set
|
# CONFIG_PHONET is not set
|
||||||
|
# CONFIG_IEEE802154 is not set
|
||||||
# CONFIG_NET_SCHED is not set
|
# CONFIG_NET_SCHED is not set
|
||||||
# CONFIG_DCB is not set
|
# CONFIG_DCB is not set
|
||||||
|
|
||||||
|
@ -497,6 +505,7 @@ CONFIG_MISC_DEVICES=y
|
||||||
# CONFIG_EEPROM_AT24 is not set
|
# CONFIG_EEPROM_AT24 is not set
|
||||||
# CONFIG_EEPROM_AT25 is not set
|
# CONFIG_EEPROM_AT25 is not set
|
||||||
# CONFIG_EEPROM_LEGACY is not set
|
# CONFIG_EEPROM_LEGACY is not set
|
||||||
|
# CONFIG_EEPROM_MAX6875 is not set
|
||||||
# CONFIG_EEPROM_93CX6 is not set
|
# CONFIG_EEPROM_93CX6 is not set
|
||||||
CONFIG_HAVE_IDE=y
|
CONFIG_HAVE_IDE=y
|
||||||
# CONFIG_IDE is not set
|
# CONFIG_IDE is not set
|
||||||
|
@ -538,6 +547,7 @@ CONFIG_INPUT_KEYBOARD=y
|
||||||
# CONFIG_KEYBOARD_XTKBD is not set
|
# CONFIG_KEYBOARD_XTKBD is not set
|
||||||
# CONFIG_KEYBOARD_NEWTON is not set
|
# CONFIG_KEYBOARD_NEWTON is not set
|
||||||
# CONFIG_KEYBOARD_STOWAWAY is not set
|
# CONFIG_KEYBOARD_STOWAWAY is not set
|
||||||
|
# CONFIG_KEYBOARD_LM8323 is not set
|
||||||
# CONFIG_KEYBOARD_GPIO is not set
|
# CONFIG_KEYBOARD_GPIO is not set
|
||||||
# CONFIG_INPUT_MOUSE is not set
|
# CONFIG_INPUT_MOUSE is not set
|
||||||
# CONFIG_INPUT_JOYSTICK is not set
|
# CONFIG_INPUT_JOYSTICK is not set
|
||||||
|
@ -597,9 +607,11 @@ CONFIG_I2C_HELPER_AUTO=y
|
||||||
#
|
#
|
||||||
# I2C system bus drivers (mostly embedded / system-on-chip)
|
# I2C system bus drivers (mostly embedded / system-on-chip)
|
||||||
#
|
#
|
||||||
|
# CONFIG_I2C_DESIGNWARE is not set
|
||||||
# CONFIG_I2C_GPIO is not set
|
# CONFIG_I2C_GPIO is not set
|
||||||
# CONFIG_I2C_OCORES is not set
|
# CONFIG_I2C_OCORES is not set
|
||||||
# CONFIG_I2C_SIMTEC is not set
|
# CONFIG_I2C_SIMTEC is not set
|
||||||
|
CONFIG_I2C_STU300=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# External I2C/SMBus adapter drivers
|
# External I2C/SMBus adapter drivers
|
||||||
|
@ -620,7 +632,6 @@ CONFIG_I2C_HELPER_AUTO=y
|
||||||
# CONFIG_SENSORS_PCF8574 is not set
|
# CONFIG_SENSORS_PCF8574 is not set
|
||||||
# CONFIG_PCF8575 is not set
|
# CONFIG_PCF8575 is not set
|
||||||
# CONFIG_SENSORS_PCA9539 is not set
|
# CONFIG_SENSORS_PCA9539 is not set
|
||||||
# CONFIG_SENSORS_MAX6875 is not set
|
|
||||||
# CONFIG_SENSORS_TSL2550 is not set
|
# CONFIG_SENSORS_TSL2550 is not set
|
||||||
# CONFIG_I2C_DEBUG_CORE is not set
|
# CONFIG_I2C_DEBUG_CORE is not set
|
||||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||||
|
@ -635,6 +646,7 @@ CONFIG_SPI_MASTER=y
|
||||||
#
|
#
|
||||||
# CONFIG_SPI_BITBANG is not set
|
# CONFIG_SPI_BITBANG is not set
|
||||||
# CONFIG_SPI_GPIO is not set
|
# CONFIG_SPI_GPIO is not set
|
||||||
|
CONFIG_SPI_PL022=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# SPI Protocol Masters
|
# SPI Protocol Masters
|
||||||
|
@ -647,6 +659,7 @@ CONFIG_POWER_SUPPLY=y
|
||||||
# CONFIG_PDA_POWER is not set
|
# CONFIG_PDA_POWER is not set
|
||||||
# CONFIG_BATTERY_DS2760 is not set
|
# CONFIG_BATTERY_DS2760 is not set
|
||||||
# CONFIG_BATTERY_BQ27x00 is not set
|
# CONFIG_BATTERY_BQ27x00 is not set
|
||||||
|
# CONFIG_BATTERY_MAX17040 is not set
|
||||||
# CONFIG_HWMON is not set
|
# CONFIG_HWMON is not set
|
||||||
# CONFIG_THERMAL is not set
|
# CONFIG_THERMAL is not set
|
||||||
# CONFIG_THERMAL_HWMON is not set
|
# CONFIG_THERMAL_HWMON is not set
|
||||||
|
@ -657,6 +670,7 @@ CONFIG_WATCHDOG=y
|
||||||
# Watchdog Device Drivers
|
# Watchdog Device Drivers
|
||||||
#
|
#
|
||||||
# CONFIG_SOFT_WATCHDOG is not set
|
# CONFIG_SOFT_WATCHDOG is not set
|
||||||
|
CONFIG_COH901327_WATCHDOG=y
|
||||||
CONFIG_SSB_POSSIBLE=y
|
CONFIG_SSB_POSSIBLE=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -678,22 +692,9 @@ CONFIG_SSB_POSSIBLE=y
|
||||||
# CONFIG_MFD_WM8400 is not set
|
# CONFIG_MFD_WM8400 is not set
|
||||||
# CONFIG_MFD_WM8350_I2C is not set
|
# CONFIG_MFD_WM8350_I2C is not set
|
||||||
# CONFIG_MFD_PCF50633 is not set
|
# CONFIG_MFD_PCF50633 is not set
|
||||||
|
CONFIG_AB3100_CORE=y
|
||||||
#
|
# CONFIG_EZX_PCAP is not set
|
||||||
# Multimedia devices
|
# CONFIG_MEDIA_SUPPORT is not set
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Multimedia core support
|
|
||||||
#
|
|
||||||
# CONFIG_VIDEO_DEV is not set
|
|
||||||
# CONFIG_DVB_CORE is not set
|
|
||||||
# CONFIG_VIDEO_MEDIA is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# Multimedia drivers
|
|
||||||
#
|
|
||||||
# CONFIG_DAB is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Graphics support
|
# Graphics support
|
||||||
|
@ -760,6 +761,11 @@ CONFIG_SND_JACK=y
|
||||||
# CONFIG_SND_VERBOSE_PROCFS is not set
|
# CONFIG_SND_VERBOSE_PROCFS is not set
|
||||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||||
# CONFIG_SND_DEBUG is not set
|
# CONFIG_SND_DEBUG is not set
|
||||||
|
# CONFIG_SND_RAWMIDI_SEQ is not set
|
||||||
|
# CONFIG_SND_OPL3_LIB_SEQ is not set
|
||||||
|
# CONFIG_SND_OPL4_LIB_SEQ is not set
|
||||||
|
# CONFIG_SND_SBAWE_SEQ is not set
|
||||||
|
# CONFIG_SND_EMU10K1_SEQ is not set
|
||||||
# CONFIG_SND_DRIVERS is not set
|
# CONFIG_SND_DRIVERS is not set
|
||||||
# CONFIG_SND_ARM is not set
|
# CONFIG_SND_ARM is not set
|
||||||
# CONFIG_SND_SPI is not set
|
# CONFIG_SND_SPI is not set
|
||||||
|
@ -770,7 +776,7 @@ CONFIG_SND_SOC_I2C_AND_SPI=y
|
||||||
# CONFIG_HID_SUPPORT is not set
|
# CONFIG_HID_SUPPORT is not set
|
||||||
# CONFIG_USB_SUPPORT is not set
|
# CONFIG_USB_SUPPORT is not set
|
||||||
CONFIG_MMC=y
|
CONFIG_MMC=y
|
||||||
# CONFIG_MMC_DEBUG is not set
|
CONFIG_MMC_DEBUG=y
|
||||||
# CONFIG_MMC_UNSAFE_RESUME is not set
|
# CONFIG_MMC_UNSAFE_RESUME is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -797,7 +803,7 @@ CONFIG_LEDS_CLASS=y
|
||||||
#
|
#
|
||||||
# CONFIG_LEDS_PCA9532 is not set
|
# CONFIG_LEDS_PCA9532 is not set
|
||||||
# CONFIG_LEDS_GPIO is not set
|
# CONFIG_LEDS_GPIO is not set
|
||||||
# CONFIG_LEDS_LP5521 is not set
|
# CONFIG_LEDS_LP3944 is not set
|
||||||
# CONFIG_LEDS_PCA955X is not set
|
# CONFIG_LEDS_PCA955X is not set
|
||||||
# CONFIG_LEDS_DAC124S085 is not set
|
# CONFIG_LEDS_DAC124S085 is not set
|
||||||
# CONFIG_LEDS_BD2802 is not set
|
# CONFIG_LEDS_BD2802 is not set
|
||||||
|
@ -845,6 +851,7 @@ CONFIG_RTC_INTF_DEV=y
|
||||||
# CONFIG_RTC_DRV_S35390A is not set
|
# CONFIG_RTC_DRV_S35390A is not set
|
||||||
# CONFIG_RTC_DRV_FM3130 is not set
|
# CONFIG_RTC_DRV_FM3130 is not set
|
||||||
# CONFIG_RTC_DRV_RX8581 is not set
|
# CONFIG_RTC_DRV_RX8581 is not set
|
||||||
|
# CONFIG_RTC_DRV_RX8025 is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# SPI RTC drivers
|
# SPI RTC drivers
|
||||||
|
@ -887,7 +894,10 @@ CONFIG_REGULATOR=y
|
||||||
# CONFIG_REGULATOR_DEBUG is not set
|
# CONFIG_REGULATOR_DEBUG is not set
|
||||||
# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
|
# CONFIG_REGULATOR_FIXED_VOLTAGE is not set
|
||||||
# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
|
# CONFIG_REGULATOR_VIRTUAL_CONSUMER is not set
|
||||||
|
# CONFIG_REGULATOR_USERSPACE_CONSUMER is not set
|
||||||
# CONFIG_REGULATOR_BQ24022 is not set
|
# CONFIG_REGULATOR_BQ24022 is not set
|
||||||
|
# CONFIG_REGULATOR_MAX1586 is not set
|
||||||
|
# CONFIG_REGULATOR_LP3971 is not set
|
||||||
# CONFIG_UIO is not set
|
# CONFIG_UIO is not set
|
||||||
# CONFIG_STAGING is not set
|
# CONFIG_STAGING is not set
|
||||||
|
|
||||||
|
@ -900,16 +910,20 @@ CONFIG_REGULATOR=y
|
||||||
# CONFIG_REISERFS_FS is not set
|
# CONFIG_REISERFS_FS is not set
|
||||||
# CONFIG_JFS_FS is not set
|
# CONFIG_JFS_FS is not set
|
||||||
# CONFIG_FS_POSIX_ACL is not set
|
# CONFIG_FS_POSIX_ACL is not set
|
||||||
CONFIG_FILE_LOCKING=y
|
|
||||||
# CONFIG_XFS_FS is not set
|
# CONFIG_XFS_FS is not set
|
||||||
|
# CONFIG_GFS2_FS is not set
|
||||||
# CONFIG_OCFS2_FS is not set
|
# CONFIG_OCFS2_FS is not set
|
||||||
# CONFIG_BTRFS_FS is not set
|
# CONFIG_BTRFS_FS is not set
|
||||||
|
CONFIG_FILE_LOCKING=y
|
||||||
|
CONFIG_FSNOTIFY=y
|
||||||
# CONFIG_DNOTIFY is not set
|
# CONFIG_DNOTIFY is not set
|
||||||
# CONFIG_INOTIFY is not set
|
# CONFIG_INOTIFY is not set
|
||||||
|
CONFIG_INOTIFY_USER=y
|
||||||
# CONFIG_QUOTA is not set
|
# CONFIG_QUOTA is not set
|
||||||
# CONFIG_AUTOFS_FS is not set
|
# CONFIG_AUTOFS_FS is not set
|
||||||
# CONFIG_AUTOFS4_FS is not set
|
# CONFIG_AUTOFS4_FS is not set
|
||||||
CONFIG_FUSE_FS=y
|
CONFIG_FUSE_FS=y
|
||||||
|
# CONFIG_CUSE is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# Caches
|
# Caches
|
||||||
|
@ -1033,6 +1047,7 @@ CONFIG_TIMER_STATS=y
|
||||||
# CONFIG_DEBUG_OBJECTS is not set
|
# CONFIG_DEBUG_OBJECTS is not set
|
||||||
# CONFIG_SLUB_DEBUG_ON is not set
|
# CONFIG_SLUB_DEBUG_ON is not set
|
||||||
# CONFIG_SLUB_STATS is not set
|
# CONFIG_SLUB_STATS is not set
|
||||||
|
# CONFIG_DEBUG_KMEMLEAK is not set
|
||||||
# CONFIG_DEBUG_PREEMPT is not set
|
# CONFIG_DEBUG_PREEMPT is not set
|
||||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||||
# CONFIG_RT_MUTEX_TESTER is not set
|
# CONFIG_RT_MUTEX_TESTER is not set
|
||||||
|
@ -1063,18 +1078,16 @@ CONFIG_DEBUG_INFO=y
|
||||||
# CONFIG_PAGE_POISONING is not set
|
# CONFIG_PAGE_POISONING is not set
|
||||||
CONFIG_HAVE_FUNCTION_TRACER=y
|
CONFIG_HAVE_FUNCTION_TRACER=y
|
||||||
CONFIG_TRACING_SUPPORT=y
|
CONFIG_TRACING_SUPPORT=y
|
||||||
|
CONFIG_FTRACE=y
|
||||||
#
|
|
||||||
# Tracers
|
|
||||||
#
|
|
||||||
# CONFIG_FUNCTION_TRACER is not set
|
# CONFIG_FUNCTION_TRACER is not set
|
||||||
# CONFIG_IRQSOFF_TRACER is not set
|
# CONFIG_IRQSOFF_TRACER is not set
|
||||||
# CONFIG_PREEMPT_TRACER is not set
|
# CONFIG_PREEMPT_TRACER is not set
|
||||||
# CONFIG_SCHED_TRACER is not set
|
# CONFIG_SCHED_TRACER is not set
|
||||||
# CONFIG_CONTEXT_SWITCH_TRACER is not set
|
# CONFIG_ENABLE_DEFAULT_TRACERS is not set
|
||||||
# CONFIG_EVENT_TRACER is not set
|
|
||||||
# CONFIG_BOOT_TRACER is not set
|
# CONFIG_BOOT_TRACER is not set
|
||||||
# CONFIG_TRACE_BRANCH_PROFILING is not set
|
CONFIG_BRANCH_PROFILE_NONE=y
|
||||||
|
# CONFIG_PROFILE_ANNOTATED_BRANCHES is not set
|
||||||
|
# CONFIG_PROFILE_ALL_BRANCHES is not set
|
||||||
# CONFIG_STACK_TRACER is not set
|
# CONFIG_STACK_TRACER is not set
|
||||||
# CONFIG_KMEMTRACE is not set
|
# CONFIG_KMEMTRACE is not set
|
||||||
# CONFIG_WORKQUEUE_TRACER is not set
|
# CONFIG_WORKQUEUE_TRACER is not set
|
||||||
|
@ -1109,6 +1122,7 @@ CONFIG_GENERIC_FIND_LAST_BIT=y
|
||||||
# CONFIG_CRC32 is not set
|
# CONFIG_CRC32 is not set
|
||||||
# CONFIG_CRC7 is not set
|
# CONFIG_CRC7 is not set
|
||||||
# CONFIG_LIBCRC32C is not set
|
# CONFIG_LIBCRC32C is not set
|
||||||
|
CONFIG_GENERIC_ALLOCATOR=y
|
||||||
CONFIG_HAS_IOMEM=y
|
CONFIG_HAS_IOMEM=y
|
||||||
CONFIG_HAS_IOPORT=y
|
CONFIG_HAS_IOPORT=y
|
||||||
CONFIG_HAS_DMA=y
|
CONFIG_HAS_DMA=y
|
||||||
|
|
|
@ -12,7 +12,7 @@
|
||||||
|
|
||||||
/* PAGE_SHIFT determines the page size */
|
/* PAGE_SHIFT determines the page size */
|
||||||
#define PAGE_SHIFT 12
|
#define PAGE_SHIFT 12
|
||||||
#define PAGE_SIZE (1UL << PAGE_SHIFT)
|
#define PAGE_SIZE (_AC(1,UL) << PAGE_SHIFT)
|
||||||
#define PAGE_MASK (~(PAGE_SIZE-1))
|
#define PAGE_MASK (~(PAGE_SIZE-1))
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
|
@ -285,15 +285,6 @@ extern struct page *empty_zero_page;
|
||||||
#define pte_young(pte) (pte_val(pte) & L_PTE_YOUNG)
|
#define pte_young(pte) (pte_val(pte) & L_PTE_YOUNG)
|
||||||
#define pte_special(pte) (0)
|
#define pte_special(pte) (0)
|
||||||
|
|
||||||
/*
|
|
||||||
* The following only works if pte_present() is not true.
|
|
||||||
*/
|
|
||||||
#define pte_file(pte) (pte_val(pte) & L_PTE_FILE)
|
|
||||||
#define pte_to_pgoff(x) (pte_val(x) >> 2)
|
|
||||||
#define pgoff_to_pte(x) __pte(((x) << 2) | L_PTE_FILE)
|
|
||||||
|
|
||||||
#define PTE_FILE_MAX_BITS 30
|
|
||||||
|
|
||||||
#define PTE_BIT_FUNC(fn,op) \
|
#define PTE_BIT_FUNC(fn,op) \
|
||||||
static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
|
static inline pte_t pte_##fn(pte_t pte) { pte_val(pte) op; return pte; }
|
||||||
|
|
||||||
|
@ -384,16 +375,50 @@ static inline pte_t pte_modify(pte_t pte, pgprot_t newprot)
|
||||||
|
|
||||||
extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
||||||
|
|
||||||
/* Encode and decode a swap entry.
|
/*
|
||||||
|
* Encode and decode a swap entry. Swap entries are stored in the Linux
|
||||||
|
* page tables as follows:
|
||||||
*
|
*
|
||||||
* We support up to 32GB of swap on 4k machines
|
* 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
|
||||||
|
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|
||||||
|
* <--------------- offset --------------------> <--- type --> 0 0
|
||||||
|
*
|
||||||
|
* This gives us up to 127 swap files and 32GB per swap file. Note that
|
||||||
|
* the offset field is always non-zero.
|
||||||
*/
|
*/
|
||||||
#define __swp_type(x) (((x).val >> 2) & 0x7f)
|
#define __SWP_TYPE_SHIFT 2
|
||||||
#define __swp_offset(x) ((x).val >> 9)
|
#define __SWP_TYPE_BITS 7
|
||||||
#define __swp_entry(type,offset) ((swp_entry_t) { ((type) << 2) | ((offset) << 9) })
|
#define __SWP_TYPE_MASK ((1 << __SWP_TYPE_BITS) - 1)
|
||||||
|
#define __SWP_OFFSET_SHIFT (__SWP_TYPE_BITS + __SWP_TYPE_SHIFT)
|
||||||
|
|
||||||
|
#define __swp_type(x) (((x).val >> __SWP_TYPE_SHIFT) & __SWP_TYPE_MASK)
|
||||||
|
#define __swp_offset(x) ((x).val >> __SWP_OFFSET_SHIFT)
|
||||||
|
#define __swp_entry(type,offset) ((swp_entry_t) { ((type) << __SWP_TYPE_SHIFT) | ((offset) << __SWP_OFFSET_SHIFT) })
|
||||||
|
|
||||||
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
|
#define __pte_to_swp_entry(pte) ((swp_entry_t) { pte_val(pte) })
|
||||||
#define __swp_entry_to_pte(swp) ((pte_t) { (swp).val })
|
#define __swp_entry_to_pte(swp) ((pte_t) { (swp).val })
|
||||||
|
|
||||||
|
/*
|
||||||
|
* It is an error for the kernel to have more swap files than we can
|
||||||
|
* encode in the PTEs. This ensures that we know when MAX_SWAPFILES
|
||||||
|
* is increased beyond what we presently support.
|
||||||
|
*/
|
||||||
|
#define MAX_SWAPFILES_CHECK() BUILD_BUG_ON(MAX_SWAPFILES_SHIFT > __SWP_TYPE_BITS)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Encode and decode a file entry. File entries are stored in the Linux
|
||||||
|
* page tables as follows:
|
||||||
|
*
|
||||||
|
* 3 3 2 2 2 2 2 2 2 2 2 2 1 1 1 1 1 1 1 1 1 1
|
||||||
|
* 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0 9 8 7 6 5 4 3 2 1 0
|
||||||
|
* <------------------------ offset -------------------------> 1 0
|
||||||
|
*/
|
||||||
|
#define pte_file(pte) (pte_val(pte) & L_PTE_FILE)
|
||||||
|
#define pte_to_pgoff(x) (pte_val(x) >> 2)
|
||||||
|
#define pgoff_to_pte(x) __pte(((x) << 2) | L_PTE_FILE)
|
||||||
|
|
||||||
|
#define PTE_FILE_MAX_BITS 30
|
||||||
|
|
||||||
/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
|
/* Needs to be defined here and not in linux/mm.h, as it is arch dependent */
|
||||||
/* FIXME: this is not correct */
|
/* FIXME: this is not correct */
|
||||||
#define kern_addr_valid(addr) (1)
|
#define kern_addr_valid(addr) (1)
|
||||||
|
|
|
@ -73,7 +73,7 @@ struct thread_info {
|
||||||
.task = &tsk, \
|
.task = &tsk, \
|
||||||
.exec_domain = &default_exec_domain, \
|
.exec_domain = &default_exec_domain, \
|
||||||
.flags = 0, \
|
.flags = 0, \
|
||||||
.preempt_count = 1, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
.cpu_domain = domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \
|
.cpu_domain = domain_val(DOMAIN_USER, DOMAIN_MANAGER) | \
|
||||||
domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \
|
domain_val(DOMAIN_KERNEL, DOMAIN_MANAGER) | \
|
||||||
|
|
|
@ -98,17 +98,6 @@ unlock:
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Handle bad interrupts */
|
|
||||||
static struct irq_desc bad_irq_desc = {
|
|
||||||
.handle_irq = handle_bad_irq,
|
|
||||||
.lock = __SPIN_LOCK_UNLOCKED(bad_irq_desc.lock),
|
|
||||||
};
|
|
||||||
|
|
||||||
#ifdef CONFIG_CPUMASK_OFFSTACK
|
|
||||||
/* We are not allocating bad_irq_desc.affinity or .pending_mask */
|
|
||||||
#error "ARM architecture does not support CONFIG_CPUMASK_OFFSTACK."
|
|
||||||
#endif
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* do_IRQ handles all hardware IRQ's. Decoded IRQs should not
|
* do_IRQ handles all hardware IRQ's. Decoded IRQs should not
|
||||||
* come via this function. Instead, they should provide their
|
* come via this function. Instead, they should provide their
|
||||||
|
@ -124,10 +113,13 @@ asmlinkage void __exception asm_do_IRQ(unsigned int irq, struct pt_regs *regs)
|
||||||
* Some hardware gives randomly wrong interrupts. Rather
|
* Some hardware gives randomly wrong interrupts. Rather
|
||||||
* than crashing, do something sensible.
|
* than crashing, do something sensible.
|
||||||
*/
|
*/
|
||||||
if (irq >= NR_IRQS)
|
if (unlikely(irq >= NR_IRQS)) {
|
||||||
handle_bad_irq(irq, &bad_irq_desc);
|
if (printk_ratelimit())
|
||||||
else
|
printk(KERN_WARNING "Bad IRQ%u\n", irq);
|
||||||
|
ack_bad_irq(irq);
|
||||||
|
} else {
|
||||||
generic_handle_irq(irq);
|
generic_handle_irq(irq);
|
||||||
|
}
|
||||||
|
|
||||||
/* AT91 specific workaround */
|
/* AT91 specific workaround */
|
||||||
irq_finish(irq);
|
irq_finish(irq);
|
||||||
|
@ -165,10 +157,6 @@ void __init init_IRQ(void)
|
||||||
for (irq = 0; irq < NR_IRQS; irq++)
|
for (irq = 0; irq < NR_IRQS; irq++)
|
||||||
irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_NOPROBE;
|
irq_desc[irq].status |= IRQ_NOREQUEST | IRQ_NOPROBE;
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
|
||||||
cpumask_setall(bad_irq_desc.affinity);
|
|
||||||
bad_irq_desc.node = smp_processor_id();
|
|
||||||
#endif
|
|
||||||
init_arch_irq();
|
init_arch_irq();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <asm-generic/vmlinux.lds.h>
|
#include <asm-generic/vmlinux.lds.h>
|
||||||
#include <asm/thread_info.h>
|
#include <asm/thread_info.h>
|
||||||
#include <asm/memory.h>
|
#include <asm/memory.h>
|
||||||
|
#include <asm/page.h>
|
||||||
|
|
||||||
OUTPUT_ARCH(arm)
|
OUTPUT_ARCH(arm)
|
||||||
ENTRY(stext)
|
ENTRY(stext)
|
||||||
|
@ -63,7 +64,7 @@ SECTIONS
|
||||||
usr/built-in.o(.init.ramfs)
|
usr/built-in.o(.init.ramfs)
|
||||||
__initramfs_end = .;
|
__initramfs_end = .;
|
||||||
#endif
|
#endif
|
||||||
. = ALIGN(4096);
|
. = ALIGN(PAGE_SIZE);
|
||||||
__per_cpu_load = .;
|
__per_cpu_load = .;
|
||||||
__per_cpu_start = .;
|
__per_cpu_start = .;
|
||||||
*(.data.percpu.page_aligned)
|
*(.data.percpu.page_aligned)
|
||||||
|
@ -73,7 +74,7 @@ SECTIONS
|
||||||
#ifndef CONFIG_XIP_KERNEL
|
#ifndef CONFIG_XIP_KERNEL
|
||||||
__init_begin = _stext;
|
__init_begin = _stext;
|
||||||
INIT_DATA
|
INIT_DATA
|
||||||
. = ALIGN(4096);
|
. = ALIGN(PAGE_SIZE);
|
||||||
__init_end = .;
|
__init_end = .;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -118,7 +119,7 @@ SECTIONS
|
||||||
*(.got) /* Global offset table */
|
*(.got) /* Global offset table */
|
||||||
}
|
}
|
||||||
|
|
||||||
RODATA
|
RO_DATA(PAGE_SIZE)
|
||||||
|
|
||||||
_etext = .; /* End of text and rodata section */
|
_etext = .; /* End of text and rodata section */
|
||||||
|
|
||||||
|
@ -158,17 +159,17 @@ SECTIONS
|
||||||
*(.data.init_task)
|
*(.data.init_task)
|
||||||
|
|
||||||
#ifdef CONFIG_XIP_KERNEL
|
#ifdef CONFIG_XIP_KERNEL
|
||||||
. = ALIGN(4096);
|
. = ALIGN(PAGE_SIZE);
|
||||||
__init_begin = .;
|
__init_begin = .;
|
||||||
INIT_DATA
|
INIT_DATA
|
||||||
. = ALIGN(4096);
|
. = ALIGN(PAGE_SIZE);
|
||||||
__init_end = .;
|
__init_end = .;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
. = ALIGN(4096);
|
. = ALIGN(PAGE_SIZE);
|
||||||
__nosave_begin = .;
|
__nosave_begin = .;
|
||||||
*(.data.nosave)
|
*(.data.nosave)
|
||||||
. = ALIGN(4096);
|
. = ALIGN(PAGE_SIZE);
|
||||||
__nosave_end = .;
|
__nosave_end = .;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -24,6 +24,8 @@
|
||||||
#include <linux/platform_device.h>
|
#include <linux/platform_device.h>
|
||||||
#include <linux/spi/spi.h>
|
#include <linux/spi/spi.h>
|
||||||
#include <linux/spi/at73c213.h>
|
#include <linux/spi/at73c213.h>
|
||||||
|
#include <linux/gpio_keys.h>
|
||||||
|
#include <linux/input.h>
|
||||||
#include <linux/clk.h>
|
#include <linux/clk.h>
|
||||||
|
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
|
@ -218,6 +220,56 @@ static struct gpio_led ek_leds[] = {
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* GPIO Buttons
|
||||||
|
*/
|
||||||
|
#if defined(CONFIG_KEYBOARD_GPIO) || defined(CONFIG_KEYBOARD_GPIO_MODULE)
|
||||||
|
static struct gpio_keys_button ek_buttons[] = {
|
||||||
|
{
|
||||||
|
.gpio = AT91_PIN_PA30,
|
||||||
|
.code = BTN_3,
|
||||||
|
.desc = "Button 3",
|
||||||
|
.active_low = 1,
|
||||||
|
.wakeup = 1,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
.gpio = AT91_PIN_PA31,
|
||||||
|
.code = BTN_4,
|
||||||
|
.desc = "Button 4",
|
||||||
|
.active_low = 1,
|
||||||
|
.wakeup = 1,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct gpio_keys_platform_data ek_button_data = {
|
||||||
|
.buttons = ek_buttons,
|
||||||
|
.nbuttons = ARRAY_SIZE(ek_buttons),
|
||||||
|
};
|
||||||
|
|
||||||
|
static struct platform_device ek_button_device = {
|
||||||
|
.name = "gpio-keys",
|
||||||
|
.id = -1,
|
||||||
|
.num_resources = 0,
|
||||||
|
.dev = {
|
||||||
|
.platform_data = &ek_button_data,
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
static void __init ek_add_device_buttons(void)
|
||||||
|
{
|
||||||
|
at91_set_gpio_input(AT91_PIN_PA30, 1); /* btn3 */
|
||||||
|
at91_set_deglitch(AT91_PIN_PA30, 1);
|
||||||
|
at91_set_gpio_input(AT91_PIN_PA31, 1); /* btn4 */
|
||||||
|
at91_set_deglitch(AT91_PIN_PA31, 1);
|
||||||
|
|
||||||
|
platform_device_register(&ek_button_device);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static void __init ek_add_device_buttons(void) {}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
|
||||||
static struct i2c_board_info __initdata ek_i2c_devices[] = {
|
static struct i2c_board_info __initdata ek_i2c_devices[] = {
|
||||||
{
|
{
|
||||||
I2C_BOARD_INFO("24c512", 0x50),
|
I2C_BOARD_INFO("24c512", 0x50),
|
||||||
|
@ -245,6 +297,8 @@ static void __init ek_board_init(void)
|
||||||
at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
|
at91_add_device_i2c(ek_i2c_devices, ARRAY_SIZE(ek_i2c_devices));
|
||||||
/* LEDs */
|
/* LEDs */
|
||||||
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
|
at91_gpio_leds(ek_leds, ARRAY_SIZE(ek_leds));
|
||||||
|
/* Push Buttons */
|
||||||
|
ek_add_device_buttons();
|
||||||
/* PCK0 provides MCLK to the WM8731 */
|
/* PCK0 provides MCLK to the WM8731 */
|
||||||
at91_set_B_periph(AT91_PIN_PC1, 0);
|
at91_set_B_periph(AT91_PIN_PC1, 0);
|
||||||
/* SSC (for WM8731) */
|
/* SSC (for WM8731) */
|
||||||
|
|
|
@ -186,19 +186,21 @@ static struct fb_monspecs at91fb_default_monspecs = {
|
||||||
static void at91_lcdc_power_control(int on)
|
static void at91_lcdc_power_control(int on)
|
||||||
{
|
{
|
||||||
if (on)
|
if (on)
|
||||||
at91_set_gpio_value(AT91_PIN_PA30, 0); /* power up */
|
at91_set_gpio_value(AT91_PIN_PC1, 0); /* power up */
|
||||||
else
|
else
|
||||||
at91_set_gpio_value(AT91_PIN_PA30, 1); /* power down */
|
at91_set_gpio_value(AT91_PIN_PC1, 1); /* power down */
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Driver datas */
|
/* Driver datas */
|
||||||
static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
|
static struct atmel_lcdfb_info __initdata ek_lcdc_data = {
|
||||||
|
.lcdcon_is_backlight = true,
|
||||||
.default_bpp = 16,
|
.default_bpp = 16,
|
||||||
.default_dmacon = ATMEL_LCDC_DMAEN,
|
.default_dmacon = ATMEL_LCDC_DMAEN,
|
||||||
.default_lcdcon2 = AT91SAM9RL_DEFAULT_LCDCON2,
|
.default_lcdcon2 = AT91SAM9RL_DEFAULT_LCDCON2,
|
||||||
.default_monspecs = &at91fb_default_monspecs,
|
.default_monspecs = &at91fb_default_monspecs,
|
||||||
.atmel_lcdfb_power_control = at91_lcdc_power_control,
|
.atmel_lcdfb_power_control = at91_lcdc_power_control,
|
||||||
.guard_time = 1,
|
.guard_time = 1,
|
||||||
|
.lcd_wiring_mode = ATMEL_LCDC_WIRING_RGB,
|
||||||
};
|
};
|
||||||
|
|
||||||
#else
|
#else
|
||||||
|
|
|
@ -36,7 +36,6 @@
|
||||||
#include <mach/hwa742.h>
|
#include <mach/hwa742.h>
|
||||||
#include <mach/lcd_mipid.h>
|
#include <mach/lcd_mipid.h>
|
||||||
#include <mach/mmc.h>
|
#include <mach/mmc.h>
|
||||||
#include <mach/usb.h>
|
|
||||||
#include <mach/clock.h>
|
#include <mach/clock.h>
|
||||||
|
|
||||||
#define ADS7846_PENDOWN_GPIO 15
|
#define ADS7846_PENDOWN_GPIO 15
|
||||||
|
@ -205,9 +204,11 @@ static int nokia770_mmc_get_cover_state(struct device *dev, int slot)
|
||||||
static struct omap_mmc_platform_data nokia770_mmc2_data = {
|
static struct omap_mmc_platform_data nokia770_mmc2_data = {
|
||||||
.nr_slots = 1,
|
.nr_slots = 1,
|
||||||
.dma_mask = 0xffffffff,
|
.dma_mask = 0xffffffff,
|
||||||
|
.max_freq = 12000000,
|
||||||
.slots[0] = {
|
.slots[0] = {
|
||||||
.set_power = nokia770_mmc_set_power,
|
.set_power = nokia770_mmc_set_power,
|
||||||
.get_cover_state = nokia770_mmc_get_cover_state,
|
.get_cover_state = nokia770_mmc_get_cover_state,
|
||||||
|
.ocr_mask = MMC_VDD_32_33|MMC_VDD_33_34,
|
||||||
.name = "mmcblk",
|
.name = "mmcblk",
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
|
@ -203,5 +203,5 @@ module_exit(omap1_mbox_exit);
|
||||||
|
|
||||||
MODULE_LICENSE("GPL v2");
|
MODULE_LICENSE("GPL v2");
|
||||||
MODULE_DESCRIPTION("omap mailbox: omap1 architecture specific functions");
|
MODULE_DESCRIPTION("omap mailbox: omap1 architecture specific functions");
|
||||||
MODULE_AUTHOR("Hiroshi DOYU" <Hiroshi.DOYU@nokia.com>);
|
MODULE_AUTHOR("Hiroshi DOYU <Hiroshi.DOYU@nokia.com>");
|
||||||
MODULE_ALIAS("platform:omap1-mailbox");
|
MODULE_ALIAS("platform:omap1-mailbox");
|
||||||
|
|
|
@ -362,6 +362,7 @@ static struct omap_onenand_platform_data board_onenand_data = {
|
||||||
.gpio_irq = 65,
|
.gpio_irq = 65,
|
||||||
.parts = onenand_partitions,
|
.parts = onenand_partitions,
|
||||||
.nr_parts = ARRAY_SIZE(onenand_partitions),
|
.nr_parts = ARRAY_SIZE(onenand_partitions),
|
||||||
|
.flags = ONENAND_SYNC_READWRITE,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void __init board_onenand_init(void)
|
static void __init board_onenand_init(void)
|
||||||
|
|
|
@ -31,6 +31,8 @@ static struct platform_device gpmc_onenand_device = {
|
||||||
static int omap2_onenand_set_async_mode(int cs, void __iomem *onenand_base)
|
static int omap2_onenand_set_async_mode(int cs, void __iomem *onenand_base)
|
||||||
{
|
{
|
||||||
struct gpmc_timings t;
|
struct gpmc_timings t;
|
||||||
|
u32 reg;
|
||||||
|
int err;
|
||||||
|
|
||||||
const int t_cer = 15;
|
const int t_cer = 15;
|
||||||
const int t_avdp = 12;
|
const int t_avdp = 12;
|
||||||
|
@ -43,6 +45,11 @@ static int omap2_onenand_set_async_mode(int cs, void __iomem *onenand_base)
|
||||||
const int t_wpl = 40;
|
const int t_wpl = 40;
|
||||||
const int t_wph = 30;
|
const int t_wph = 30;
|
||||||
|
|
||||||
|
/* Ensure sync read and sync write are disabled */
|
||||||
|
reg = readw(onenand_base + ONENAND_REG_SYS_CFG1);
|
||||||
|
reg &= ~ONENAND_SYS_CFG1_SYNC_READ & ~ONENAND_SYS_CFG1_SYNC_WRITE;
|
||||||
|
writew(reg, onenand_base + ONENAND_REG_SYS_CFG1);
|
||||||
|
|
||||||
memset(&t, 0, sizeof(t));
|
memset(&t, 0, sizeof(t));
|
||||||
t.sync_clk = 0;
|
t.sync_clk = 0;
|
||||||
t.cs_on = 0;
|
t.cs_on = 0;
|
||||||
|
@ -74,7 +81,16 @@ static int omap2_onenand_set_async_mode(int cs, void __iomem *onenand_base)
|
||||||
GPMC_CONFIG1_DEVICESIZE_16 |
|
GPMC_CONFIG1_DEVICESIZE_16 |
|
||||||
GPMC_CONFIG1_MUXADDDATA);
|
GPMC_CONFIG1_MUXADDDATA);
|
||||||
|
|
||||||
return gpmc_cs_set_timings(cs, &t);
|
err = gpmc_cs_set_timings(cs, &t);
|
||||||
|
if (err)
|
||||||
|
return err;
|
||||||
|
|
||||||
|
/* Ensure sync read and sync write are disabled */
|
||||||
|
reg = readw(onenand_base + ONENAND_REG_SYS_CFG1);
|
||||||
|
reg &= ~ONENAND_SYS_CFG1_SYNC_READ & ~ONENAND_SYS_CFG1_SYNC_WRITE;
|
||||||
|
writew(reg, onenand_base + ONENAND_REG_SYS_CFG1);
|
||||||
|
|
||||||
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
static void set_onenand_cfg(void __iomem *onenand_base, int latency,
|
static void set_onenand_cfg(void __iomem *onenand_base, int latency,
|
||||||
|
@ -124,7 +140,8 @@ static int omap2_onenand_set_sync_mode(struct omap_onenand_platform_data *cfg,
|
||||||
} else if (cfg->flags & ONENAND_SYNC_READWRITE) {
|
} else if (cfg->flags & ONENAND_SYNC_READWRITE) {
|
||||||
sync_read = 1;
|
sync_read = 1;
|
||||||
sync_write = 1;
|
sync_write = 1;
|
||||||
}
|
} else
|
||||||
|
return omap2_onenand_set_async_mode(cs, onenand_base);
|
||||||
|
|
||||||
if (!freq) {
|
if (!freq) {
|
||||||
/* Very first call freq is not known */
|
/* Very first call freq is not known */
|
||||||
|
|
|
@ -48,6 +48,28 @@ int omap_chip_is(struct omap_chip_id oci)
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL(omap_chip_is);
|
EXPORT_SYMBOL(omap_chip_is);
|
||||||
|
|
||||||
|
int omap_type(void)
|
||||||
|
{
|
||||||
|
u32 val = 0;
|
||||||
|
|
||||||
|
if (cpu_is_omap24xx())
|
||||||
|
val = omap_ctrl_readl(OMAP24XX_CONTROL_STATUS);
|
||||||
|
else if (cpu_is_omap34xx())
|
||||||
|
val = omap_ctrl_readl(OMAP343X_CONTROL_STATUS);
|
||||||
|
else {
|
||||||
|
pr_err("Cannot detect omap type!\n");
|
||||||
|
goto out;
|
||||||
|
}
|
||||||
|
|
||||||
|
val &= OMAP2_DEVICETYPE_MASK;
|
||||||
|
val >>= 8;
|
||||||
|
|
||||||
|
out:
|
||||||
|
return val;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(omap_type);
|
||||||
|
|
||||||
|
|
||||||
/*----------------------------------------------------------------------------*/
|
/*----------------------------------------------------------------------------*/
|
||||||
|
|
||||||
#define OMAP_TAP_IDCODE 0x0204
|
#define OMAP_TAP_IDCODE 0x0204
|
||||||
|
|
|
@ -282,12 +282,12 @@ static int __devinit omap2_mbox_probe(struct platform_device *pdev)
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
|
|
||||||
/* DSP or IVA2 IRQ */
|
/* DSP or IVA2 IRQ */
|
||||||
mbox_dsp_info.irq = platform_get_irq(pdev, 0);
|
ret = platform_get_irq(pdev, 0);
|
||||||
if (mbox_dsp_info.irq < 0) {
|
if (ret < 0) {
|
||||||
dev_err(&pdev->dev, "invalid irq resource\n");
|
dev_err(&pdev->dev, "invalid irq resource\n");
|
||||||
ret = -ENODEV;
|
|
||||||
goto err_dsp;
|
goto err_dsp;
|
||||||
}
|
}
|
||||||
|
mbox_dsp_info.irq = ret;
|
||||||
|
|
||||||
ret = omap_mbox_register(&pdev->dev, &mbox_dsp_info);
|
ret = omap_mbox_register(&pdev->dev, &mbox_dsp_info);
|
||||||
if (ret)
|
if (ret)
|
||||||
|
|
|
@ -263,8 +263,19 @@ static int twl_mmc1_set_power(struct device *dev, int slot, int power_on,
|
||||||
static int twl_mmc23_set_power(struct device *dev, int slot, int power_on, int vdd)
|
static int twl_mmc23_set_power(struct device *dev, int slot, int power_on, int vdd)
|
||||||
{
|
{
|
||||||
int ret = 0;
|
int ret = 0;
|
||||||
struct twl_mmc_controller *c = &hsmmc[1];
|
struct twl_mmc_controller *c = NULL;
|
||||||
struct omap_mmc_platform_data *mmc = dev->platform_data;
|
struct omap_mmc_platform_data *mmc = dev->platform_data;
|
||||||
|
int i;
|
||||||
|
|
||||||
|
for (i = 1; i < ARRAY_SIZE(hsmmc); i++) {
|
||||||
|
if (mmc == hsmmc[i].mmc) {
|
||||||
|
c = &hsmmc[i];
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (c == NULL)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
/* If we don't see a Vcc regulator, assume it's a fixed
|
/* If we don't see a Vcc regulator, assume it's a fixed
|
||||||
* voltage always-on regulator.
|
* voltage always-on regulator.
|
||||||
|
|
|
@ -48,8 +48,6 @@
|
||||||
#include <plat/mci.h>
|
#include <plat/mci.h>
|
||||||
#include <plat/udc.h>
|
#include <plat/udc.h>
|
||||||
|
|
||||||
#include <plat/regs-serial.h>
|
|
||||||
|
|
||||||
#include <linux/mtd/mtd.h>
|
#include <linux/mtd/mtd.h>
|
||||||
#include <linux/mtd/nand.h>
|
#include <linux/mtd/nand.h>
|
||||||
#include <linux/mtd/nand_ecc.h>
|
#include <linux/mtd/nand_ecc.h>
|
||||||
|
@ -275,6 +273,7 @@ static struct s3c2410_nand_set mini2440_nand_sets[] __initdata = {
|
||||||
.nr_chips = 1,
|
.nr_chips = 1,
|
||||||
.nr_partitions = ARRAY_SIZE(mini2440_default_nand_part),
|
.nr_partitions = ARRAY_SIZE(mini2440_default_nand_part),
|
||||||
.partitions = mini2440_default_nand_part,
|
.partitions = mini2440_default_nand_part,
|
||||||
|
.flash_bbt = 1, /* we use u-boot to create a BBT */
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -433,8 +433,7 @@ static struct s3c2410_nand_set gta02_nand_sets[] = {
|
||||||
*/
|
*/
|
||||||
.name = "neo1973-nand",
|
.name = "neo1973-nand",
|
||||||
.nr_chips = 1,
|
.nr_chips = 1,
|
||||||
.use_bbt = 1,
|
.flash_bbt = 1,
|
||||||
.force_soft_ecc = 1,
|
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
#include <linux/timer.h>
|
#include <linux/timer.h>
|
||||||
#include <linux/io.h>
|
#include <linux/io.h>
|
||||||
|
#include <linux/seq_file.h>
|
||||||
|
|
||||||
#include <asm/clkdev.h>
|
#include <asm/clkdev.h>
|
||||||
#include <mach/hardware.h>
|
#include <mach/hardware.h>
|
||||||
|
@ -702,6 +703,7 @@ static struct clk amba_clk = {
|
||||||
.rate = 52000000, /* this varies! */
|
.rate = 52000000, /* this varies! */
|
||||||
.hw_ctrld = true,
|
.hw_ctrld = true,
|
||||||
.reset = false,
|
.reset = false,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(amba_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -720,6 +722,7 @@ static struct clk cpu_clk = {
|
||||||
.set_rate = clk_set_rate_cpuclk,
|
.set_rate = clk_set_rate_cpuclk,
|
||||||
.get_rate = clk_get_rate_cpuclk,
|
.get_rate = clk_get_rate_cpuclk,
|
||||||
.round_rate = clk_round_rate_cpuclk,
|
.round_rate = clk_round_rate_cpuclk,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(cpu_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk nandif_clk = {
|
static struct clk nandif_clk = {
|
||||||
|
@ -732,6 +735,7 @@ static struct clk nandif_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_NANDIF_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_NANDIF_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(nandif_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk semi_clk = {
|
static struct clk semi_clk = {
|
||||||
|
@ -744,6 +748,7 @@ static struct clk semi_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_SEMI_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_SEMI_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(semi_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_MACH_U300_BS335
|
#ifdef CONFIG_MACH_U300_BS335
|
||||||
|
@ -758,6 +763,7 @@ static struct clk isp_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_ISP_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_ISP_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(isp_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk cds_clk = {
|
static struct clk cds_clk = {
|
||||||
|
@ -771,6 +777,7 @@ static struct clk cds_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_CDS_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_CDS_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(cds_clk.lock),
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -785,6 +792,7 @@ static struct clk dma_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_DMAC_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_DMAC_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(dma_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk aaif_clk = {
|
static struct clk aaif_clk = {
|
||||||
|
@ -798,6 +806,7 @@ static struct clk aaif_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_AAIF_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_AAIF_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(aaif_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk apex_clk = {
|
static struct clk apex_clk = {
|
||||||
|
@ -811,6 +820,7 @@ static struct clk apex_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_APEX_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_APEX_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(apex_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk video_enc_clk = {
|
static struct clk video_enc_clk = {
|
||||||
|
@ -825,6 +835,7 @@ static struct clk video_enc_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_VIDEO_ENC_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_VIDEO_ENC_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(video_enc_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk xgam_clk = {
|
static struct clk xgam_clk = {
|
||||||
|
@ -839,6 +850,7 @@ static struct clk xgam_clk = {
|
||||||
.get_rate = clk_get_rate_xgamclk,
|
.get_rate = clk_get_rate_xgamclk,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(xgam_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
/* This clock is used to activate the video encoder */
|
/* This clock is used to activate the video encoder */
|
||||||
|
@ -854,6 +866,7 @@ static struct clk ahb_clk = {
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
.get_rate = clk_get_rate_ahb_clk,
|
.get_rate = clk_get_rate_ahb_clk,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(ahb_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -871,6 +884,7 @@ static struct clk ahb_subsys_clk = {
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
.get_rate = clk_get_rate_ahb_clk,
|
.get_rate = clk_get_rate_ahb_clk,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(ahb_subsys_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk intcon_clk = {
|
static struct clk intcon_clk = {
|
||||||
|
@ -882,6 +896,8 @@ static struct clk intcon_clk = {
|
||||||
.res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
|
.res_reg = U300_SYSCON_VBASE + U300_SYSCON_RRR,
|
||||||
.res_mask = U300_SYSCON_RRR_INTCON_RESET_EN,
|
.res_mask = U300_SYSCON_RRR_INTCON_RESET_EN,
|
||||||
/* INTCON can be reset but not clock-gated */
|
/* INTCON can be reset but not clock-gated */
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(intcon_clk.lock),
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk mspro_clk = {
|
static struct clk mspro_clk = {
|
||||||
|
@ -895,6 +911,7 @@ static struct clk mspro_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_MSPRO_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_MSPRO_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(mspro_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk emif_clk = {
|
static struct clk emif_clk = {
|
||||||
|
@ -909,6 +926,7 @@ static struct clk emif_clk = {
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
.get_rate = clk_get_rate_emif_clk,
|
.get_rate = clk_get_rate_emif_clk,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(emif_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|
||||||
|
@ -926,6 +944,7 @@ static struct clk fast_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_FAST_BRIDGE_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(fast_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk mmcsd_clk = {
|
static struct clk mmcsd_clk = {
|
||||||
|
@ -942,6 +961,7 @@ static struct clk mmcsd_clk = {
|
||||||
.round_rate = clk_round_rate_mclk,
|
.round_rate = clk_round_rate_mclk,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(mmcsd_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk i2s0_clk = {
|
static struct clk i2s0_clk = {
|
||||||
|
@ -956,6 +976,7 @@ static struct clk i2s0_clk = {
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
.get_rate = clk_get_rate_i2s_i2c_spi,
|
.get_rate = clk_get_rate_i2s_i2c_spi,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(i2s0_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk i2s1_clk = {
|
static struct clk i2s1_clk = {
|
||||||
|
@ -970,6 +991,7 @@ static struct clk i2s1_clk = {
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
.get_rate = clk_get_rate_i2s_i2c_spi,
|
.get_rate = clk_get_rate_i2s_i2c_spi,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(i2s1_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk i2c0_clk = {
|
static struct clk i2c0_clk = {
|
||||||
|
@ -984,6 +1006,7 @@ static struct clk i2c0_clk = {
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
.get_rate = clk_get_rate_i2s_i2c_spi,
|
.get_rate = clk_get_rate_i2s_i2c_spi,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(i2c0_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk i2c1_clk = {
|
static struct clk i2c1_clk = {
|
||||||
|
@ -998,6 +1021,7 @@ static struct clk i2c1_clk = {
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
.get_rate = clk_get_rate_i2s_i2c_spi,
|
.get_rate = clk_get_rate_i2s_i2c_spi,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(i2c1_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk spi_clk = {
|
static struct clk spi_clk = {
|
||||||
|
@ -1012,6 +1036,7 @@ static struct clk spi_clk = {
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
.get_rate = clk_get_rate_i2s_i2c_spi,
|
.get_rate = clk_get_rate_i2s_i2c_spi,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(spi_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_MACH_U300_BS335
|
#ifdef CONFIG_MACH_U300_BS335
|
||||||
|
@ -1026,6 +1051,7 @@ static struct clk uart1_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_UART1_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_UART1_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(uart1_clk.lock),
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1044,6 +1070,7 @@ static struct clk slow_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_SLOW_BRIDGE_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(slow_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
/* TODO: implement SYSCON clock? */
|
/* TODO: implement SYSCON clock? */
|
||||||
|
@ -1055,6 +1082,7 @@ static struct clk wdog_clk = {
|
||||||
.rate = 32768,
|
.rate = 32768,
|
||||||
.reset = false,
|
.reset = false,
|
||||||
/* This is always on, cannot be enabled/disabled or reset */
|
/* This is always on, cannot be enabled/disabled or reset */
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(wdog_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
/* This one is hardwired to PLL13 */
|
/* This one is hardwired to PLL13 */
|
||||||
|
@ -1069,6 +1097,7 @@ static struct clk uart_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_UART_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_UART_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(uart_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk keypad_clk = {
|
static struct clk keypad_clk = {
|
||||||
|
@ -1082,6 +1111,7 @@ static struct clk keypad_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_KEYPAD_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_KEYPAD_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(keypad_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk gpio_clk = {
|
static struct clk gpio_clk = {
|
||||||
|
@ -1095,6 +1125,7 @@ static struct clk gpio_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_GPIO_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_GPIO_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(gpio_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk rtc_clk = {
|
static struct clk rtc_clk = {
|
||||||
|
@ -1106,6 +1137,7 @@ static struct clk rtc_clk = {
|
||||||
.res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR,
|
.res_reg = U300_SYSCON_VBASE + U300_SYSCON_RSR,
|
||||||
.res_mask = U300_SYSCON_RSR_RTC_RESET_EN,
|
.res_mask = U300_SYSCON_RSR_RTC_RESET_EN,
|
||||||
/* This clock is always on, cannot be enabled/disabled */
|
/* This clock is always on, cannot be enabled/disabled */
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(rtc_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk bustr_clk = {
|
static struct clk bustr_clk = {
|
||||||
|
@ -1119,6 +1151,7 @@ static struct clk bustr_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_BTR_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_BTR_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(bustr_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk evhist_clk = {
|
static struct clk evhist_clk = {
|
||||||
|
@ -1132,6 +1165,7 @@ static struct clk evhist_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_EH_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_EH_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(evhist_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk timer_clk = {
|
static struct clk timer_clk = {
|
||||||
|
@ -1145,6 +1179,7 @@ static struct clk timer_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_ACC_TMR_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_ACC_TMR_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(timer_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
static struct clk app_timer_clk = {
|
static struct clk app_timer_clk = {
|
||||||
|
@ -1158,6 +1193,7 @@ static struct clk app_timer_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_APP_TMR_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_APP_TMR_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(app_timer_clk.lock),
|
||||||
};
|
};
|
||||||
|
|
||||||
#ifdef CONFIG_MACH_U300_BS335
|
#ifdef CONFIG_MACH_U300_BS335
|
||||||
|
@ -1172,6 +1208,7 @@ static struct clk ppm_clk = {
|
||||||
.clk_val = U300_SYSCON_SBCER_PPM_CLK_EN,
|
.clk_val = U300_SYSCON_SBCER_PPM_CLK_EN,
|
||||||
.enable = syscon_clk_enable,
|
.enable = syscon_clk_enable,
|
||||||
.disable = syscon_clk_disable,
|
.disable = syscon_clk_disable,
|
||||||
|
.lock = __SPIN_LOCK_UNLOCKED(ppm_clk.lock),
|
||||||
};
|
};
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1187,53 +1224,53 @@ static struct clk ppm_clk = {
|
||||||
*/
|
*/
|
||||||
static struct clk_lookup lookups[] = {
|
static struct clk_lookup lookups[] = {
|
||||||
/* Connected directly to the AMBA bus */
|
/* Connected directly to the AMBA bus */
|
||||||
DEF_LOOKUP("amba", &amba_clk),
|
DEF_LOOKUP("amba", &amba_clk),
|
||||||
DEF_LOOKUP("cpu", &cpu_clk),
|
DEF_LOOKUP("cpu", &cpu_clk),
|
||||||
DEF_LOOKUP("nandif", &nandif_clk),
|
DEF_LOOKUP("fsmc", &nandif_clk),
|
||||||
DEF_LOOKUP("semi", &semi_clk),
|
DEF_LOOKUP("semi", &semi_clk),
|
||||||
#ifdef CONFIG_MACH_U300_BS335
|
#ifdef CONFIG_MACH_U300_BS335
|
||||||
DEF_LOOKUP("isp", &isp_clk),
|
DEF_LOOKUP("isp", &isp_clk),
|
||||||
DEF_LOOKUP("cds", &cds_clk),
|
DEF_LOOKUP("cds", &cds_clk),
|
||||||
#endif
|
#endif
|
||||||
DEF_LOOKUP("dma", &dma_clk),
|
DEF_LOOKUP("dma", &dma_clk),
|
||||||
DEF_LOOKUP("aaif", &aaif_clk),
|
DEF_LOOKUP("msl", &aaif_clk),
|
||||||
DEF_LOOKUP("apex", &apex_clk),
|
DEF_LOOKUP("apex", &apex_clk),
|
||||||
DEF_LOOKUP("video_enc", &video_enc_clk),
|
DEF_LOOKUP("video_enc", &video_enc_clk),
|
||||||
DEF_LOOKUP("xgam", &xgam_clk),
|
DEF_LOOKUP("xgam", &xgam_clk),
|
||||||
DEF_LOOKUP("ahb", &ahb_clk),
|
DEF_LOOKUP("ahb", &ahb_clk),
|
||||||
/* AHB bridge clocks */
|
/* AHB bridge clocks */
|
||||||
DEF_LOOKUP("ahb", &ahb_subsys_clk),
|
DEF_LOOKUP("ahb_subsys", &ahb_subsys_clk),
|
||||||
DEF_LOOKUP("intcon", &intcon_clk),
|
DEF_LOOKUP("intcon", &intcon_clk),
|
||||||
DEF_LOOKUP("mspro", &mspro_clk),
|
DEF_LOOKUP("mspro", &mspro_clk),
|
||||||
DEF_LOOKUP("pl172", &emif_clk),
|
DEF_LOOKUP("pl172", &emif_clk),
|
||||||
/* FAST bridge clocks */
|
/* FAST bridge clocks */
|
||||||
DEF_LOOKUP("fast", &fast_clk),
|
DEF_LOOKUP("fast", &fast_clk),
|
||||||
DEF_LOOKUP("mmci", &mmcsd_clk),
|
DEF_LOOKUP("mmci", &mmcsd_clk),
|
||||||
/*
|
/*
|
||||||
* The .0 and .1 identifiers on these comes from the platform device
|
* The .0 and .1 identifiers on these comes from the platform device
|
||||||
* .id field and are assigned when the platform devices are registered.
|
* .id field and are assigned when the platform devices are registered.
|
||||||
*/
|
*/
|
||||||
DEF_LOOKUP("i2s.0", &i2s0_clk),
|
DEF_LOOKUP("i2s.0", &i2s0_clk),
|
||||||
DEF_LOOKUP("i2s.1", &i2s1_clk),
|
DEF_LOOKUP("i2s.1", &i2s1_clk),
|
||||||
DEF_LOOKUP("stddci2c.0", &i2c0_clk),
|
DEF_LOOKUP("stu300.0", &i2c0_clk),
|
||||||
DEF_LOOKUP("stddci2c.1", &i2c1_clk),
|
DEF_LOOKUP("stu300.1", &i2c1_clk),
|
||||||
DEF_LOOKUP("pl022", &spi_clk),
|
DEF_LOOKUP("pl022", &spi_clk),
|
||||||
#ifdef CONFIG_MACH_U300_BS335
|
#ifdef CONFIG_MACH_U300_BS335
|
||||||
DEF_LOOKUP("uart1", &uart1_clk),
|
DEF_LOOKUP("uart1", &uart1_clk),
|
||||||
#endif
|
#endif
|
||||||
/* SLOW bridge clocks */
|
/* SLOW bridge clocks */
|
||||||
DEF_LOOKUP("slow", &slow_clk),
|
DEF_LOOKUP("slow", &slow_clk),
|
||||||
DEF_LOOKUP("wdog", &wdog_clk),
|
DEF_LOOKUP("coh901327_wdog", &wdog_clk),
|
||||||
DEF_LOOKUP("uart0", &uart_clk),
|
DEF_LOOKUP("uart0", &uart_clk),
|
||||||
DEF_LOOKUP("apptimer", &app_timer_clk),
|
DEF_LOOKUP("apptimer", &app_timer_clk),
|
||||||
DEF_LOOKUP("keypad", &keypad_clk),
|
DEF_LOOKUP("coh901461-keypad", &keypad_clk),
|
||||||
DEF_LOOKUP("u300-gpio", &gpio_clk),
|
DEF_LOOKUP("u300-gpio", &gpio_clk),
|
||||||
DEF_LOOKUP("rtc0", &rtc_clk),
|
DEF_LOOKUP("rtc-coh901331", &rtc_clk),
|
||||||
DEF_LOOKUP("bustr", &bustr_clk),
|
DEF_LOOKUP("bustr", &bustr_clk),
|
||||||
DEF_LOOKUP("evhist", &evhist_clk),
|
DEF_LOOKUP("evhist", &evhist_clk),
|
||||||
DEF_LOOKUP("timer", &timer_clk),
|
DEF_LOOKUP("timer", &timer_clk),
|
||||||
#ifdef CONFIG_MACH_U300_BS335
|
#ifdef CONFIG_MACH_U300_BS335
|
||||||
DEF_LOOKUP("ppm", &ppm_clk),
|
DEF_LOOKUP("ppm", &ppm_clk),
|
||||||
#endif
|
#endif
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -1427,16 +1464,20 @@ static const struct file_operations u300_clocks_operations = {
|
||||||
.release = single_release,
|
.release = single_release,
|
||||||
};
|
};
|
||||||
|
|
||||||
static void init_clk_read_procfs(void)
|
static int __init init_clk_read_debugfs(void)
|
||||||
{
|
{
|
||||||
/* Expose a simple debugfs interface to view all clocks */
|
/* Expose a simple debugfs interface to view all clocks */
|
||||||
(void) debugfs_create_file("u300_clocks", S_IFREG | S_IRUGO,
|
(void) debugfs_create_file("u300_clocks", S_IFREG | S_IRUGO,
|
||||||
NULL, NULL, &u300_clocks_operations);
|
NULL, NULL,
|
||||||
}
|
&u300_clocks_operations);
|
||||||
#else
|
return 0;
|
||||||
static inline void init_clk_read_procfs(void)
|
|
||||||
{
|
|
||||||
}
|
}
|
||||||
|
/*
|
||||||
|
* This needs to come in after the core_initcall() for the
|
||||||
|
* overall clocks, because debugfs is not available until
|
||||||
|
* the subsystems come up.
|
||||||
|
*/
|
||||||
|
module_init(init_clk_read_debugfs);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
static int __init u300_clock_init(void)
|
static int __init u300_clock_init(void)
|
||||||
|
@ -1462,8 +1503,6 @@ static int __init u300_clock_init(void)
|
||||||
|
|
||||||
clk_register();
|
clk_register();
|
||||||
|
|
||||||
init_clk_read_procfs();
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Some of these may be on when we boot the system so make sure they
|
* Some of these may be on when we boot the system so make sure they
|
||||||
* are turned OFF.
|
* are turned OFF.
|
||||||
|
|
|
@ -27,6 +27,7 @@ EXPORT_SYMBOL(__cpuc_flush_kern_all);
|
||||||
EXPORT_SYMBOL(__cpuc_flush_user_all);
|
EXPORT_SYMBOL(__cpuc_flush_user_all);
|
||||||
EXPORT_SYMBOL(__cpuc_flush_user_range);
|
EXPORT_SYMBOL(__cpuc_flush_user_range);
|
||||||
EXPORT_SYMBOL(__cpuc_coherent_kern_range);
|
EXPORT_SYMBOL(__cpuc_coherent_kern_range);
|
||||||
|
EXPORT_SYMBOL(__cpuc_flush_dcache_page);
|
||||||
EXPORT_SYMBOL(dmac_inv_range); /* because of flush_ioremap_region() */
|
EXPORT_SYMBOL(dmac_inv_range); /* because of flush_ioremap_region() */
|
||||||
#else
|
#else
|
||||||
EXPORT_SYMBOL(cpu_cache);
|
EXPORT_SYMBOL(cpu_cache);
|
||||||
|
|
|
@ -2457,6 +2457,19 @@ static int __init omap_init_dma(void)
|
||||||
setup_irq(irq, &omap24xx_dma_irq);
|
setup_irq(irq, &omap24xx_dma_irq);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Enable smartidle idlemodes and autoidle */
|
||||||
|
if (cpu_is_omap34xx()) {
|
||||||
|
u32 v = dma_read(OCP_SYSCONFIG);
|
||||||
|
v &= ~(DMA_SYSCONFIG_MIDLEMODE_MASK |
|
||||||
|
DMA_SYSCONFIG_SIDLEMODE_MASK |
|
||||||
|
DMA_SYSCONFIG_AUTOIDLE);
|
||||||
|
v |= (DMA_SYSCONFIG_MIDLEMODE(DMA_IDLEMODE_SMARTIDLE) |
|
||||||
|
DMA_SYSCONFIG_SIDLEMODE(DMA_IDLEMODE_SMARTIDLE) |
|
||||||
|
DMA_SYSCONFIG_AUTOIDLE);
|
||||||
|
dma_write(v , OCP_SYSCONFIG);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
/* FIXME: Update LCD DMA to work on 24xx */
|
/* FIXME: Update LCD DMA to work on 24xx */
|
||||||
if (cpu_class_is_omap1()) {
|
if (cpu_class_is_omap1()) {
|
||||||
r = request_irq(INT_DMA_LCD, lcd_dma_irq_handler, 0,
|
r = request_irq(INT_DMA_LCD, lcd_dma_irq_handler, 0,
|
||||||
|
|
|
@ -1585,6 +1585,7 @@ static int __init _omap_gpio_init(void)
|
||||||
__raw_writel(0x00000000, bank->base + OMAP24XX_GPIO_IRQENABLE1);
|
__raw_writel(0x00000000, bank->base + OMAP24XX_GPIO_IRQENABLE1);
|
||||||
__raw_writel(0xffffffff, bank->base + OMAP24XX_GPIO_IRQSTATUS1);
|
__raw_writel(0xffffffff, bank->base + OMAP24XX_GPIO_IRQSTATUS1);
|
||||||
__raw_writew(0x0015, bank->base + OMAP24XX_GPIO_SYSCONFIG);
|
__raw_writew(0x0015, bank->base + OMAP24XX_GPIO_SYSCONFIG);
|
||||||
|
__raw_writel(0x00000000, bank->base + OMAP24XX_GPIO_DEBOUNCE_EN);
|
||||||
|
|
||||||
/* Initialize interface clock ungated, module enabled */
|
/* Initialize interface clock ungated, module enabled */
|
||||||
__raw_writel(0, bank->base + OMAP24XX_GPIO_CTRL);
|
__raw_writel(0, bank->base + OMAP24XX_GPIO_CTRL);
|
||||||
|
|
|
@ -30,6 +30,17 @@
|
||||||
#ifndef __ASM_ARCH_OMAP_CPU_H
|
#ifndef __ASM_ARCH_OMAP_CPU_H
|
||||||
#define __ASM_ARCH_OMAP_CPU_H
|
#define __ASM_ARCH_OMAP_CPU_H
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Omap device type i.e. EMU/HS/TST/GP/BAD
|
||||||
|
*/
|
||||||
|
#define OMAP2_DEVICE_TYPE_TEST 0
|
||||||
|
#define OMAP2_DEVICE_TYPE_EMU 1
|
||||||
|
#define OMAP2_DEVICE_TYPE_SEC 2
|
||||||
|
#define OMAP2_DEVICE_TYPE_GP 3
|
||||||
|
#define OMAP2_DEVICE_TYPE_BAD 4
|
||||||
|
|
||||||
|
int omap_type(void);
|
||||||
|
|
||||||
struct omap_chip_id {
|
struct omap_chip_id {
|
||||||
u8 oc;
|
u8 oc;
|
||||||
u8 type;
|
u8 type;
|
||||||
|
@ -424,17 +435,6 @@ IS_OMAP_TYPE(3430, 0x3430)
|
||||||
|
|
||||||
|
|
||||||
int omap_chip_is(struct omap_chip_id oci);
|
int omap_chip_is(struct omap_chip_id oci);
|
||||||
int omap_type(void);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Macro to detect device type i.e. EMU/HS/TST/GP/BAD
|
|
||||||
*/
|
|
||||||
#define OMAP2_DEVICE_TYPE_TEST 0
|
|
||||||
#define OMAP2_DEVICE_TYPE_EMU 1
|
|
||||||
#define OMAP2_DEVICE_TYPE_SEC 2
|
|
||||||
#define OMAP2_DEVICE_TYPE_GP 3
|
|
||||||
#define OMAP2_DEVICE_TYPE_BAD 4
|
|
||||||
|
|
||||||
void omap2_check_revision(void);
|
void omap2_check_revision(void);
|
||||||
|
|
||||||
#endif /* defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) */
|
#endif /* defined(CONFIG_ARCH_OMAP2) || defined(CONFIG_ARCH_OMAP3) */
|
||||||
|
|
|
@ -389,6 +389,21 @@
|
||||||
#define DMA_THREAD_FIFO_25 (0x02 << 14)
|
#define DMA_THREAD_FIFO_25 (0x02 << 14)
|
||||||
#define DMA_THREAD_FIFO_50 (0x03 << 14)
|
#define DMA_THREAD_FIFO_50 (0x03 << 14)
|
||||||
|
|
||||||
|
/* DMA4_OCP_SYSCONFIG bits */
|
||||||
|
#define DMA_SYSCONFIG_MIDLEMODE_MASK (3 << 12)
|
||||||
|
#define DMA_SYSCONFIG_CLOCKACTIVITY_MASK (3 << 8)
|
||||||
|
#define DMA_SYSCONFIG_EMUFREE (1 << 5)
|
||||||
|
#define DMA_SYSCONFIG_SIDLEMODE_MASK (3 << 3)
|
||||||
|
#define DMA_SYSCONFIG_SOFTRESET (1 << 2)
|
||||||
|
#define DMA_SYSCONFIG_AUTOIDLE (1 << 0)
|
||||||
|
|
||||||
|
#define DMA_SYSCONFIG_MIDLEMODE(n) ((n) << 12)
|
||||||
|
#define DMA_SYSCONFIG_SIDLEMODE(n) ((n) << 3)
|
||||||
|
|
||||||
|
#define DMA_IDLEMODE_SMARTIDLE 0x2
|
||||||
|
#define DMA_IDLEMODE_NO_IDLE 0x1
|
||||||
|
#define DMA_IDLEMODE_FORCE_IDLE 0x0
|
||||||
|
|
||||||
/* Chaining modes*/
|
/* Chaining modes*/
|
||||||
#ifndef CONFIG_ARCH_OMAP1
|
#ifndef CONFIG_ARCH_OMAP1
|
||||||
#define OMAP_DMA_STATIC_CHAIN 0x1
|
#define OMAP_DMA_STATIC_CHAIN 0x1
|
||||||
|
|
|
@ -201,7 +201,7 @@
|
||||||
#define OMAP2_IO_ADDRESS(pa) IOMEM(__OMAP2_IO_ADDRESS(pa))
|
#define OMAP2_IO_ADDRESS(pa) IOMEM(__OMAP2_IO_ADDRESS(pa))
|
||||||
|
|
||||||
#ifdef __ASSEMBLER__
|
#ifdef __ASSEMBLER__
|
||||||
#define IOMEM(x) x
|
#define IOMEM(x) (x)
|
||||||
#else
|
#else
|
||||||
#define IOMEM(x) ((void __force __iomem *)(x))
|
#define IOMEM(x) ((void __force __iomem *)(x))
|
||||||
|
|
||||||
|
|
|
@ -298,7 +298,7 @@ void flush_iotlb_page(struct iommu *obj, u32 da)
|
||||||
if ((start <= da) && (da < start + bytes)) {
|
if ((start <= da) && (da < start + bytes)) {
|
||||||
dev_dbg(obj->dev, "%s: %08x<=%08x(%x)\n",
|
dev_dbg(obj->dev, "%s: %08x<=%08x(%x)\n",
|
||||||
__func__, start, da, bytes);
|
__func__, start, da, bytes);
|
||||||
|
iotlb_load_cr(obj, &cr);
|
||||||
iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY);
|
iommu_write_reg(obj, 1, MMU_FLUSH_ENTRY);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -133,7 +133,12 @@ void __init omap_detect_sram(void)
|
||||||
if (cpu_is_omap34xx()) {
|
if (cpu_is_omap34xx()) {
|
||||||
omap_sram_base = OMAP3_SRAM_PUB_VA;
|
omap_sram_base = OMAP3_SRAM_PUB_VA;
|
||||||
omap_sram_start = OMAP3_SRAM_PUB_PA;
|
omap_sram_start = OMAP3_SRAM_PUB_PA;
|
||||||
omap_sram_size = 0x8000; /* 32K */
|
if ((omap_type() == OMAP2_DEVICE_TYPE_EMU) ||
|
||||||
|
(omap_type() == OMAP2_DEVICE_TYPE_SEC)) {
|
||||||
|
omap_sram_size = 0x7000; /* 28K */
|
||||||
|
} else {
|
||||||
|
omap_sram_size = 0x8000; /* 32K */
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
omap_sram_base = OMAP2_SRAM_PUB_VA;
|
omap_sram_base = OMAP2_SRAM_PUB_VA;
|
||||||
omap_sram_start = OMAP2_SRAM_PUB_PA;
|
omap_sram_start = OMAP2_SRAM_PUB_PA;
|
||||||
|
|
|
@ -34,7 +34,7 @@ obj-$(CONFIG_S3C_DEV_HSMMC) += dev-hsmmc.o
|
||||||
obj-$(CONFIG_S3C_DEV_HSMMC1) += dev-hsmmc1.o
|
obj-$(CONFIG_S3C_DEV_HSMMC1) += dev-hsmmc1.o
|
||||||
obj-y += dev-i2c0.o
|
obj-y += dev-i2c0.o
|
||||||
obj-$(CONFIG_S3C_DEV_I2C1) += dev-i2c1.o
|
obj-$(CONFIG_S3C_DEV_I2C1) += dev-i2c1.o
|
||||||
obj-$(CONFIG_SND_S3C24XX_SOC) += dev-audio.o
|
obj-$(CONFIG_SND_S3C64XX_SOC_I2S) += dev-audio.o
|
||||||
obj-$(CONFIG_S3C_DEV_FB) += dev-fb.o
|
obj-$(CONFIG_S3C_DEV_FB) += dev-fb.o
|
||||||
obj-$(CONFIG_S3C_DEV_USB_HOST) += dev-usb.o
|
obj-$(CONFIG_S3C_DEV_USB_HOST) += dev-usb.o
|
||||||
obj-$(CONFIG_S3C_DEV_USB_HSOTG) += dev-usb-hsotg.o
|
obj-$(CONFIG_S3C_DEV_USB_HSOTG) += dev-usb-hsotg.o
|
||||||
|
|
|
@ -37,6 +37,7 @@ extern struct platform_device s3c_device_i2c1;
|
||||||
extern struct platform_device s3c_device_rtc;
|
extern struct platform_device s3c_device_rtc;
|
||||||
extern struct platform_device s3c_device_adc;
|
extern struct platform_device s3c_device_adc;
|
||||||
extern struct platform_device s3c_device_sdi;
|
extern struct platform_device s3c_device_sdi;
|
||||||
|
extern struct platform_device s3c_device_iis;
|
||||||
extern struct platform_device s3c_device_hwmon;
|
extern struct platform_device s3c_device_hwmon;
|
||||||
extern struct platform_device s3c_device_hsmmc0;
|
extern struct platform_device s3c_device_hsmmc0;
|
||||||
extern struct platform_device s3c_device_hsmmc1;
|
extern struct platform_device s3c_device_hsmmc1;
|
||||||
|
|
|
@ -29,7 +29,7 @@ obj-$(CONFIG_PM_SIMTEC) += pm-simtec.o
|
||||||
obj-$(CONFIG_PM) += pm.o
|
obj-$(CONFIG_PM) += pm.o
|
||||||
obj-$(CONFIG_PM) += irq-pm.o
|
obj-$(CONFIG_PM) += irq-pm.o
|
||||||
obj-$(CONFIG_PM) += sleep.o
|
obj-$(CONFIG_PM) += sleep.o
|
||||||
obj-$(CONFIG_HAVE_PWM) += pwm.o
|
obj-$(CONFIG_S3C24XX_PWM) += pwm.o
|
||||||
obj-$(CONFIG_S3C2410_CLOCK) += s3c2410-clock.o
|
obj-$(CONFIG_S3C2410_CLOCK) += s3c2410-clock.o
|
||||||
obj-$(CONFIG_S3C2410_DMA) += dma.o
|
obj-$(CONFIG_S3C2410_DMA) += dma.o
|
||||||
obj-$(CONFIG_S3C24XX_ADC) += adc.o
|
obj-$(CONFIG_S3C24XX_ADC) += adc.o
|
||||||
|
|
|
@ -12,8 +12,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/gpio.h>
|
||||||
#include <mach/hardware.h>
|
|
||||||
|
|
||||||
#include <mach/spi.h>
|
#include <mach/spi.h>
|
||||||
#include <mach/regs-gpio.h>
|
#include <mach/regs-gpio.h>
|
||||||
|
|
|
@ -12,8 +12,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/gpio.h>
|
||||||
#include <mach/hardware.h>
|
|
||||||
|
|
||||||
#include <mach/spi.h>
|
#include <mach/spi.h>
|
||||||
#include <mach/regs-gpio.h>
|
#include <mach/regs-gpio.h>
|
||||||
|
|
|
@ -40,7 +40,7 @@ struct thread_info {
|
||||||
.exec_domain = &default_exec_domain, \
|
.exec_domain = &default_exec_domain, \
|
||||||
.flags = 0, \
|
.flags = 0, \
|
||||||
.cpu = 0, \
|
.cpu = 0, \
|
||||||
.preempt_count = 1, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
.restart_block = { \
|
.restart_block = { \
|
||||||
.fn = do_no_restart_syscall \
|
.fn = do_no_restart_syscall \
|
||||||
} \
|
} \
|
||||||
|
|
|
@ -32,22 +32,25 @@ void NORET_TYPE die(const char *str, struct pt_regs *regs, long err)
|
||||||
spin_lock_irq(&die_lock);
|
spin_lock_irq(&die_lock);
|
||||||
bust_spinlocks(1);
|
bust_spinlocks(1);
|
||||||
|
|
||||||
printk(KERN_ALERT "Oops: %s, sig: %ld [#%d]\n" KERN_EMERG,
|
printk(KERN_ALERT "Oops: %s, sig: %ld [#%d]\n",
|
||||||
str, err, ++die_counter);
|
str, err, ++die_counter);
|
||||||
|
|
||||||
|
printk(KERN_EMERG);
|
||||||
|
|
||||||
#ifdef CONFIG_PREEMPT
|
#ifdef CONFIG_PREEMPT
|
||||||
printk("PREEMPT ");
|
printk(KERN_CONT "PREEMPT ");
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_FRAME_POINTER
|
#ifdef CONFIG_FRAME_POINTER
|
||||||
printk("FRAME_POINTER ");
|
printk(KERN_CONT "FRAME_POINTER ");
|
||||||
#endif
|
#endif
|
||||||
if (current_cpu_data.features & AVR32_FEATURE_OCD) {
|
if (current_cpu_data.features & AVR32_FEATURE_OCD) {
|
||||||
unsigned long did = ocd_read(DID);
|
unsigned long did = ocd_read(DID);
|
||||||
printk("chip: 0x%03lx:0x%04lx rev %lu\n",
|
printk(KERN_CONT "chip: 0x%03lx:0x%04lx rev %lu\n",
|
||||||
(did >> 1) & 0x7ff,
|
(did >> 1) & 0x7ff,
|
||||||
(did >> 12) & 0x7fff,
|
(did >> 12) & 0x7fff,
|
||||||
(did >> 28) & 0xf);
|
(did >> 28) & 0xf);
|
||||||
} else {
|
} else {
|
||||||
printk("cpu: arch %u r%u / core %u r%u\n",
|
printk(KERN_CONT "cpu: arch %u r%u / core %u r%u\n",
|
||||||
current_cpu_data.arch_type,
|
current_cpu_data.arch_type,
|
||||||
current_cpu_data.arch_revision,
|
current_cpu_data.arch_revision,
|
||||||
current_cpu_data.cpu_type,
|
current_cpu_data.cpu_type,
|
||||||
|
|
|
@ -77,7 +77,7 @@ struct thread_info {
|
||||||
.exec_domain = &default_exec_domain, \
|
.exec_domain = &default_exec_domain, \
|
||||||
.flags = 0, \
|
.flags = 0, \
|
||||||
.cpu = 0, \
|
.cpu = 0, \
|
||||||
.preempt_count = 1, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
.restart_block = { \
|
.restart_block = { \
|
||||||
.fn = do_no_restart_syscall, \
|
.fn = do_no_restart_syscall, \
|
||||||
}, \
|
}, \
|
||||||
|
|
|
@ -31,7 +31,6 @@
|
||||||
#include <linux/sched.h>
|
#include <linux/sched.h>
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
|
|
|
@ -408,13 +408,14 @@ static void __init print_memory_map(char *who)
|
||||||
bfin_memmap.map[i].addr + bfin_memmap.map[i].size);
|
bfin_memmap.map[i].addr + bfin_memmap.map[i].size);
|
||||||
switch (bfin_memmap.map[i].type) {
|
switch (bfin_memmap.map[i].type) {
|
||||||
case BFIN_MEMMAP_RAM:
|
case BFIN_MEMMAP_RAM:
|
||||||
printk("(usable)\n");
|
printk(KERN_CONT "(usable)\n");
|
||||||
break;
|
break;
|
||||||
case BFIN_MEMMAP_RESERVED:
|
case BFIN_MEMMAP_RESERVED:
|
||||||
printk("(reserved)\n");
|
printk(KERN_CONT "(reserved)\n");
|
||||||
break;
|
break;
|
||||||
default: printk("type %lu\n", bfin_memmap.map[i].type);
|
default:
|
||||||
break;
|
printk(KERN_CONT "type %lu\n", bfin_memmap.map[i].type);
|
||||||
|
break;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -614,19 +615,19 @@ static __init void memory_setup(void)
|
||||||
printk(KERN_INFO "Kernel Managed Memory: %ldMB\n", _ramend >> 20);
|
printk(KERN_INFO "Kernel Managed Memory: %ldMB\n", _ramend >> 20);
|
||||||
|
|
||||||
printk(KERN_INFO "Memory map:\n"
|
printk(KERN_INFO "Memory map:\n"
|
||||||
KERN_INFO " fixedcode = 0x%p-0x%p\n"
|
" fixedcode = 0x%p-0x%p\n"
|
||||||
KERN_INFO " text = 0x%p-0x%p\n"
|
" text = 0x%p-0x%p\n"
|
||||||
KERN_INFO " rodata = 0x%p-0x%p\n"
|
" rodata = 0x%p-0x%p\n"
|
||||||
KERN_INFO " bss = 0x%p-0x%p\n"
|
" bss = 0x%p-0x%p\n"
|
||||||
KERN_INFO " data = 0x%p-0x%p\n"
|
" data = 0x%p-0x%p\n"
|
||||||
KERN_INFO " stack = 0x%p-0x%p\n"
|
" stack = 0x%p-0x%p\n"
|
||||||
KERN_INFO " init = 0x%p-0x%p\n"
|
" init = 0x%p-0x%p\n"
|
||||||
KERN_INFO " available = 0x%p-0x%p\n"
|
" available = 0x%p-0x%p\n"
|
||||||
#ifdef CONFIG_MTD_UCLINUX
|
#ifdef CONFIG_MTD_UCLINUX
|
||||||
KERN_INFO " rootfs = 0x%p-0x%p\n"
|
" rootfs = 0x%p-0x%p\n"
|
||||||
#endif
|
#endif
|
||||||
#if DMA_UNCACHED_REGION > 0
|
#if DMA_UNCACHED_REGION > 0
|
||||||
KERN_INFO " DMA Zone = 0x%p-0x%p\n"
|
" DMA Zone = 0x%p-0x%p\n"
|
||||||
#endif
|
#endif
|
||||||
, (void *)FIXED_CODE_START, (void *)FIXED_CODE_END,
|
, (void *)FIXED_CODE_START, (void *)FIXED_CODE_END,
|
||||||
_stext, _etext,
|
_stext, _etext,
|
||||||
|
@ -859,13 +860,13 @@ void __init setup_arch(char **cmdline_p)
|
||||||
#endif
|
#endif
|
||||||
printk(KERN_INFO "Hardware Trace ");
|
printk(KERN_INFO "Hardware Trace ");
|
||||||
if (bfin_read_TBUFCTL() & 0x1)
|
if (bfin_read_TBUFCTL() & 0x1)
|
||||||
printk("Active ");
|
printk(KERN_CONT "Active ");
|
||||||
else
|
else
|
||||||
printk("Off ");
|
printk(KERN_CONT "Off ");
|
||||||
if (bfin_read_TBUFCTL() & 0x2)
|
if (bfin_read_TBUFCTL() & 0x2)
|
||||||
printk("and Enabled\n");
|
printk(KERN_CONT "and Enabled\n");
|
||||||
else
|
else
|
||||||
printk("and Disabled\n");
|
printk(KERN_CONT "and Disabled\n");
|
||||||
|
|
||||||
#if defined(CONFIG_CHR_DEV_FLASH) || defined(CONFIG_BLK_DEV_FLASH)
|
#if defined(CONFIG_CHR_DEV_FLASH) || defined(CONFIG_BLK_DEV_FLASH)
|
||||||
/* we need to initialize the Flashrom device here since we might
|
/* we need to initialize the Flashrom device here since we might
|
||||||
|
|
|
@ -29,7 +29,6 @@
|
||||||
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
* 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/spinlock.h>
|
#include <linux/spinlock.h>
|
||||||
#include <linux/sem.h>
|
#include <linux/sem.h>
|
||||||
#include <linux/msg.h>
|
#include <linux/msg.h>
|
||||||
|
|
|
@ -212,7 +212,7 @@ asmlinkage void double_fault_c(struct pt_regs *fp)
|
||||||
console_verbose();
|
console_verbose();
|
||||||
oops_in_progress = 1;
|
oops_in_progress = 1;
|
||||||
#ifdef CONFIG_DEBUG_VERBOSE
|
#ifdef CONFIG_DEBUG_VERBOSE
|
||||||
printk(KERN_EMERG "\n" KERN_EMERG "Double Fault\n");
|
printk(KERN_EMERG "Double Fault\n");
|
||||||
#ifdef CONFIG_DEBUG_DOUBLEFAULT_PRINT
|
#ifdef CONFIG_DEBUG_DOUBLEFAULT_PRINT
|
||||||
if (((long)fp->seqstat & SEQSTAT_EXCAUSE) == VEC_UNCOV) {
|
if (((long)fp->seqstat & SEQSTAT_EXCAUSE) == VEC_UNCOV) {
|
||||||
unsigned int cpu = smp_processor_id();
|
unsigned int cpu = smp_processor_id();
|
||||||
|
@ -583,15 +583,14 @@ asmlinkage void trap_c(struct pt_regs *fp)
|
||||||
#ifndef CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE
|
#ifndef CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE
|
||||||
if (trapnr == VEC_CPLB_I_M || trapnr == VEC_CPLB_M)
|
if (trapnr == VEC_CPLB_I_M || trapnr == VEC_CPLB_M)
|
||||||
verbose_printk(KERN_NOTICE "No trace since you do not have "
|
verbose_printk(KERN_NOTICE "No trace since you do not have "
|
||||||
"CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE enabled\n"
|
"CONFIG_DEBUG_BFIN_NO_KERN_HWTRACE enabled\n\n");
|
||||||
KERN_NOTICE "\n");
|
|
||||||
else
|
else
|
||||||
#endif
|
#endif
|
||||||
dump_bfin_trace_buffer();
|
dump_bfin_trace_buffer();
|
||||||
|
|
||||||
if (oops_in_progress) {
|
if (oops_in_progress) {
|
||||||
/* Dump the current kernel stack */
|
/* Dump the current kernel stack */
|
||||||
verbose_printk(KERN_NOTICE "\n" KERN_NOTICE "Kernel Stack\n");
|
verbose_printk(KERN_NOTICE "Kernel Stack\n");
|
||||||
show_stack(current, NULL);
|
show_stack(current, NULL);
|
||||||
print_modules();
|
print_modules();
|
||||||
#ifndef CONFIG_ACCESS_CHECK
|
#ifndef CONFIG_ACCESS_CHECK
|
||||||
|
@ -906,7 +905,7 @@ void show_stack(struct task_struct *task, unsigned long *stack)
|
||||||
|
|
||||||
ret_addr = 0;
|
ret_addr = 0;
|
||||||
if (!j && i % 8 == 0)
|
if (!j && i % 8 == 0)
|
||||||
printk("\n" KERN_NOTICE "%p:",addr);
|
printk(KERN_NOTICE "%p:",addr);
|
||||||
|
|
||||||
/* if it is an odd address, or zero, just skip it */
|
/* if it is an odd address, or zero, just skip it */
|
||||||
if (*addr & 0x1 || !*addr)
|
if (*addr & 0x1 || !*addr)
|
||||||
|
@ -996,9 +995,9 @@ void dump_bfin_process(struct pt_regs *fp)
|
||||||
|
|
||||||
printk(KERN_NOTICE "CPU = %d\n", current_thread_info()->cpu);
|
printk(KERN_NOTICE "CPU = %d\n", current_thread_info()->cpu);
|
||||||
if (!((unsigned long)current->mm & 0x3) && (unsigned long)current->mm >= FIXED_CODE_START)
|
if (!((unsigned long)current->mm & 0x3) && (unsigned long)current->mm >= FIXED_CODE_START)
|
||||||
verbose_printk(KERN_NOTICE "TEXT = 0x%p-0x%p DATA = 0x%p-0x%p\n"
|
verbose_printk(KERN_NOTICE
|
||||||
KERN_NOTICE " BSS = 0x%p-0x%p USER-STACK = 0x%p\n"
|
"TEXT = 0x%p-0x%p DATA = 0x%p-0x%p\n"
|
||||||
KERN_NOTICE "\n",
|
" BSS = 0x%p-0x%p USER-STACK = 0x%p\n\n",
|
||||||
(void *)current->mm->start_code,
|
(void *)current->mm->start_code,
|
||||||
(void *)current->mm->end_code,
|
(void *)current->mm->end_code,
|
||||||
(void *)current->mm->start_data,
|
(void *)current->mm->start_data,
|
||||||
|
@ -1009,8 +1008,8 @@ void dump_bfin_process(struct pt_regs *fp)
|
||||||
else
|
else
|
||||||
verbose_printk(KERN_NOTICE "invalid mm\n");
|
verbose_printk(KERN_NOTICE "invalid mm\n");
|
||||||
} else
|
} else
|
||||||
verbose_printk(KERN_NOTICE "\n" KERN_NOTICE
|
verbose_printk(KERN_NOTICE
|
||||||
"No Valid process in current context\n");
|
"No Valid process in current context\n");
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1028,7 +1027,7 @@ void dump_bfin_mem(struct pt_regs *fp)
|
||||||
addr < (unsigned short *)((unsigned long)erraddr & ~0xF) + 0x10;
|
addr < (unsigned short *)((unsigned long)erraddr & ~0xF) + 0x10;
|
||||||
addr++) {
|
addr++) {
|
||||||
if (!((unsigned long)addr & 0xF))
|
if (!((unsigned long)addr & 0xF))
|
||||||
verbose_printk("\n" KERN_NOTICE "0x%p: ", addr);
|
verbose_printk(KERN_NOTICE "0x%p: ", addr);
|
||||||
|
|
||||||
if (!get_instruction(&val, addr)) {
|
if (!get_instruction(&val, addr)) {
|
||||||
val = 0;
|
val = 0;
|
||||||
|
@ -1056,9 +1055,9 @@ void dump_bfin_mem(struct pt_regs *fp)
|
||||||
oops_in_progress)){
|
oops_in_progress)){
|
||||||
verbose_printk(KERN_NOTICE "Looks like this was a deferred error - sorry\n");
|
verbose_printk(KERN_NOTICE "Looks like this was a deferred error - sorry\n");
|
||||||
#ifndef CONFIG_DEBUG_HWERR
|
#ifndef CONFIG_DEBUG_HWERR
|
||||||
verbose_printk(KERN_NOTICE "The remaining message may be meaningless\n"
|
verbose_printk(KERN_NOTICE
|
||||||
KERN_NOTICE "You should enable CONFIG_DEBUG_HWERR to get a"
|
"The remaining message may be meaningless\n"
|
||||||
" better idea where it came from\n");
|
"You should enable CONFIG_DEBUG_HWERR to get a better idea where it came from\n");
|
||||||
#else
|
#else
|
||||||
/* If we are handling only one peripheral interrupt
|
/* If we are handling only one peripheral interrupt
|
||||||
* and current mm and pid are valid, and the last error
|
* and current mm and pid are valid, and the last error
|
||||||
|
@ -1114,9 +1113,10 @@ void show_regs(struct pt_regs *fp)
|
||||||
|
|
||||||
verbose_printk(KERN_NOTICE "%s", linux_banner);
|
verbose_printk(KERN_NOTICE "%s", linux_banner);
|
||||||
|
|
||||||
verbose_printk(KERN_NOTICE "\n" KERN_NOTICE "SEQUENCER STATUS:\t\t%s\n", print_tainted());
|
verbose_printk(KERN_NOTICE "\nSEQUENCER STATUS:\t\t%s\n",
|
||||||
|
print_tainted());
|
||||||
verbose_printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n",
|
verbose_printk(KERN_NOTICE " SEQSTAT: %08lx IPEND: %04lx SYSCFG: %04lx\n",
|
||||||
(long)fp->seqstat, fp->ipend, fp->syscfg);
|
(long)fp->seqstat, fp->ipend, fp->syscfg);
|
||||||
if ((fp->seqstat & SEQSTAT_EXCAUSE) == VEC_HWERR) {
|
if ((fp->seqstat & SEQSTAT_EXCAUSE) == VEC_HWERR) {
|
||||||
verbose_printk(KERN_NOTICE " HWERRCAUSE: 0x%lx\n",
|
verbose_printk(KERN_NOTICE " HWERRCAUSE: 0x%lx\n",
|
||||||
(fp->seqstat & SEQSTAT_HWERRCAUSE) >> 14);
|
(fp->seqstat & SEQSTAT_HWERRCAUSE) >> 14);
|
||||||
|
@ -1184,7 +1184,7 @@ unlock:
|
||||||
verbose_printk(KERN_NOTICE "ICPLB_FAULT_ADDR: %s\n", buf);
|
verbose_printk(KERN_NOTICE "ICPLB_FAULT_ADDR: %s\n", buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
verbose_printk(KERN_NOTICE "\n" KERN_NOTICE "PROCESSOR STATE:\n");
|
verbose_printk(KERN_NOTICE "PROCESSOR STATE:\n");
|
||||||
verbose_printk(KERN_NOTICE " R0 : %08lx R1 : %08lx R2 : %08lx R3 : %08lx\n",
|
verbose_printk(KERN_NOTICE " R0 : %08lx R1 : %08lx R2 : %08lx R3 : %08lx\n",
|
||||||
fp->r0, fp->r1, fp->r2, fp->r3);
|
fp->r0, fp->r1, fp->r2, fp->r3);
|
||||||
verbose_printk(KERN_NOTICE " R4 : %08lx R5 : %08lx R6 : %08lx R7 : %08lx\n",
|
verbose_printk(KERN_NOTICE " R4 : %08lx R5 : %08lx R6 : %08lx R7 : %08lx\n",
|
||||||
|
|
|
@ -50,8 +50,6 @@ struct thread_info {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* macros/functions for gaining access to the thread information structure
|
* macros/functions for gaining access to the thread information structure
|
||||||
*
|
|
||||||
* preempt_count needs to be 1 initially, until the scheduler is functional.
|
|
||||||
*/
|
*/
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
#define INIT_THREAD_INFO(tsk) \
|
#define INIT_THREAD_INFO(tsk) \
|
||||||
|
@ -60,7 +58,7 @@ struct thread_info {
|
||||||
.exec_domain = &default_exec_domain, \
|
.exec_domain = &default_exec_domain, \
|
||||||
.flags = 0, \
|
.flags = 0, \
|
||||||
.cpu = 0, \
|
.cpu = 0, \
|
||||||
.preempt_count = 1, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
.restart_block = { \
|
.restart_block = { \
|
||||||
.fn = do_no_restart_syscall, \
|
.fn = do_no_restart_syscall, \
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/fs.h>
|
#include <linux/fs.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/sem.h>
|
#include <linux/sem.h>
|
||||||
#include <linux/msg.h>
|
#include <linux/msg.h>
|
||||||
#include <linux/shm.h>
|
#include <linux/shm.h>
|
||||||
|
|
|
@ -7,6 +7,7 @@ config FRV
|
||||||
default y
|
default y
|
||||||
select HAVE_IDE
|
select HAVE_IDE
|
||||||
select HAVE_ARCH_TRACEHOOK
|
select HAVE_ARCH_TRACEHOOK
|
||||||
|
select HAVE_PERF_COUNTERS
|
||||||
|
|
||||||
config ZONE_DMA
|
config ZONE_DMA
|
||||||
bool
|
bool
|
||||||
|
|
|
@ -121,10 +121,72 @@ static inline void atomic_dec(atomic_t *v)
|
||||||
#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
|
#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
|
||||||
#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0)
|
#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 64-bit atomic ops
|
||||||
|
*/
|
||||||
|
typedef struct {
|
||||||
|
volatile long long counter;
|
||||||
|
} atomic64_t;
|
||||||
|
|
||||||
|
#define ATOMIC64_INIT(i) { (i) }
|
||||||
|
|
||||||
|
static inline long long atomic64_read(atomic64_t *v)
|
||||||
|
{
|
||||||
|
long long counter;
|
||||||
|
|
||||||
|
asm("ldd%I1 %M1,%0"
|
||||||
|
: "=e"(counter)
|
||||||
|
: "m"(v->counter));
|
||||||
|
return counter;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void atomic64_set(atomic64_t *v, long long i)
|
||||||
|
{
|
||||||
|
asm volatile("std%I0 %1,%M0"
|
||||||
|
: "=m"(v->counter)
|
||||||
|
: "e"(i));
|
||||||
|
}
|
||||||
|
|
||||||
|
extern long long atomic64_inc_return(atomic64_t *v);
|
||||||
|
extern long long atomic64_dec_return(atomic64_t *v);
|
||||||
|
extern long long atomic64_add_return(long long i, atomic64_t *v);
|
||||||
|
extern long long atomic64_sub_return(long long i, atomic64_t *v);
|
||||||
|
|
||||||
|
static inline long long atomic64_add_negative(long long i, atomic64_t *v)
|
||||||
|
{
|
||||||
|
return atomic64_add_return(i, v) < 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void atomic64_add(long long i, atomic64_t *v)
|
||||||
|
{
|
||||||
|
atomic64_add_return(i, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void atomic64_sub(long long i, atomic64_t *v)
|
||||||
|
{
|
||||||
|
atomic64_sub_return(i, v);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void atomic64_inc(atomic64_t *v)
|
||||||
|
{
|
||||||
|
atomic64_inc_return(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline void atomic64_dec(atomic64_t *v)
|
||||||
|
{
|
||||||
|
atomic64_dec_return(v);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define atomic64_sub_and_test(i,v) (atomic64_sub_return((i), (v)) == 0)
|
||||||
|
#define atomic64_dec_and_test(v) (atomic64_dec_return((v)) == 0)
|
||||||
|
#define atomic64_inc_and_test(v) (atomic64_inc_return((v)) == 0)
|
||||||
|
|
||||||
/*****************************************************************************/
|
/*****************************************************************************/
|
||||||
/*
|
/*
|
||||||
* exchange value with memory
|
* exchange value with memory
|
||||||
*/
|
*/
|
||||||
|
extern uint64_t __xchg_64(uint64_t i, volatile void *v);
|
||||||
|
|
||||||
#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS
|
#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS
|
||||||
|
|
||||||
#define xchg(ptr, x) \
|
#define xchg(ptr, x) \
|
||||||
|
@ -174,8 +236,10 @@ extern uint32_t __xchg_32(uint32_t i, volatile void *v);
|
||||||
|
|
||||||
#define tas(ptr) (xchg((ptr), 1))
|
#define tas(ptr) (xchg((ptr), 1))
|
||||||
|
|
||||||
#define atomic_cmpxchg(v, old, new) (cmpxchg(&((v)->counter), old, new))
|
#define atomic_cmpxchg(v, old, new) (cmpxchg(&(v)->counter, old, new))
|
||||||
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
|
#define atomic_xchg(v, new) (xchg(&(v)->counter, new))
|
||||||
|
#define atomic64_cmpxchg(v, old, new) (__cmpxchg_64(old, new, &(v)->counter))
|
||||||
|
#define atomic64_xchg(v, new) (__xchg_64(new, &(v)->counter))
|
||||||
|
|
||||||
static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
|
static __inline__ int atomic_add_unless(atomic_t *v, int a, int u)
|
||||||
{
|
{
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
/* FRV performance counter support
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Red Hat, Inc. All Rights Reserved.
|
||||||
|
* Written by David Howells (dhowells@redhat.com)
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public Licence
|
||||||
|
* as published by the Free Software Foundation; either version
|
||||||
|
* 2 of the Licence, or (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef _ASM_PERF_COUNTER_H
|
||||||
|
#define _ASM_PERF_COUNTER_H
|
||||||
|
|
||||||
|
#define PERF_COUNTER_INDEX_OFFSET 0
|
||||||
|
|
||||||
|
#endif /* _ASM_PERF_COUNTER_H */
|
|
@ -208,6 +208,8 @@ extern void free_initmem(void);
|
||||||
* - if (*ptr == test) then orig = *ptr; *ptr = test;
|
* - if (*ptr == test) then orig = *ptr; *ptr = test;
|
||||||
* - if (*ptr != test) then orig = *ptr;
|
* - if (*ptr != test) then orig = *ptr;
|
||||||
*/
|
*/
|
||||||
|
extern uint64_t __cmpxchg_64(uint64_t test, uint64_t new, volatile uint64_t *v);
|
||||||
|
|
||||||
#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS
|
#ifndef CONFIG_FRV_OUTOFLINE_ATOMIC_OPS
|
||||||
|
|
||||||
#define cmpxchg(ptr, test, new) \
|
#define cmpxchg(ptr, test, new) \
|
||||||
|
|
|
@ -56,8 +56,6 @@ struct thread_info {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* macros/functions for gaining access to the thread information structure
|
* macros/functions for gaining access to the thread information structure
|
||||||
*
|
|
||||||
* preempt_count needs to be 1 initially, until the scheduler is functional.
|
|
||||||
*/
|
*/
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
@ -67,7 +65,7 @@ struct thread_info {
|
||||||
.exec_domain = &default_exec_domain, \
|
.exec_domain = &default_exec_domain, \
|
||||||
.flags = 0, \
|
.flags = 0, \
|
||||||
.cpu = 0, \
|
.cpu = 0, \
|
||||||
.preempt_count = 1, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
.restart_block = { \
|
.restart_block = { \
|
||||||
.fn = do_no_restart_syscall, \
|
.fn = do_no_restart_syscall, \
|
||||||
|
|
|
@ -341,10 +341,12 @@
|
||||||
#define __NR_inotify_init1 332
|
#define __NR_inotify_init1 332
|
||||||
#define __NR_preadv 333
|
#define __NR_preadv 333
|
||||||
#define __NR_pwritev 334
|
#define __NR_pwritev 334
|
||||||
|
#define __NR_rt_tgsigqueueinfo 335
|
||||||
|
#define __NR_perf_counter_open 336
|
||||||
|
|
||||||
#ifdef __KERNEL__
|
#ifdef __KERNEL__
|
||||||
|
|
||||||
#define NR_syscalls 335
|
#define NR_syscalls 337
|
||||||
|
|
||||||
#define __ARCH_WANT_IPC_PARSE_VERSION
|
#define __ARCH_WANT_IPC_PARSE_VERSION
|
||||||
/* #define __ARCH_WANT_OLD_READDIR */
|
/* #define __ARCH_WANT_OLD_READDIR */
|
||||||
|
|
|
@ -1524,5 +1524,7 @@ sys_call_table:
|
||||||
.long sys_inotify_init1
|
.long sys_inotify_init1
|
||||||
.long sys_preadv
|
.long sys_preadv
|
||||||
.long sys_pwritev
|
.long sys_pwritev
|
||||||
|
.long sys_rt_tgsigqueueinfo /* 335 */
|
||||||
|
.long sys_perf_counter_open
|
||||||
|
|
||||||
syscall_table_size = (. - sys_call_table)
|
syscall_table_size = (. - sys_call_table)
|
||||||
|
|
|
@ -67,6 +67,10 @@ EXPORT_SYMBOL(atomic_sub_return);
|
||||||
EXPORT_SYMBOL(__xchg_32);
|
EXPORT_SYMBOL(__xchg_32);
|
||||||
EXPORT_SYMBOL(__cmpxchg_32);
|
EXPORT_SYMBOL(__cmpxchg_32);
|
||||||
#endif
|
#endif
|
||||||
|
EXPORT_SYMBOL(atomic64_add_return);
|
||||||
|
EXPORT_SYMBOL(atomic64_sub_return);
|
||||||
|
EXPORT_SYMBOL(__xchg_64);
|
||||||
|
EXPORT_SYMBOL(__cmpxchg_64);
|
||||||
|
|
||||||
EXPORT_SYMBOL(__debug_bug_printk);
|
EXPORT_SYMBOL(__debug_bug_printk);
|
||||||
EXPORT_SYMBOL(__delay_loops_MHz);
|
EXPORT_SYMBOL(__delay_loops_MHz);
|
||||||
|
|
|
@ -4,5 +4,5 @@
|
||||||
|
|
||||||
lib-y := \
|
lib-y := \
|
||||||
__ashldi3.o __lshrdi3.o __muldi3.o __ashrdi3.o __negdi2.o __ucmpdi2.o \
|
__ashldi3.o __lshrdi3.o __muldi3.o __ashrdi3.o __negdi2.o __ucmpdi2.o \
|
||||||
checksum.o memcpy.o memset.o atomic-ops.o \
|
checksum.o memcpy.o memset.o atomic-ops.o atomic64-ops.o \
|
||||||
outsl_ns.o outsl_sw.o insl_ns.o insl_sw.o cache.o
|
outsl_ns.o outsl_sw.o insl_ns.o insl_sw.o cache.o perf_counter.o
|
||||||
|
|
|
@ -163,11 +163,10 @@ __cmpxchg_32:
|
||||||
ld.p @(gr11,gr0),gr8
|
ld.p @(gr11,gr0),gr8
|
||||||
orcr cc7,cc7,cc3
|
orcr cc7,cc7,cc3
|
||||||
subcc gr8,gr9,gr7,icc0
|
subcc gr8,gr9,gr7,icc0
|
||||||
bne icc0,#0,1f
|
bnelr icc0,#0
|
||||||
cst.p gr10,@(gr11,gr0) ,cc3,#1
|
cst.p gr10,@(gr11,gr0) ,cc3,#1
|
||||||
corcc gr29,gr29,gr0 ,cc3,#1
|
corcc gr29,gr29,gr0 ,cc3,#1
|
||||||
beq icc3,#0,0b
|
beq icc3,#0,0b
|
||||||
1:
|
|
||||||
bralr
|
bralr
|
||||||
|
|
||||||
.size __cmpxchg_32, .-__cmpxchg_32
|
.size __cmpxchg_32, .-__cmpxchg_32
|
||||||
|
|
|
@ -0,0 +1,162 @@
|
||||||
|
/* kernel atomic64 operations
|
||||||
|
*
|
||||||
|
* For an explanation of how atomic ops work in this arch, see:
|
||||||
|
* Documentation/frv/atomic-ops.txt
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Red Hat, Inc. All Rights Reserved.
|
||||||
|
* Written by David Howells (dhowells@redhat.com)
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <asm/spr-regs.h>
|
||||||
|
|
||||||
|
.text
|
||||||
|
.balign 4
|
||||||
|
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# long long atomic64_inc_return(atomic64_t *v)
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
.globl atomic64_inc_return
|
||||||
|
.type atomic64_inc_return,@function
|
||||||
|
atomic64_inc_return:
|
||||||
|
or.p gr8,gr8,gr10
|
||||||
|
0:
|
||||||
|
orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */
|
||||||
|
ckeq icc3,cc7
|
||||||
|
ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */
|
||||||
|
orcr cc7,cc7,cc3 /* set CC3 to true */
|
||||||
|
addicc gr9,#1,gr9,icc0
|
||||||
|
addxi gr8,#0,gr8,icc0
|
||||||
|
cstd.p gr8,@(gr10,gr0) ,cc3,#1
|
||||||
|
corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */
|
||||||
|
beq icc3,#0,0b
|
||||||
|
bralr
|
||||||
|
|
||||||
|
.size atomic64_inc_return, .-atomic64_inc_return
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# long long atomic64_dec_return(atomic64_t *v)
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
.globl atomic64_dec_return
|
||||||
|
.type atomic64_dec_return,@function
|
||||||
|
atomic64_dec_return:
|
||||||
|
or.p gr8,gr8,gr10
|
||||||
|
0:
|
||||||
|
orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */
|
||||||
|
ckeq icc3,cc7
|
||||||
|
ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */
|
||||||
|
orcr cc7,cc7,cc3 /* set CC3 to true */
|
||||||
|
subicc gr9,#1,gr9,icc0
|
||||||
|
subxi gr8,#0,gr8,icc0
|
||||||
|
cstd.p gr8,@(gr10,gr0) ,cc3,#1
|
||||||
|
corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */
|
||||||
|
beq icc3,#0,0b
|
||||||
|
bralr
|
||||||
|
|
||||||
|
.size atomic64_dec_return, .-atomic64_dec_return
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# long long atomic64_add_return(long long i, atomic64_t *v)
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
.globl atomic64_add_return
|
||||||
|
.type atomic64_add_return,@function
|
||||||
|
atomic64_add_return:
|
||||||
|
or.p gr8,gr8,gr4
|
||||||
|
or gr9,gr9,gr5
|
||||||
|
0:
|
||||||
|
orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */
|
||||||
|
ckeq icc3,cc7
|
||||||
|
ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */
|
||||||
|
orcr cc7,cc7,cc3 /* set CC3 to true */
|
||||||
|
addcc gr9,gr5,gr9,icc0
|
||||||
|
addx gr8,gr4,gr8,icc0
|
||||||
|
cstd.p gr8,@(gr10,gr0) ,cc3,#1
|
||||||
|
corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */
|
||||||
|
beq icc3,#0,0b
|
||||||
|
bralr
|
||||||
|
|
||||||
|
.size atomic64_add_return, .-atomic64_add_return
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# long long atomic64_sub_return(long long i, atomic64_t *v)
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
.globl atomic64_sub_return
|
||||||
|
.type atomic64_sub_return,@function
|
||||||
|
atomic64_sub_return:
|
||||||
|
or.p gr8,gr8,gr4
|
||||||
|
or gr9,gr9,gr5
|
||||||
|
0:
|
||||||
|
orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */
|
||||||
|
ckeq icc3,cc7
|
||||||
|
ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */
|
||||||
|
orcr cc7,cc7,cc3 /* set CC3 to true */
|
||||||
|
subcc gr9,gr5,gr9,icc0
|
||||||
|
subx gr8,gr4,gr8,icc0
|
||||||
|
cstd.p gr8,@(gr10,gr0) ,cc3,#1
|
||||||
|
corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */
|
||||||
|
beq icc3,#0,0b
|
||||||
|
bralr
|
||||||
|
|
||||||
|
.size atomic64_sub_return, .-atomic64_sub_return
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# uint64_t __xchg_64(uint64_t i, uint64_t *v)
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
.globl __xchg_64
|
||||||
|
.type __xchg_64,@function
|
||||||
|
__xchg_64:
|
||||||
|
or.p gr8,gr8,gr4
|
||||||
|
or gr9,gr9,gr5
|
||||||
|
0:
|
||||||
|
orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */
|
||||||
|
ckeq icc3,cc7
|
||||||
|
ldd.p @(gr10,gr0),gr8 /* LDD.P/ORCR must be atomic */
|
||||||
|
orcr cc7,cc7,cc3 /* set CC3 to true */
|
||||||
|
cstd.p gr4,@(gr10,gr0) ,cc3,#1
|
||||||
|
corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */
|
||||||
|
beq icc3,#0,0b
|
||||||
|
bralr
|
||||||
|
|
||||||
|
.size __xchg_64, .-__xchg_64
|
||||||
|
|
||||||
|
###############################################################################
|
||||||
|
#
|
||||||
|
# uint64_t __cmpxchg_64(uint64_t test, uint64_t new, uint64_t *v)
|
||||||
|
#
|
||||||
|
###############################################################################
|
||||||
|
.globl __cmpxchg_64
|
||||||
|
.type __cmpxchg_64,@function
|
||||||
|
__cmpxchg_64:
|
||||||
|
or.p gr8,gr8,gr4
|
||||||
|
or gr9,gr9,gr5
|
||||||
|
0:
|
||||||
|
orcc gr0,gr0,gr0,icc3 /* set ICC3.Z */
|
||||||
|
ckeq icc3,cc7
|
||||||
|
ldd.p @(gr12,gr0),gr8 /* LDD.P/ORCR must be atomic */
|
||||||
|
orcr cc7,cc7,cc3
|
||||||
|
subcc gr8,gr4,gr0,icc0
|
||||||
|
subcc.p gr9,gr5,gr0,icc1
|
||||||
|
bnelr icc0,#0
|
||||||
|
bnelr icc1,#0
|
||||||
|
cstd.p gr10,@(gr12,gr0) ,cc3,#1
|
||||||
|
corcc gr29,gr29,gr0 ,cc3,#1 /* clear ICC3.Z if store happens */
|
||||||
|
beq icc3,#0,0b
|
||||||
|
bralr
|
||||||
|
|
||||||
|
.size __cmpxchg_64, .-__cmpxchg_64
|
||||||
|
|
|
@ -0,0 +1,19 @@
|
||||||
|
/* Performance counter handling
|
||||||
|
*
|
||||||
|
* Copyright (C) 2009 Red Hat, Inc. All Rights Reserved.
|
||||||
|
* Written by David Howells (dhowells@redhat.com)
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or
|
||||||
|
* modify it under the terms of the GNU General Public Licence
|
||||||
|
* as published by the Free Software Foundation; either version
|
||||||
|
* 2 of the Licence, or (at your option) any later version.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/perf_counter.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* mark the performance counter as pending
|
||||||
|
*/
|
||||||
|
void set_perf_counter_pending(void)
|
||||||
|
{
|
||||||
|
}
|
|
@ -36,7 +36,7 @@ struct thread_info {
|
||||||
.exec_domain = &default_exec_domain, \
|
.exec_domain = &default_exec_domain, \
|
||||||
.flags = 0, \
|
.flags = 0, \
|
||||||
.cpu = 0, \
|
.cpu = 0, \
|
||||||
.preempt_count = 1, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
.restart_block = { \
|
.restart_block = { \
|
||||||
.fn = do_no_restart_syscall, \
|
.fn = do_no_restart_syscall, \
|
||||||
}, \
|
}, \
|
||||||
|
|
|
@ -48,7 +48,7 @@ struct thread_info {
|
||||||
.flags = 0, \
|
.flags = 0, \
|
||||||
.cpu = 0, \
|
.cpu = 0, \
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
.preempt_count = 0, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
.restart_block = { \
|
.restart_block = { \
|
||||||
.fn = do_no_restart_syscall, \
|
.fn = do_no_restart_syscall, \
|
||||||
}, \
|
}, \
|
||||||
|
|
|
@ -65,7 +65,7 @@ static int __init esi_init (void)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!esi)
|
if (!esi)
|
||||||
return -ENODEV;;
|
return -ENODEV;
|
||||||
|
|
||||||
systab = __va(esi);
|
systab = __va(esi);
|
||||||
|
|
||||||
|
|
|
@ -5603,7 +5603,7 @@ pfm_interrupt_handler(int irq, void *arg)
|
||||||
* /proc/perfmon interface, for debug only
|
* /proc/perfmon interface, for debug only
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#define PFM_PROC_SHOW_HEADER ((void *)nr_cpu_ids+1)
|
#define PFM_PROC_SHOW_HEADER ((void *)(long)nr_cpu_ids+1)
|
||||||
|
|
||||||
static void *
|
static void *
|
||||||
pfm_proc_start(struct seq_file *m, loff_t *pos)
|
pfm_proc_start(struct seq_file *m, loff_t *pos)
|
||||||
|
|
|
@ -15,7 +15,6 @@
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
#include <linux/security.h>
|
#include <linux/security.h>
|
||||||
#include <linux/audit.h>
|
#include <linux/audit.h>
|
||||||
|
|
|
@ -192,7 +192,7 @@ struct salinfo_platform_oemdata_parms {
|
||||||
static void
|
static void
|
||||||
salinfo_work_to_do(struct salinfo_data *data)
|
salinfo_work_to_do(struct salinfo_data *data)
|
||||||
{
|
{
|
||||||
down_trylock(&data->mutex);
|
(void)(down_trylock(&data->mutex) ?: 0);
|
||||||
up(&data->mutex);
|
up(&data->mutex);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -130,7 +130,7 @@ static void collect_interruption(struct kvm_vcpu *vcpu)
|
||||||
if (vdcr & IA64_DCR_PP) {
|
if (vdcr & IA64_DCR_PP) {
|
||||||
vpsr |= IA64_PSR_PP;
|
vpsr |= IA64_PSR_PP;
|
||||||
} else {
|
} else {
|
||||||
vpsr &= ~IA64_PSR_PP;;
|
vpsr &= ~IA64_PSR_PP;
|
||||||
}
|
}
|
||||||
|
|
||||||
vcpu_set_psr(vcpu, vpsr);
|
vcpu_set_psr(vcpu, vpsr);
|
||||||
|
@ -594,11 +594,11 @@ static void set_pal_call_data(struct kvm_vcpu *vcpu)
|
||||||
p->u.pal_data.gr30 = vcpu_get_gr(vcpu, 30);
|
p->u.pal_data.gr30 = vcpu_get_gr(vcpu, 30);
|
||||||
break;
|
break;
|
||||||
case PAL_BRAND_INFO:
|
case PAL_BRAND_INFO:
|
||||||
p->u.pal_data.gr29 = gr29;;
|
p->u.pal_data.gr29 = gr29;
|
||||||
p->u.pal_data.gr30 = kvm_trans_pal_call_args(vcpu, gr30);
|
p->u.pal_data.gr30 = kvm_trans_pal_call_args(vcpu, gr30);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
p->u.pal_data.gr29 = gr29;;
|
p->u.pal_data.gr29 = gr29;
|
||||||
p->u.pal_data.gr30 = vcpu_get_gr(vcpu, 30);
|
p->u.pal_data.gr30 = vcpu_get_gr(vcpu, 30);
|
||||||
}
|
}
|
||||||
p->u.pal_data.gr28 = gr28;
|
p->u.pal_data.gr28 = gr28;
|
||||||
|
|
|
@ -406,7 +406,7 @@ void getreg(unsigned long regnum, unsigned long *val,
|
||||||
* Now look at registers in [0-31] range and init correct UNAT
|
* Now look at registers in [0-31] range and init correct UNAT
|
||||||
*/
|
*/
|
||||||
addr = (unsigned long)regs;
|
addr = (unsigned long)regs;
|
||||||
unat = ®s->eml_unat;;
|
unat = ®s->eml_unat;
|
||||||
|
|
||||||
addr += gr_info[regnum];
|
addr += gr_info[regnum];
|
||||||
|
|
||||||
|
|
|
@ -135,7 +135,7 @@ struct thash_data *__vtr_lookup(struct kvm_vcpu *vcpu, u64 va, int type)
|
||||||
u64 rid;
|
u64 rid;
|
||||||
|
|
||||||
rid = vcpu_get_rr(vcpu, va);
|
rid = vcpu_get_rr(vcpu, va);
|
||||||
rid = rid & RR_RID_MASK;;
|
rid = rid & RR_RID_MASK;
|
||||||
if (type == D_TLB) {
|
if (type == D_TLB) {
|
||||||
if (vcpu_quick_region_check(vcpu->arch.dtr_regions, va)) {
|
if (vcpu_quick_region_check(vcpu->arch.dtr_regions, va)) {
|
||||||
for (trp = (struct thash_data *)&vcpu->arch.dtrs, i = 0;
|
for (trp = (struct thash_data *)&vcpu->arch.dtrs, i = 0;
|
||||||
|
@ -518,7 +518,7 @@ struct thash_data *vtlb_lookup(struct kvm_vcpu *v, u64 va, int is_data)
|
||||||
|
|
||||||
struct thash_cb *hcb = &v->arch.vtlb;
|
struct thash_cb *hcb = &v->arch.vtlb;
|
||||||
|
|
||||||
cch = __vtr_lookup(v, va, is_data);;
|
cch = __vtr_lookup(v, va, is_data);
|
||||||
if (cch)
|
if (cch)
|
||||||
return cch;
|
return cch;
|
||||||
|
|
||||||
|
|
|
@ -537,7 +537,7 @@ pcibios_align_resource (void *data, struct resource *res,
|
||||||
/*
|
/*
|
||||||
* PCI BIOS setup, always defaults to SAL interface
|
* PCI BIOS setup, always defaults to SAL interface
|
||||||
*/
|
*/
|
||||||
char * __devinit
|
char * __init
|
||||||
pcibios_setup (char *str)
|
pcibios_setup (char *str)
|
||||||
{
|
{
|
||||||
return str;
|
return str;
|
||||||
|
|
|
@ -435,7 +435,8 @@ void sn_generate_path(struct pci_bus *pci_bus, char *address)
|
||||||
bricktype = MODULE_GET_BTYPE(moduleid);
|
bricktype = MODULE_GET_BTYPE(moduleid);
|
||||||
if ((bricktype == L1_BRICKTYPE_191010) ||
|
if ((bricktype == L1_BRICKTYPE_191010) ||
|
||||||
(bricktype == L1_BRICKTYPE_1932))
|
(bricktype == L1_BRICKTYPE_1932))
|
||||||
sprintf(address, "%s^%d", address, geo_slot(geoid));
|
sprintf(address + strlen(address), "^%d",
|
||||||
|
geo_slot(geoid));
|
||||||
}
|
}
|
||||||
|
|
||||||
void __devinit
|
void __devinit
|
||||||
|
|
|
@ -57,8 +57,6 @@ struct thread_info {
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* macros/functions for gaining access to the thread information structure
|
* macros/functions for gaining access to the thread information structure
|
||||||
*
|
|
||||||
* preempt_count needs to be 1 initially, until the scheduler is functional.
|
|
||||||
*/
|
*/
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
@ -68,7 +66,7 @@ struct thread_info {
|
||||||
.exec_domain = &default_exec_domain, \
|
.exec_domain = &default_exec_domain, \
|
||||||
.flags = 0, \
|
.flags = 0, \
|
||||||
.cpu = 0, \
|
.cpu = 0, \
|
||||||
.preempt_count = 1, \
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
.addr_limit = KERNEL_DS, \
|
.addr_limit = KERNEL_DS, \
|
||||||
.restart_block = { \
|
.restart_block = { \
|
||||||
.fn = do_no_restart_syscall, \
|
.fn = do_no_restart_syscall, \
|
||||||
|
|
|
@ -19,7 +19,6 @@
|
||||||
#include <linux/mm.h>
|
#include <linux/mm.h>
|
||||||
#include <linux/err.h>
|
#include <linux/err.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/smp_lock.h>
|
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/ptrace.h>
|
#include <linux/ptrace.h>
|
||||||
#include <linux/user.h>
|
#include <linux/user.h>
|
||||||
|
|
|
@ -19,6 +19,7 @@ struct thread_info {
|
||||||
{ \
|
{ \
|
||||||
.task = &tsk, \
|
.task = &tsk, \
|
||||||
.exec_domain = &default_exec_domain, \
|
.exec_domain = &default_exec_domain, \
|
||||||
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
.restart_block = { \
|
.restart_block = { \
|
||||||
.fn = do_no_restart_syscall, \
|
.fn = do_no_restart_syscall, \
|
||||||
}, \
|
}, \
|
||||||
|
|
|
@ -49,6 +49,7 @@ struct thread_info {
|
||||||
.exec_domain = &default_exec_domain, \
|
.exec_domain = &default_exec_domain, \
|
||||||
.flags = 0, \
|
.flags = 0, \
|
||||||
.cpu = 0, \
|
.cpu = 0, \
|
||||||
|
.preempt_count = INIT_PREEMPT_COUNT, \
|
||||||
.restart_block = { \
|
.restart_block = { \
|
||||||
.fn = do_no_restart_syscall, \
|
.fn = do_no_restart_syscall, \
|
||||||
}, \
|
}, \
|
||||||
|
|
|
@ -290,7 +290,7 @@ void dump(struct pt_regs *fp)
|
||||||
unsigned char *tp;
|
unsigned char *tp;
|
||||||
int i;
|
int i;
|
||||||
|
|
||||||
printk(KERN_EMERG "\n" KERN_EMERG "CURRENT PROCESS:\n" KERN_EMERG "\n");
|
printk(KERN_EMERG "\nCURRENT PROCESS:\n\n");
|
||||||
printk(KERN_EMERG "COMM=%s PID=%d\n", current->comm, current->pid);
|
printk(KERN_EMERG "COMM=%s PID=%d\n", current->comm, current->pid);
|
||||||
|
|
||||||
if (current->mm) {
|
if (current->mm) {
|
||||||
|
@ -301,8 +301,7 @@ void dump(struct pt_regs *fp)
|
||||||
(int) current->mm->end_data,
|
(int) current->mm->end_data,
|
||||||
(int) current->mm->end_data,
|
(int) current->mm->end_data,
|
||||||
(int) current->mm->brk);
|
(int) current->mm->brk);
|
||||||
printk(KERN_EMERG "USER-STACK=%08x KERNEL-STACK=%08x\n"
|
printk(KERN_EMERG "USER-STACK=%08x KERNEL-STACK=%08x\n\n",
|
||||||
KERN_EMERG "\n",
|
|
||||||
(int) current->mm->start_stack,
|
(int) current->mm->start_stack,
|
||||||
(int)(((unsigned long) current) + THREAD_SIZE));
|
(int)(((unsigned long) current) + THREAD_SIZE));
|
||||||
}
|
}
|
||||||
|
@ -313,35 +312,35 @@ void dump(struct pt_regs *fp)
|
||||||
fp->d0, fp->d1, fp->d2, fp->d3);
|
fp->d0, fp->d1, fp->d2, fp->d3);
|
||||||
printk(KERN_EMERG "d4: %08lx d5: %08lx a0: %08lx a1: %08lx\n",
|
printk(KERN_EMERG "d4: %08lx d5: %08lx a0: %08lx a1: %08lx\n",
|
||||||
fp->d4, fp->d5, fp->a0, fp->a1);
|
fp->d4, fp->d5, fp->a0, fp->a1);
|
||||||
printk(KERN_EMERG "\n" KERN_EMERG "USP: %08x TRAPFRAME: %08x\n",
|
printk(KERN_EMERG "\nUSP: %08x TRAPFRAME: %08x\n",
|
||||||
(unsigned int) rdusp(), (unsigned int) fp);
|
(unsigned int) rdusp(), (unsigned int) fp);
|
||||||
|
|
||||||
printk(KERN_EMERG "\n" KERN_EMERG "CODE:");
|
printk(KERN_EMERG "\nCODE:");
|
||||||
tp = ((unsigned char *) fp->pc) - 0x20;
|
tp = ((unsigned char *) fp->pc) - 0x20;
|
||||||
for (sp = (unsigned long *) tp, i = 0; (i < 0x40); i += 4) {
|
for (sp = (unsigned long *) tp, i = 0; (i < 0x40); i += 4) {
|
||||||
if ((i % 0x10) == 0)
|
if ((i % 0x10) == 0)
|
||||||
printk("\n" KERN_EMERG "%08x: ", (int) (tp + i));
|
printk(KERN_EMERG "%08x: ", (int) (tp + i));
|
||||||
printk("%08x ", (int) *sp++);
|
printk("%08x ", (int) *sp++);
|
||||||
}
|
}
|
||||||
printk("\n" KERN_EMERG "\n");
|
printk(KERN_EMERG "\n");
|
||||||
|
|
||||||
printk(KERN_EMERG "KERNEL STACK:");
|
printk(KERN_EMERG "KERNEL STACK:");
|
||||||
tp = ((unsigned char *) fp) - 0x40;
|
tp = ((unsigned char *) fp) - 0x40;
|
||||||
for (sp = (unsigned long *) tp, i = 0; (i < 0xc0); i += 4) {
|
for (sp = (unsigned long *) tp, i = 0; (i < 0xc0); i += 4) {
|
||||||
if ((i % 0x10) == 0)
|
if ((i % 0x10) == 0)
|
||||||
printk("\n" KERN_EMERG "%08x: ", (int) (tp + i));
|
printk(KERN_EMERG "%08x: ", (int) (tp + i));
|
||||||
printk("%08x ", (int) *sp++);
|
printk("%08x ", (int) *sp++);
|
||||||
}
|
}
|
||||||
printk("\n" KERN_EMERG "\n");
|
printk(KERN_EMERG "\n");
|
||||||
|
|
||||||
printk(KERN_EMERG "USER STACK:");
|
printk(KERN_EMERG "USER STACK:");
|
||||||
tp = (unsigned char *) (rdusp() - 0x10);
|
tp = (unsigned char *) (rdusp() - 0x10);
|
||||||
for (sp = (unsigned long *) tp, i = 0; (i < 0x80); i += 4) {
|
for (sp = (unsigned long *) tp, i = 0; (i < 0x80); i += 4) {
|
||||||
if ((i % 0x10) == 0)
|
if ((i % 0x10) == 0)
|
||||||
printk("\n" KERN_EMERG "%08x: ", (int) (tp + i));
|
printk(KERN_EMERG "%08x: ", (int) (tp + i));
|
||||||
printk("%08x ", (int) *sp++);
|
printk("%08x ", (int) *sp++);
|
||||||
}
|
}
|
||||||
printk("\n" KERN_EMERG "\n");
|
printk(KERN_EMERG "\n");
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -111,7 +111,7 @@ static void print_this_address(unsigned long addr, int i)
|
||||||
if (i % 5)
|
if (i % 5)
|
||||||
printk(KERN_CONT " [%08lx] ", addr);
|
printk(KERN_CONT " [%08lx] ", addr);
|
||||||
else
|
else
|
||||||
printk(KERN_CONT "\n" KERN_EMERG " [%08lx] ", addr);
|
printk(KERN_EMERG " [%08lx] ", addr);
|
||||||
i++;
|
i++;
|
||||||
#endif
|
#endif
|
||||||
}
|
}
|
||||||
|
@ -137,8 +137,8 @@ static void __show_stack(struct task_struct *task, unsigned long *stack)
|
||||||
if (stack + 1 + i > endstack)
|
if (stack + 1 + i > endstack)
|
||||||
break;
|
break;
|
||||||
if (i % 8 == 0)
|
if (i % 8 == 0)
|
||||||
printk("\n" KERN_EMERG " ");
|
printk(KERN_EMERG " ");
|
||||||
printk(" %08lx", *(stack + i));
|
printk(KERN_CONT " %08lx", *(stack + i));
|
||||||
}
|
}
|
||||||
printk("\n");
|
printk("\n");
|
||||||
i = 0;
|
i = 0;
|
||||||
|
|
|
@ -53,6 +53,9 @@ config GENERIC_HARDIRQS_NO__DO_IRQ
|
||||||
config GENERIC_GPIO
|
config GENERIC_GPIO
|
||||||
def_bool y
|
def_bool y
|
||||||
|
|
||||||
|
config GENERIC_CSUM
|
||||||
|
def_bool y
|
||||||
|
|
||||||
config PCI
|
config PCI
|
||||||
def_bool n
|
def_bool n
|
||||||
|
|
||||||
|
|
|
@ -1,95 +1,7 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2006 Atmark Techno, Inc.
|
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _ASM_MICROBLAZE_ATOMIC_H
|
#ifndef _ASM_MICROBLAZE_ATOMIC_H
|
||||||
#define _ASM_MICROBLAZE_ATOMIC_H
|
#define _ASM_MICROBLAZE_ATOMIC_H
|
||||||
|
|
||||||
#include <linux/types.h>
|
#include <asm-generic/atomic.h>
|
||||||
#include <linux/compiler.h> /* likely */
|
|
||||||
#include <asm/system.h> /* local_irq_XXX and friends */
|
|
||||||
|
|
||||||
#define ATOMIC_INIT(i) { (i) }
|
|
||||||
#define atomic_read(v) ((v)->counter)
|
|
||||||
#define atomic_set(v, i) (((v)->counter) = (i))
|
|
||||||
|
|
||||||
#define atomic_inc(v) (atomic_add_return(1, (v)))
|
|
||||||
#define atomic_dec(v) (atomic_sub_return(1, (v)))
|
|
||||||
|
|
||||||
#define atomic_add(i, v) (atomic_add_return(i, (v)))
|
|
||||||
#define atomic_sub(i, v) (atomic_sub_return(i, (v)))
|
|
||||||
|
|
||||||
#define atomic_inc_return(v) (atomic_add_return(1, (v)))
|
|
||||||
#define atomic_dec_return(v) (atomic_sub_return(1, (v)))
|
|
||||||
|
|
||||||
#define atomic_inc_and_test(v) (atomic_add_return(1, (v)) == 0)
|
|
||||||
#define atomic_dec_and_test(v) (atomic_sub_return(1, (v)) == 0)
|
|
||||||
|
|
||||||
#define atomic_inc_not_zero(v) (atomic_add_unless((v), 1, 0))
|
|
||||||
|
|
||||||
#define atomic_sub_and_test(i, v) (atomic_sub_return((i), (v)) == 0)
|
|
||||||
|
|
||||||
static inline int atomic_cmpxchg(atomic_t *v, int old, int new)
|
|
||||||
{
|
|
||||||
int ret;
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
local_irq_save(flags);
|
|
||||||
ret = v->counter;
|
|
||||||
if (likely(ret == old))
|
|
||||||
v->counter = new;
|
|
||||||
local_irq_restore(flags);
|
|
||||||
|
|
||||||
return ret;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int atomic_add_unless(atomic_t *v, int a, int u)
|
|
||||||
{
|
|
||||||
int c, old;
|
|
||||||
|
|
||||||
c = atomic_read(v);
|
|
||||||
while (c != u && (old = atomic_cmpxchg((v), c, c + a)) != c)
|
|
||||||
c = old;
|
|
||||||
return c != u;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline void atomic_clear_mask(unsigned long mask, unsigned long *addr)
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
|
|
||||||
local_irq_save(flags);
|
|
||||||
*addr &= ~mask;
|
|
||||||
local_irq_restore(flags);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* atomic_add_return - add and return
|
|
||||||
* @i: integer value to add
|
|
||||||
* @v: pointer of type atomic_t
|
|
||||||
*
|
|
||||||
* Atomically adds @i to @v and returns @i + @v
|
|
||||||
*/
|
|
||||||
static inline int atomic_add_return(int i, atomic_t *v)
|
|
||||||
{
|
|
||||||
unsigned long flags;
|
|
||||||
int val;
|
|
||||||
|
|
||||||
local_irq_save(flags);
|
|
||||||
val = v->counter;
|
|
||||||
v->counter = val += i;
|
|
||||||
local_irq_restore(flags);
|
|
||||||
|
|
||||||
return val;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline int atomic_sub_return(int i, atomic_t *v)
|
|
||||||
{
|
|
||||||
return atomic_add_return(-i, v);
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Atomically test *v and decrement if it is greater than 0.
|
* Atomically test *v and decrement if it is greater than 0.
|
||||||
|
@ -109,15 +21,4 @@ static inline int atomic_dec_if_positive(atomic_t *v)
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
#define atomic_add_negative(a, v) (atomic_add_return((a), (v)) < 0)
|
|
||||||
#define atomic_xchg(v, new) (xchg(&((v)->counter), new))
|
|
||||||
|
|
||||||
/* Atomic operations are already serializing */
|
|
||||||
#define smp_mb__before_atomic_dec() barrier()
|
|
||||||
#define smp_mb__after_atomic_dec() barrier()
|
|
||||||
#define smp_mb__before_atomic_inc() barrier()
|
|
||||||
#define smp_mb__after_atomic_inc() barrier()
|
|
||||||
|
|
||||||
#include <asm-generic/atomic-long.h>
|
|
||||||
|
|
||||||
#endif /* _ASM_MICROBLAZE_ATOMIC_H */
|
#endif /* _ASM_MICROBLAZE_ATOMIC_H */
|
||||||
|
|
|
@ -1,27 +1 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2006 Atmark Techno, Inc.
|
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _ASM_MICROBLAZE_BITOPS_H
|
|
||||||
#define _ASM_MICROBLAZE_BITOPS_H
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Copyright 1992, Linus Torvalds.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#include <asm/byteorder.h> /* swab32 */
|
|
||||||
#include <asm/system.h> /* save_flags */
|
|
||||||
|
|
||||||
/*
|
|
||||||
* clear_bit() doesn't provide any barrier for the compiler.
|
|
||||||
*/
|
|
||||||
#define smp_mb__before_clear_bit() barrier()
|
|
||||||
#define smp_mb__after_clear_bit() barrier()
|
|
||||||
#include <asm-generic/bitops.h>
|
#include <asm-generic/bitops.h>
|
||||||
#include <asm-generic/bitops/__fls.h>
|
|
||||||
|
|
||||||
#endif /* _ASM_MICROBLAZE_BITOPS_H */
|
|
||||||
|
|
|
@ -1,15 +1 @@
|
||||||
/*
|
|
||||||
* Copyright (C) 2006 Atmark Techno, Inc.
|
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _ASM_MICROBLAZE_BUG_H
|
|
||||||
#define _ASM_MICROBLAZE_BUG_H
|
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
|
||||||
#include <asm-generic/bug.h>
|
#include <asm-generic/bug.h>
|
||||||
|
|
||||||
#endif /* _ASM_MICROBLAZE_BUG_H */
|
|
||||||
|
|
|
@ -1,17 +1 @@
|
||||||
/*
|
#include <asm-generic/bugs.h>
|
||||||
* Copyright (C) 2006 Atmark Techno, Inc.
|
|
||||||
*
|
|
||||||
* This file is subject to the terms and conditions of the GNU General Public
|
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
|
||||||
* for more details.
|
|
||||||
*/
|
|
||||||
|
|
||||||
#ifndef _ASM_MICROBLAZE_BUGS_H
|
|
||||||
#define _ASM_MICROBLAZE_BUGS_H
|
|
||||||
|
|
||||||
static inline void check_bugs(void)
|
|
||||||
{
|
|
||||||
/* nothing to do */
|
|
||||||
}
|
|
||||||
|
|
||||||
#endif /* _ASM_MICROBLAZE_BUGS_H */
|
|
||||||
|
|
|
@ -10,12 +10,11 @@
|
||||||
#ifndef _ASM_MICROBLAZE_CHECKSUM_H
|
#ifndef _ASM_MICROBLAZE_CHECKSUM_H
|
||||||
#define _ASM_MICROBLAZE_CHECKSUM_H
|
#define _ASM_MICROBLAZE_CHECKSUM_H
|
||||||
|
|
||||||
#include <linux/in6.h>
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* computes the checksum of the TCP/UDP pseudo-header
|
* computes the checksum of the TCP/UDP pseudo-header
|
||||||
* returns a 16-bit checksum, already complemented
|
* returns a 16-bit checksum, already complemented
|
||||||
*/
|
*/
|
||||||
|
#define csum_tcpudp_nofold csum_tcpudp_nofold
|
||||||
static inline __wsum
|
static inline __wsum
|
||||||
csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
|
csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
|
||||||
unsigned short proto, __wsum sum)
|
unsigned short proto, __wsum sum)
|
||||||
|
@ -30,71 +29,6 @@ csum_tcpudp_nofold(__be32 saddr, __be32 daddr, unsigned short len,
|
||||||
return sum;
|
return sum;
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
#include <asm-generic/checksum.h>
|
||||||
* computes the checksum of a memory block at buff, length len,
|
|
||||||
* and adds in "sum" (32-bit)
|
|
||||||
*
|
|
||||||
* returns a 32-bit number suitable for feeding into itself
|
|
||||||
* or csum_tcpudp_magic
|
|
||||||
*
|
|
||||||
* this function must be called with even lengths, except
|
|
||||||
* for the last fragment, which may be odd
|
|
||||||
*
|
|
||||||
* it's best to have buff aligned on a 32-bit boundary
|
|
||||||
*/
|
|
||||||
extern __wsum csum_partial(const void *buff, int len, __wsum sum);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* the same as csum_partial, but copies from src while it
|
|
||||||
* checksums
|
|
||||||
*
|
|
||||||
* here even more important to align src and dst on a 32-bit (or even
|
|
||||||
* better 64-bit) boundary
|
|
||||||
*/
|
|
||||||
extern __wsum csum_partial_copy(const void *src, void *dst, int len,
|
|
||||||
__wsum sum);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* the same as csum_partial_copy, but copies from user space.
|
|
||||||
*
|
|
||||||
* here even more important to align src and dst on a 32-bit (or even
|
|
||||||
* better 64-bit) boundary
|
|
||||||
*/
|
|
||||||
extern __wsum csum_partial_copy_from_user(const void __user *src, void *dst,
|
|
||||||
int len, __wsum sum, int *csum_err);
|
|
||||||
|
|
||||||
#define csum_partial_copy_nocheck(src, dst, len, sum) \
|
|
||||||
csum_partial_copy((src), (dst), (len), (sum))
|
|
||||||
|
|
||||||
/*
|
|
||||||
* This is a version of ip_compute_csum() optimized for IP headers,
|
|
||||||
* which always checksum on 4 octet boundaries.
|
|
||||||
*
|
|
||||||
*/
|
|
||||||
extern __sum16 ip_fast_csum(const void *iph, unsigned int ihl);
|
|
||||||
|
|
||||||
/*
|
|
||||||
* Fold a partial checksum
|
|
||||||
*/
|
|
||||||
static inline __sum16 csum_fold(__wsum csum)
|
|
||||||
{
|
|
||||||
u32 sum = (__force u32)csum;
|
|
||||||
sum = (sum & 0xffff) + (sum >> 16);
|
|
||||||
sum = (sum & 0xffff) + (sum >> 16);
|
|
||||||
return (__force __sum16)~sum;
|
|
||||||
}
|
|
||||||
|
|
||||||
static inline __sum16
|
|
||||||
csum_tcpudp_magic(__be32 saddr, __be32 daddr, unsigned short len,
|
|
||||||
unsigned short proto, __wsum sum)
|
|
||||||
{
|
|
||||||
return csum_fold(csum_tcpudp_nofold(saddr, daddr, len, proto, sum));
|
|
||||||
}
|
|
||||||
|
|
||||||
/*
|
|
||||||
* this routine is used for miscellaneous IP-like checksums, mainly
|
|
||||||
* in icmp.c
|
|
||||||
*/
|
|
||||||
extern __sum16 ip_compute_csum(const void *buff, int len);
|
|
||||||
|
|
||||||
#endif /* _ASM_MICROBLAZE_CHECKSUM_H */
|
#endif /* _ASM_MICROBLAZE_CHECKSUM_H */
|
||||||
|
|
|
@ -0,0 +1 @@
|
||||||
|
#include <asm-generic/fb.h>
|
|
@ -9,21 +9,11 @@
|
||||||
#ifndef _ASM_MICROBLAZE_HARDIRQ_H
|
#ifndef _ASM_MICROBLAZE_HARDIRQ_H
|
||||||
#define _ASM_MICROBLAZE_HARDIRQ_H
|
#define _ASM_MICROBLAZE_HARDIRQ_H
|
||||||
|
|
||||||
#include <linux/cache.h>
|
|
||||||
#include <linux/irq.h>
|
|
||||||
#include <asm/irq.h>
|
|
||||||
#include <asm/current.h>
|
|
||||||
#include <linux/ptrace.h>
|
|
||||||
|
|
||||||
/* should be defined in each interrupt controller driver */
|
/* should be defined in each interrupt controller driver */
|
||||||
extern unsigned int get_irq(struct pt_regs *regs);
|
extern unsigned int get_irq(struct pt_regs *regs);
|
||||||
|
|
||||||
typedef struct {
|
#define ack_bad_irq ack_bad_irq
|
||||||
unsigned int __softirq_pending;
|
|
||||||
} ____cacheline_aligned irq_cpustat_t;
|
|
||||||
|
|
||||||
void ack_bad_irq(unsigned int irq);
|
void ack_bad_irq(unsigned int irq);
|
||||||
|
#include <asm-generic/hardirq.h>
|
||||||
#include <linux/irq_cpustat.h> /* Standard mappings for irq_cpustat_t above */
|
|
||||||
|
|
||||||
#endif /* _ASM_MICROBLAZE_HARDIRQ_H */
|
#endif /* _ASM_MICROBLAZE_HARDIRQ_H */
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue