Merge branch 'master' of master.kernel.org:/pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
commit
0803d540db
2
.mailmap
2
.mailmap
|
@ -80,6 +80,8 @@ Nguyen Anh Quynh <aquynh@gmail.com>
|
|||
Paolo 'Blaisorblade' Giarrusso <blaisorblade@yahoo.it>
|
||||
Patrick Mochel <mochel@digitalimplant.org>
|
||||
Peter A Jonsson <pj@ludd.ltu.se>
|
||||
Peter Oruba <peter@oruba.de>
|
||||
Peter Oruba <peter.oruba@amd.com>
|
||||
Praveen BP <praveenbp@ti.com>
|
||||
Rajesh Shah <rajesh.shah@intel.com>
|
||||
Ralf Baechle <ralf@linux-mips.org>
|
||||
|
|
|
@ -172,7 +172,7 @@ i2c/
|
|||
- directory with info about the I2C bus/protocol (2 wire, kHz speed).
|
||||
i2o/
|
||||
- directory with info about the Linux I2O subsystem.
|
||||
i386/
|
||||
x86/i386/
|
||||
- directory with info about Linux on Intel 32 bit architecture.
|
||||
ia64/
|
||||
- directory with info about Linux on Intel 64 bit architecture.
|
||||
|
@ -382,7 +382,7 @@ w1/
|
|||
- directory with documents regarding the 1-wire (w1) subsystem.
|
||||
watchdog/
|
||||
- how to auto-reboot Linux if it has "fallen and can't get up". ;-)
|
||||
x86_64/
|
||||
x86/x86_64/
|
||||
- directory with info on Linux support for AMD x86-64 (Hammer) machines.
|
||||
zorro.txt
|
||||
- info on writing drivers for Zorro bus devices found on Amigas.
|
||||
|
|
|
@ -136,7 +136,7 @@ quiet_cmd_db2ps = PS $@
|
|||
%.ps : %.xml
|
||||
$(call cmd,db2ps)
|
||||
|
||||
quiet_cmd_db2pdf = PDF $@
|
||||
quiet_cmd_db2pdf = PDF $@
|
||||
cmd_db2pdf = $(subst TYPE,pdf, $($(PDF_METHOD)template))
|
||||
%.pdf : %.xml
|
||||
$(call cmd,db2pdf)
|
||||
|
@ -148,7 +148,7 @@ build_main_index = rm -rf $(main_idx) && \
|
|||
echo '<h2>Kernel Version: $(KERNELVERSION)</h2>' >> $(main_idx) && \
|
||||
cat $(HTML) >> $(main_idx)
|
||||
|
||||
quiet_cmd_db2html = HTML $@
|
||||
quiet_cmd_db2html = HTML $@
|
||||
cmd_db2html = xmlto xhtml $(XMLTOFLAGS) -o $(patsubst %.html,%,$@) $< && \
|
||||
echo '<a HREF="$(patsubst %.html,%,$(notdir $@))/index.html"> \
|
||||
$(patsubst %.html,%,$(notdir $@))</a><p>' > $@
|
||||
|
|
|
@ -24,7 +24,7 @@
|
|||
<surname>Cox</surname>
|
||||
<affiliation>
|
||||
<address>
|
||||
<email>alan@redhat.com</email>
|
||||
<email>alan@lxorguk.ukuu.org.uk</email>
|
||||
</address>
|
||||
</affiliation>
|
||||
</author>
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<surname>Cox</surname>
|
||||
<affiliation>
|
||||
<address>
|
||||
<email>alan@redhat.com</email>
|
||||
<email>alan@lxorguk.ukuu.org.uk</email>
|
||||
</address>
|
||||
</affiliation>
|
||||
</author>
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<surname>Cox</surname>
|
||||
<affiliation>
|
||||
<address>
|
||||
<email>alan@redhat.com</email>
|
||||
<email>alan@lxorguk.ukuu.org.uk</email>
|
||||
</address>
|
||||
</affiliation>
|
||||
</author>
|
||||
|
|
|
@ -12,7 +12,7 @@
|
|||
<surname>Cox</surname>
|
||||
<affiliation>
|
||||
<address>
|
||||
<email>alan@redhat.com</email>
|
||||
<email>alan@lxorguk.ukuu.org.uk</email>
|
||||
</address>
|
||||
</affiliation>
|
||||
</author>
|
||||
|
|
|
@ -17,7 +17,7 @@ companies. If you sign purchase orders or you have any clue about the
|
|||
budget of your group, you're almost certainly not a kernel manager.
|
||||
These suggestions may or may not apply to you.
|
||||
|
||||
First off, I'd suggest buying "Seven Habits of Highly Successful
|
||||
First off, I'd suggest buying "Seven Habits of Highly Effective
|
||||
People", and NOT read it. Burn it, it's a great symbolic gesture.
|
||||
|
||||
(*) This document does so not so much by answering the question, but by
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
getdelays
|
|
@ -1,13 +0,0 @@
|
|||
Empeg, Ltd's Empeg MP3 Car Audio Player
|
||||
|
||||
The initial design is to go in your car, but you can use it at home, on a
|
||||
boat... almost anywhere. The principle is to store CD-quality music using
|
||||
MPEG technology onto a hard disk in the unit, and use the power of the
|
||||
embedded computer to serve up the music you want.
|
||||
|
||||
For more details, see:
|
||||
|
||||
http://www.empeg.com
|
||||
|
||||
|
||||
|
|
@ -1,49 +0,0 @@
|
|||
Infra-red driver documentation.
|
||||
|
||||
Mike Crowe <mac@empeg.com>
|
||||
(C) Empeg Ltd 1999
|
||||
|
||||
Not a lot here yet :-)
|
||||
|
||||
The Kenwood KCA-R6A remote control generates a sequence like the following:
|
||||
|
||||
Go low for approx 16T (Around 9000us)
|
||||
Go high for approx 8T (Around 4000us)
|
||||
Go low for less than 2T (Around 750us)
|
||||
|
||||
For each of the 32 bits
|
||||
Go high for more than 2T (Around 1500us) == 1
|
||||
Go high for less than T (Around 400us) == 0
|
||||
Go low for less than 2T (Around 750us)
|
||||
|
||||
Rather than repeat a signal when the button is held down certain buttons
|
||||
generate the following code to indicate repetition.
|
||||
|
||||
Go low for approx 16T
|
||||
Go high for approx 4T
|
||||
Go low for less than 2T
|
||||
|
||||
(By removing the <2T from the start of the sequence and placing at the end
|
||||
it can be considered a stop bit but I found it easier to deal with it at
|
||||
the start).
|
||||
|
||||
The 32 bits are encoded as XxYy where x and y are the actual data values
|
||||
while X and Y are the logical inverses of the associated data values. Using
|
||||
LSB first yields sensible codes for the numbers.
|
||||
|
||||
All codes are of the form b9xx
|
||||
|
||||
The numeric keys generate the code 0x where x is the number pressed.
|
||||
|
||||
Tuner 1c
|
||||
Tape 1d
|
||||
CD 1e
|
||||
CD-MD-CH 1f
|
||||
Track- 0a
|
||||
Track+ 0b
|
||||
Rewind 0c
|
||||
FF 0d
|
||||
DNPP 5e
|
||||
Play/Pause 0e
|
||||
Vol+ 14
|
||||
Vol- 15
|
|
@ -1,11 +0,0 @@
|
|||
#!/bin/sh
|
||||
mknod /dev/display c 244 0
|
||||
mknod /dev/ir c 242 0
|
||||
mknod /dev/usb0 c 243 0
|
||||
mknod /dev/audio c 245 4
|
||||
mknod /dev/dsp c 245 3
|
||||
mknod /dev/mixer c 245 0
|
||||
mknod /dev/empeg_state c 246 0
|
||||
mknod /dev/radio0 c 81 64
|
||||
ln -sf radio0 radio
|
||||
ln -sf usb0 usb
|
|
@ -0,0 +1 @@
|
|||
cfag12864b-example
|
|
@ -0,0 +1 @@
|
|||
ucon
|
|
@ -161,8 +161,12 @@ prototypes:
|
|||
int (*set_page_dirty)(struct page *page);
|
||||
int (*readpages)(struct file *filp, struct address_space *mapping,
|
||||
struct list_head *pages, unsigned nr_pages);
|
||||
int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
|
||||
int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
|
||||
int (*write_begin)(struct file *, struct address_space *mapping,
|
||||
loff_t pos, unsigned len, unsigned flags,
|
||||
struct page **pagep, void **fsdata);
|
||||
int (*write_end)(struct file *, struct address_space *mapping,
|
||||
loff_t pos, unsigned len, unsigned copied,
|
||||
struct page *page, void *fsdata);
|
||||
sector_t (*bmap)(struct address_space *, sector_t);
|
||||
int (*invalidatepage) (struct page *, unsigned long);
|
||||
int (*releasepage) (struct page *, int);
|
||||
|
@ -180,8 +184,6 @@ sync_page: no maybe
|
|||
writepages: no
|
||||
set_page_dirty no no
|
||||
readpages: no
|
||||
prepare_write: no yes yes
|
||||
commit_write: no yes yes
|
||||
write_begin: no locks the page yes
|
||||
write_end: no yes, unlocks yes
|
||||
perform_write: no n/a yes
|
||||
|
@ -191,7 +193,7 @@ releasepage: no yes
|
|||
direct_IO: no
|
||||
launder_page: no yes
|
||||
|
||||
->prepare_write(), ->commit_write(), ->sync_page() and ->readpage()
|
||||
->write_begin(), ->write_end(), ->sync_page() and ->readpage()
|
||||
may be called from the request handler (/dev/loop).
|
||||
|
||||
->readpage() unlocks the page, either synchronously or via I/O
|
||||
|
|
|
@ -492,7 +492,7 @@ written-back to storage typically in whole pages, however the
|
|||
address_space has finer control of write sizes.
|
||||
|
||||
The read process essentially only requires 'readpage'. The write
|
||||
process is more complicated and uses prepare_write/commit_write or
|
||||
process is more complicated and uses write_begin/write_end or
|
||||
set_page_dirty to write data into the address_space, and writepage,
|
||||
sync_page, and writepages to writeback data to storage.
|
||||
|
||||
|
@ -521,8 +521,6 @@ struct address_space_operations {
|
|||
int (*set_page_dirty)(struct page *page);
|
||||
int (*readpages)(struct file *filp, struct address_space *mapping,
|
||||
struct list_head *pages, unsigned nr_pages);
|
||||
int (*prepare_write)(struct file *, struct page *, unsigned, unsigned);
|
||||
int (*commit_write)(struct file *, struct page *, unsigned, unsigned);
|
||||
int (*write_begin)(struct file *, struct address_space *mapping,
|
||||
loff_t pos, unsigned len, unsigned flags,
|
||||
struct page **pagep, void **fsdata);
|
||||
|
@ -598,37 +596,7 @@ struct address_space_operations {
|
|||
readpages is only used for read-ahead, so read errors are
|
||||
ignored. If anything goes wrong, feel free to give up.
|
||||
|
||||
prepare_write: called by the generic write path in VM to set up a write
|
||||
request for a page. This indicates to the address space that
|
||||
the given range of bytes is about to be written. The
|
||||
address_space should check that the write will be able to
|
||||
complete, by allocating space if necessary and doing any other
|
||||
internal housekeeping. If the write will update parts of
|
||||
any basic-blocks on storage, then those blocks should be
|
||||
pre-read (if they haven't been read already) so that the
|
||||
updated blocks can be written out properly.
|
||||
The page will be locked.
|
||||
|
||||
Note: the page _must not_ be marked uptodate in this function
|
||||
(or anywhere else) unless it actually is uptodate right now. As
|
||||
soon as a page is marked uptodate, it is possible for a concurrent
|
||||
read(2) to copy it to userspace.
|
||||
|
||||
commit_write: If prepare_write succeeds, new data will be copied
|
||||
into the page and then commit_write will be called. It will
|
||||
typically update the size of the file (if appropriate) and
|
||||
mark the inode as dirty, and do any other related housekeeping
|
||||
operations. It should avoid returning an error if possible -
|
||||
errors should have been handled by prepare_write.
|
||||
|
||||
write_begin: This is intended as a replacement for prepare_write. The
|
||||
key differences being that:
|
||||
- it returns a locked page (in *pagep) rather than being
|
||||
given a pre locked page;
|
||||
- it must be able to cope with short writes (where the
|
||||
length passed to write_begin is greater than the number
|
||||
of bytes copied into the page).
|
||||
|
||||
write_begin:
|
||||
Called by the generic buffered write code to ask the filesystem to
|
||||
prepare to write len bytes at the given offset in the file. The
|
||||
address_space should check that the write will be able to complete,
|
||||
|
@ -640,6 +608,9 @@ struct address_space_operations {
|
|||
The filesystem must return the locked pagecache page for the specified
|
||||
offset, in *pagep, for the caller to write into.
|
||||
|
||||
It must be able to cope with short writes (where the length passed to
|
||||
write_begin is greater than the number of bytes copied into the page).
|
||||
|
||||
flags is a field for AOP_FLAG_xxx flags, described in
|
||||
include/linux/fs.h.
|
||||
|
||||
|
|
|
@ -291,6 +291,9 @@ explains which is which.
|
|||
CPU#: The CPU which the process was running on.
|
||||
|
||||
irqs-off: 'd' interrupts are disabled. '.' otherwise.
|
||||
Note: If the architecture does not support a way to
|
||||
read the irq flags variable, an 'X' will always
|
||||
be printed here.
|
||||
|
||||
need-resched: 'N' task need_resched is set, '.' otherwise.
|
||||
|
||||
|
|
|
@ -42,7 +42,7 @@ I suspect that this driver could be made to work for the following SiS
|
|||
chipsets as well: 635, and 635T. If anyone owns a board with those chips
|
||||
AND is willing to risk crashing & burning an otherwise well-behaved kernel
|
||||
in the name of progress... please contact me at <mhoffman@lightlink.com> or
|
||||
via the project's mailing list: <i2c@lm-sensors.org>. Please send bug
|
||||
via the linux-i2c mailing list: <linux-i2c@vger.kernel.org>. Please send bug
|
||||
reports and/or success stories as well.
|
||||
|
||||
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
aliasing-test
|
|
@ -5,7 +5,7 @@ I want to thank all who contributed to this project and especially to:
|
|||
Thomas Bogendörfer (tsbogend@bigbug.franken.de)
|
||||
Tester, lots of bugfixes and hints.
|
||||
|
||||
Alan Cox (alan@redhat.com)
|
||||
Alan Cox (alan@lxorguk.ukuu.org.uk)
|
||||
For help getting into standard-kernel.
|
||||
|
||||
Henner Eisen (eis@baty.hanse.de)
|
||||
|
|
|
@ -11,14 +11,14 @@ for non English (read: Japanese) speakers and is not intended as a
|
|||
fork. So if you have any comments or updates for this file, please try
|
||||
to update the original English file first.
|
||||
|
||||
Last Updated: 2008/08/21
|
||||
Last Updated: 2008/10/24
|
||||
==================================
|
||||
これは、
|
||||
linux-2.6.27/Documentation/HOWTO
|
||||
linux-2.6.28/Documentation/HOWTO
|
||||
の和訳です。
|
||||
|
||||
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
|
||||
翻訳日: 2008/8/5
|
||||
翻訳日: 2008/10/24
|
||||
翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
|
||||
校正者: 松倉さん <nbh--mats at nifty dot com>
|
||||
小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp>
|
||||
|
@ -110,8 +110,8 @@ Linux カーネルソースツリーは幅広い範囲のドキュメントを
|
|||
新しいドキュメントファイルも追加することを勧めます。
|
||||
カーネルの変更が、カーネルがユーザ空間に公開しているインターフェイスの
|
||||
変更を引き起こす場合、その変更を説明するマニュアルページのパッチや情報
|
||||
をマニュアルページのメンテナ mtk.manpages@gmail.com に送ることを勧めま
|
||||
す。
|
||||
をマニュアルページのメンテナ mtk.manpages@gmail.com に送り、CC を
|
||||
linux-api@ver.kernel.org に送ることを勧めます。
|
||||
|
||||
以下はカーネルソースツリーに含まれている読んでおくべきファイルの一覧で
|
||||
す-
|
||||
|
@ -149,7 +149,7 @@ Linux カーネルソースツリーは幅広い範囲のドキュメントを
|
|||
この他にパッチを作る方法についてのよくできた記述は-
|
||||
|
||||
"The Perfect Patch"
|
||||
http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
|
||||
http://userweb.kernel.org/~akpm/stuff/tpp.txt
|
||||
"Linux kernel patch submission format"
|
||||
http://linux.yyz.us/patch-format.html
|
||||
|
||||
|
@ -664,7 +664,7 @@ Linux カーネルコミュニティは、一度に大量のコードの塊を
|
|||
これについて全てがどのようにあるべきかについての詳細は、以下のドキュメ
|
||||
ントの ChangeLog セクションを見てください-
|
||||
"The Perfect Patch"
|
||||
http://www.zip.com.au/~akpm/linux/patches/stuff/tpp.txt
|
||||
http://userweb.kernel.org/~akpm/stuff/tpp.txt
|
||||
|
||||
これらのどれもが、時にはとても困難です。これらの慣例を完璧に実施するに
|
||||
は数年かかるかもしれません。これは継続的な改善のプロセスであり、そのた
|
||||
|
|
|
@ -100,7 +100,7 @@ parameter is applicable:
|
|||
X86-32 X86-32, aka i386 architecture is enabled.
|
||||
X86-64 X86-64 architecture is enabled.
|
||||
More X86-64 boot options can be found in
|
||||
Documentation/x86_64/boot-options.txt .
|
||||
Documentation/x86/x86_64/boot-options.txt .
|
||||
X86 Either 32bit or 64bit x86 (same as X86-32+X86-64)
|
||||
|
||||
In addition, the following text indicates that the option:
|
||||
|
@ -112,10 +112,10 @@ In addition, the following text indicates that the option:
|
|||
Parameters denoted with BOOT are actually interpreted by the boot
|
||||
loader, and have no meaning to the kernel directly.
|
||||
Do not modify the syntax of boot loader parameters without extreme
|
||||
need or coordination with <Documentation/i386/boot.txt>.
|
||||
need or coordination with <Documentation/x86/i386/boot.txt>.
|
||||
|
||||
There are also arch-specific kernel-parameters not documented here.
|
||||
See for example <Documentation/x86_64/boot-options.txt>.
|
||||
See for example <Documentation/x86/x86_64/boot-options.txt>.
|
||||
|
||||
Note that ALL kernel parameters listed below are CASE SENSITIVE, and that
|
||||
a trailing = on the name of any parameter states that that parameter will
|
||||
|
@ -1222,7 +1222,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
|
||||
mce [X86-32] Machine Check Exception
|
||||
|
||||
mce=option [X86-64] See Documentation/x86_64/boot-options.txt
|
||||
mce=option [X86-64] See Documentation/x86/x86_64/boot-options.txt
|
||||
|
||||
md= [HW] RAID subsystems devices and level
|
||||
See Documentation/md.txt.
|
||||
|
@ -1728,7 +1728,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
See Documentation/paride.txt.
|
||||
|
||||
pirq= [SMP,APIC] Manual mp-table setup
|
||||
See Documentation/i386/IO-APIC.txt.
|
||||
See Documentation/x86/i386/IO-APIC.txt.
|
||||
|
||||
plip= [PPT,NET] Parallel port network link
|
||||
Format: { parport<nr> | timid | 0 }
|
||||
|
@ -2343,7 +2343,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
|||
See Documentation/fb/modedb.txt.
|
||||
|
||||
vga= [BOOT,X86-32] Select a particular video mode
|
||||
See Documentation/i386/boot.txt and
|
||||
See Documentation/x86/i386/boot.txt and
|
||||
Documentation/svga.txt.
|
||||
Use vga=ask for menu.
|
||||
This is actually a boot loader parameter; the value is
|
||||
|
|
|
@ -1,5 +1,5 @@
|
|||
# This creates the demonstration utility "lguest" which runs a Linux guest.
|
||||
CFLAGS:=-Wall -Wmissing-declarations -Wmissing-prototypes -O3 -I../../include
|
||||
CFLAGS:=-Wall -Wmissing-declarations -Wmissing-prototypes -O3 -I../../include -I../../arch/x86/include
|
||||
LDLIBS:=-lz
|
||||
|
||||
all: lguest
|
||||
|
|
|
@ -44,7 +44,7 @@
|
|||
#include "linux/virtio_console.h"
|
||||
#include "linux/virtio_rng.h"
|
||||
#include "linux/virtio_ring.h"
|
||||
#include "asm-x86/bootparam.h"
|
||||
#include "asm/bootparam.h"
|
||||
/*L:110 We can ignore the 39 include files we need for this program, but I do
|
||||
* want to draw attention to the use of kernel-style types.
|
||||
*
|
||||
|
@ -402,7 +402,7 @@ static unsigned long load_bzimage(int fd)
|
|||
void *p = from_guest_phys(0x100000);
|
||||
|
||||
/* Go back to the start of the file and read the header. It should be
|
||||
* a Linux boot header (see Documentation/i386/boot.txt) */
|
||||
* a Linux boot header (see Documentation/x86/i386/boot.txt) */
|
||||
lseek(fd, 0, SEEK_SET);
|
||||
read(fd, &boot, sizeof(boot));
|
||||
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
ifenslave
|
|
@ -60,6 +60,6 @@ Tobias Ringstrom <tori@unhappy.mine.nu> : Current Maintainer
|
|||
Contributors:
|
||||
|
||||
Marcelo Tosatti <marcelo@conectiva.com.br>
|
||||
Alan Cox <alan@redhat.com>
|
||||
Alan Cox <alan@lxorguk.ukuu.org.uk>
|
||||
Jeff Garzik <jgarzik@pobox.com>
|
||||
Vojtech Pavlik <vojtech@suse.cz>
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
crc32hash
|
|
@ -4,8 +4,6 @@ sched-arch.txt
|
|||
- CPU Scheduler implementation hints for architecture specific code.
|
||||
sched-coding.txt
|
||||
- reference for various scheduler-related methods in the O(1) scheduler.
|
||||
sched-design.txt
|
||||
- goals, design and implementation of the Linux O(1) scheduler.
|
||||
sched-design-CFS.txt
|
||||
- goals, design and implementation of the Complete Fair Scheduler.
|
||||
sched-domains.txt
|
||||
|
|
|
@ -92,7 +92,7 @@ other HZ detail. Thus the CFS scheduler has no notion of "timeslices" in the
|
|||
way the previous scheduler had, and has no heuristics whatsoever. There is
|
||||
only one central tunable (you have to switch on CONFIG_SCHED_DEBUG):
|
||||
|
||||
/proc/sys/kernel/sched_granularity_ns
|
||||
/proc/sys/kernel/sched_min_granularity_ns
|
||||
|
||||
which can be used to tune the scheduler from "desktop" (i.e., low latencies) to
|
||||
"server" (i.e., good batching) workloads. It defaults to a setting suitable
|
||||
|
|
|
@ -128,7 +128,7 @@ Supported Cards/Chipsets
|
|||
|
||||
People
|
||||
-------------------------
|
||||
Alan Cox <alan@redhat.com>
|
||||
Alan Cox <alan@lxorguk.ukuu.org.uk>
|
||||
Christoph Hellwig <hch@infradead.org> (updates for new-style PCI probing and SCSI host registration,
|
||||
small cleanups/fixes)
|
||||
Matt Domsch <matt_domsch@dell.com> (revision ioctl, adapter messages)
|
||||
|
|
|
@ -0,0 +1,2 @@
|
|||
spidev_fdx
|
||||
spidev_test
|
|
@ -12,6 +12,7 @@ Rules on what kind of patches are accepted, and which ones are not, into the
|
|||
marked CONFIG_BROKEN), an oops, a hang, data corruption, a real
|
||||
security issue, or some "oh, that's not good" issue. In short, something
|
||||
critical.
|
||||
- New device IDs and quirks are also accepted.
|
||||
- No "theoretical race condition" issues, unless an explanation of how the
|
||||
race can be exploited is also provided.
|
||||
- It cannot contain any "trivial" fixes in it (spelling changes,
|
||||
|
|
|
@ -363,11 +363,21 @@ tainted:
|
|||
Non-zero if the kernel has been tainted. Numeric values, which
|
||||
can be ORed together:
|
||||
|
||||
1 - A module with a non-GPL license has been loaded, this
|
||||
includes modules with no license.
|
||||
Set by modutils >= 2.4.9 and module-init-tools.
|
||||
2 - A module was force loaded by insmod -f.
|
||||
Set by modutils >= 2.4.9 and module-init-tools.
|
||||
4 - Unsafe SMP processors: SMP with CPUs not designed for SMP.
|
||||
64 - A module from drivers/staging was loaded.
|
||||
1 - A module with a non-GPL license has been loaded, this
|
||||
includes modules with no license.
|
||||
Set by modutils >= 2.4.9 and module-init-tools.
|
||||
2 - A module was force loaded by insmod -f.
|
||||
Set by modutils >= 2.4.9 and module-init-tools.
|
||||
4 - Unsafe SMP processors: SMP with CPUs not designed for SMP.
|
||||
8 - A module was forcibly unloaded from the system by rmmod -f.
|
||||
16 - A hardware machine check error occurred on the system.
|
||||
32 - A bad page was discovered on the system.
|
||||
64 - The user has asked that the system be marked "tainted". This
|
||||
could be because they are running software that directly modifies
|
||||
the hardware, or for other reasons.
|
||||
128 - The system has died.
|
||||
256 - The ACPI DSDT has been overridden with one supplied by the user
|
||||
instead of using the one provided by the hardware.
|
||||
512 - A kernel warning has occurred.
|
||||
1024 - A module from drivers/staging was loaded.
|
||||
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
v4lgrab
|
|
@ -3,7 +3,7 @@ Contributors to bttv:
|
|||
Michael Chu <mmchu@pobox.com>
|
||||
AverMedia fix and more flexible card recognition
|
||||
|
||||
Alan Cox <alan@redhat.com>
|
||||
Alan Cox <alan@lxorguk.ukuu.org.uk>
|
||||
Video4Linux interface and 2.1.x kernel adaptation
|
||||
|
||||
Chris Kleitsch
|
||||
|
|
|
@ -0,0 +1 @@
|
|||
slabinfo
|
|
@ -0,0 +1,2 @@
|
|||
watchdog-simple
|
||||
watchdog-test
|
|
@ -35,7 +35,7 @@ APICs
|
|||
|
||||
nolapic Don't use the local APIC (alias for i386 compatibility)
|
||||
|
||||
pirq=... See Documentation/i386/IO-APIC.txt
|
||||
pirq=... See Documentation/x86/i386/IO-APIC.txt
|
||||
|
||||
noapictimer Don't set up the APIC timer
|
||||
|
||||
|
@ -139,7 +139,7 @@ Non Executable Mappings
|
|||
SMP
|
||||
|
||||
additional_cpus=NUM Allow NUM more CPUs for hotplug
|
||||
(defaults are specified by the BIOS, see Documentation/x86_64/cpu-hotplug-spec)
|
||||
(defaults are specified by the BIOS, see Documentation/x86/x86_64/cpu-hotplug-spec)
|
||||
|
||||
NUMA
|
||||
|
||||
|
|
|
@ -10,7 +10,7 @@ amount of system memory that are available to a certain class of tasks.
|
|||
For more information on the features of cpusets, see Documentation/cpusets.txt.
|
||||
There are a number of different configurations you can use for your needs. For
|
||||
more information on the numa=fake command line option and its various ways of
|
||||
configuring fake nodes, see Documentation/x86_64/boot-options.txt.
|
||||
configuring fake nodes, see Documentation/x86/x86_64/boot-options.txt.
|
||||
|
||||
For the purposes of this introduction, we'll assume a very primitive NUMA
|
||||
emulation setup of "numa=fake=4*512,". This will split our system memory into
|
||||
|
|
35
MAINTAINERS
35
MAINTAINERS
|
@ -347,7 +347,7 @@ S: Maintained
|
|||
ALI1563 I2C DRIVER
|
||||
P: Rudolf Marek
|
||||
M: r.marek@assembler.cz
|
||||
L: i2c@lm-sensors.org
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
ALPHA PORT
|
||||
|
@ -610,6 +610,11 @@ P: Philipp Zabel
|
|||
M: philipp.zabel@gmail.com
|
||||
S: Maintained
|
||||
|
||||
ARM/NEC MOBILEPRO 900/c MACHINE SUPPORT
|
||||
P: Michael Petchkovsky
|
||||
M: mkpetch@internode.on.net
|
||||
S: Maintained
|
||||
|
||||
ARM/TOSA MACHINE SUPPORT
|
||||
P: Dmitry Baryshkov
|
||||
M: dbaryshkov@gmail.com
|
||||
|
@ -1749,7 +1754,7 @@ FREESCALE I2C CPM DRIVER
|
|||
P: Jochen Friedrich
|
||||
M: jochen@scram.de
|
||||
L: linuxppc-dev@ozlabs.org
|
||||
L: i2c@lm-sensors.org
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
FREESCALE SOC FS_ENET DRIVER
|
||||
|
@ -2022,7 +2027,7 @@ S: Maintained
|
|||
I2C/SMBUS STUB DRIVER
|
||||
P: Mark M. Hoffman
|
||||
M: mhoffman@lightlink.com
|
||||
L: i2c@lm-sensors.org
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
I2C SUBSYSTEM
|
||||
|
@ -2030,14 +2035,14 @@ P: Jean Delvare (PC drivers, core)
|
|||
M: khali@linux-fr.org
|
||||
P: Ben Dooks (embedded platforms)
|
||||
M: ben-linux@fluff.org
|
||||
L: i2c@lm-sensors.org
|
||||
L: linux-i2c@vger.kernel.org
|
||||
T: quilt http://khali.linux-fr.org/devel/linux-2.6/jdelvare-i2c/
|
||||
S: Maintained
|
||||
|
||||
I2C-TINY-USB DRIVER
|
||||
P: Till Harbaum
|
||||
M: till@harbaum.org
|
||||
L: i2c@lm-sensors.org
|
||||
L: linux-i2c@vger.kernel.org
|
||||
T: http://www.harbaum.org/till/i2c_tiny_usb
|
||||
S: Maintained
|
||||
|
||||
|
@ -2701,6 +2706,16 @@ M: matthew@wil.cx
|
|||
L: linux-scsi@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
LTP (Linux Test Project)
|
||||
P: Subrata Modak
|
||||
M: subrata@linux.vnet.ibm.com
|
||||
P: Mike Frysinger
|
||||
M: vapier@gentoo.org
|
||||
L: ltp-list@lists.sourceforge.net (subscribers-only)
|
||||
W: http://ltp.sourceforge.net/
|
||||
T: git kernel.org/pub/scm/linux/kernel/git/galak/ltp.git
|
||||
S: Maintained
|
||||
|
||||
M32R ARCHITECTURE
|
||||
P: Hirokazu Takata
|
||||
M: takata@linux-m32r.org
|
||||
|
@ -3143,7 +3158,7 @@ S: Maintained
|
|||
OPENCORES I2C BUS DRIVER
|
||||
P: Peter Korsgaard
|
||||
M: jacmet@sunsite.dk
|
||||
L: i2c@lm-sensors.org
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
OPROFILE
|
||||
|
@ -3190,7 +3205,7 @@ S: Maintained
|
|||
PA SEMI SMBUS DRIVER
|
||||
P: Olof Johansson
|
||||
M: olof@lixom.net
|
||||
L: i2c@lm-sensors.org
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
PANASONIC LAPTOP ACPI EXTRAS DRIVER
|
||||
|
@ -3335,7 +3350,7 @@ S: Maintained
|
|||
PNXxxxx I2C DRIVER
|
||||
P: Vitaly Wool
|
||||
M: vitalywool@gmail.com
|
||||
L: i2c@lm-sensors.org
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
PPP PROTOCOL DRIVERS AND COMPRESSORS
|
||||
|
@ -3799,7 +3814,7 @@ S: Maintained
|
|||
SIS 96X I2C/SMBUS DRIVER
|
||||
P: Mark M. Hoffman
|
||||
M: mhoffman@lightlink.com
|
||||
L: i2c@lm-sensors.org
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
SIS FRAMEBUFFER DRIVER
|
||||
|
@ -4546,7 +4561,7 @@ S: Maintained
|
|||
VIAPRO SMBUS DRIVER
|
||||
P: Jean Delvare
|
||||
M: khali@linux-fr.org
|
||||
L: i2c@lm-sensors.org
|
||||
L: linux-i2c@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
VIA UNICHROME(PRO)/CHROME9 FRAMEBUFFER DRIVER
|
||||
|
|
10
Makefile
10
Makefile
|
@ -536,7 +536,7 @@ KBUILD_CFLAGS += -g
|
|||
KBUILD_AFLAGS += -gdwarf-2
|
||||
endif
|
||||
|
||||
ifdef CONFIG_FTRACE
|
||||
ifdef CONFIG_FUNCTION_TRACER
|
||||
KBUILD_CFLAGS += -pg
|
||||
endif
|
||||
|
||||
|
@ -961,6 +961,7 @@ export CPPFLAGS_vmlinux.lds += -P -C -U$(ARCH)
|
|||
|
||||
# The asm symlink changes when $(ARCH) changes.
|
||||
# Detect this and ask user to run make mrproper
|
||||
# If asm is a stale symlink (point to dir that does not exist) remove it
|
||||
define check-symlink
|
||||
set -e; \
|
||||
if [ -L include/asm ]; then \
|
||||
|
@ -970,6 +971,10 @@ define check-symlink
|
|||
echo " set ARCH or save .config and run 'make mrproper' to fix it"; \
|
||||
exit 1; \
|
||||
fi; \
|
||||
test -e $$asmlink || rm include/asm; \
|
||||
elif [ -d include/asm ]; then \
|
||||
echo "ERROR: $@ is a directory but a symlink was expected";\
|
||||
exit 1; \
|
||||
fi
|
||||
endef
|
||||
|
||||
|
@ -1431,7 +1436,8 @@ ALLSOURCE_ARCHS := $(SRCARCH)
|
|||
define find-sources
|
||||
( for arch in $(ALLSOURCE_ARCHS) ; do \
|
||||
find $(__srctree)arch/$${arch} $(RCS_FIND_IGNORE) \
|
||||
-name $1 -print; \
|
||||
-wholename $(__srctree)arch/$${arch}/include/asm -type d -prune \
|
||||
-o -name $1 -print; \
|
||||
done ; \
|
||||
find $(__srctree)security/selinux/include $(RCS_FIND_IGNORE) \
|
||||
-name $1 -print; \
|
||||
|
|
|
@ -16,8 +16,7 @@ config ARM
|
|||
select HAVE_ARCH_KGDB
|
||||
select HAVE_KPROBES if (!XIP_KERNEL)
|
||||
select HAVE_KRETPROBES if (HAVE_KPROBES)
|
||||
select HAVE_FTRACE if (!XIP_KERNEL)
|
||||
select HAVE_DYNAMIC_FTRACE if (HAVE_FTRACE)
|
||||
select HAVE_FUNCTION_TRACER if (!XIP_KERNEL)
|
||||
select HAVE_GENERIC_DMA_COHERENT
|
||||
help
|
||||
The ARM series is a line of low-power-consumption RISC chip designs
|
||||
|
|
|
@ -70,7 +70,7 @@ SEDFLAGS = s/TEXT_START/$(ZTEXTADDR)/;s/BSS_START/$(ZBSSADDR)/
|
|||
targets := vmlinux vmlinux.lds piggy.gz piggy.o font.o font.c \
|
||||
head.o misc.o $(OBJS)
|
||||
|
||||
ifeq ($(CONFIG_FTRACE),y)
|
||||
ifeq ($(CONFIG_FUNCTION_TRACER),y)
|
||||
ORIG_CFLAGS := $(KBUILD_CFLAGS)
|
||||
KBUILD_CFLAGS = $(subst -pg, , $(ORIG_CFLAGS))
|
||||
endif
|
||||
|
|
|
@ -54,11 +54,13 @@
|
|||
/*
|
||||
* Prototypes
|
||||
*/
|
||||
#ifdef CONFIG_PM
|
||||
static int sharpsl_off_charge_battery(void);
|
||||
static int sharpsl_check_battery_temp(void);
|
||||
static int sharpsl_check_battery_voltage(void);
|
||||
static int sharpsl_ac_check(void);
|
||||
static int sharpsl_fatal_check(void);
|
||||
#endif
|
||||
static int sharpsl_check_battery_temp(void);
|
||||
static int sharpsl_ac_check(void);
|
||||
static int sharpsl_average_value(int ad);
|
||||
static void sharpsl_average_clear(void);
|
||||
static void sharpsl_charge_toggle(struct work_struct *private_);
|
||||
|
@ -424,6 +426,7 @@ static int sharpsl_check_battery_temp(void)
|
|||
return 0;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static int sharpsl_check_battery_voltage(void)
|
||||
{
|
||||
int val, i, buff[5];
|
||||
|
@ -455,6 +458,7 @@ static int sharpsl_check_battery_voltage(void)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
static int sharpsl_ac_check(void)
|
||||
{
|
||||
|
@ -586,8 +590,6 @@ static int corgi_pxa_pm_enter(suspend_state_t state)
|
|||
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
|
||||
/*
|
||||
* Check for fatal battery errors
|
||||
|
@ -738,7 +740,10 @@ static int sharpsl_off_charge_battery(void)
|
|||
}
|
||||
}
|
||||
}
|
||||
|
||||
#else
|
||||
#define sharpsl_pm_suspend NULL
|
||||
#define sharpsl_pm_resume NULL
|
||||
#endif
|
||||
|
||||
static ssize_t battery_percentage_show(struct device *dev, struct device_attribute *attr, char *buf)
|
||||
{
|
||||
|
@ -768,10 +773,12 @@ static void sharpsl_apm_get_power_status(struct apm_power_info *info)
|
|||
info->battery_life = sharpsl_pm.battstat.mainbat_percent;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
static struct platform_suspend_ops sharpsl_pm_ops = {
|
||||
.enter = corgi_pxa_pm_enter,
|
||||
.valid = suspend_valid_only_mem,
|
||||
};
|
||||
#endif
|
||||
|
||||
static int __init sharpsl_pm_probe(struct platform_device *pdev)
|
||||
{
|
||||
|
@ -802,7 +809,9 @@ static int __init sharpsl_pm_probe(struct platform_device *pdev)
|
|||
|
||||
apm_get_power_status = sharpsl_apm_get_power_status;
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
suspend_set_ops(&sharpsl_pm_ops);
|
||||
#endif
|
||||
|
||||
mod_timer(&sharpsl_pm.ac_timer, jiffies + msecs_to_jiffies(250));
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef _ASM_ARM_FTRACE
|
||||
#define _ASM_ARM_FTRACE
|
||||
|
||||
#ifdef CONFIG_FTRACE
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
#define MCOUNT_ADDR ((long)(mcount))
|
||||
#define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
|
||||
|
||||
|
|
|
@ -183,6 +183,6 @@ EXPORT_SYMBOL(_find_next_bit_be);
|
|||
|
||||
EXPORT_SYMBOL(copy_page);
|
||||
|
||||
#ifdef CONFIG_FTRACE
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
EXPORT_SYMBOL(mcount);
|
||||
#endif
|
||||
|
|
|
@ -101,7 +101,7 @@ ENDPROC(ret_from_fork)
|
|||
#undef CALL
|
||||
#define CALL(x) .long x
|
||||
|
||||
#ifdef CONFIG_FTRACE
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
ENTRY(mcount)
|
||||
stmdb sp!, {r0-r3, lr}
|
||||
|
@ -149,7 +149,7 @@ trace:
|
|||
ftrace_stub:
|
||||
mov pc, lr
|
||||
|
||||
#endif /* CONFIG_FTRACE */
|
||||
#endif /* CONFIG_FUNCTION_TRACER */
|
||||
|
||||
/*=============================================================================
|
||||
* SWI handler
|
||||
|
|
|
@ -95,19 +95,6 @@ int ftrace_update_ftrace_func(ftrace_func_t func)
|
|||
return ret;
|
||||
}
|
||||
|
||||
int ftrace_mcount_set(unsigned long *data)
|
||||
{
|
||||
unsigned long pc, old;
|
||||
unsigned long *addr = data;
|
||||
unsigned char *new;
|
||||
|
||||
pc = (unsigned long)&mcount_call;
|
||||
memcpy(&old, &mcount_call, MCOUNT_INSN_SIZE);
|
||||
new = ftrace_call_replace(pc, *addr);
|
||||
*addr = ftrace_modify_code(pc, (unsigned char *)&old, new);
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* run from kstop_machine */
|
||||
int __init ftrace_dyn_arch_init(void *data)
|
||||
{
|
||||
|
|
|
@ -165,6 +165,7 @@ static struct at91_mmc_data __initdata afeb9260_mmc_data = {
|
|||
static struct i2c_board_info __initdata afeb9260_i2c_devices[] = {
|
||||
{
|
||||
I2C_BOARD_INFO("fm3130", 0x68),
|
||||
}, {
|
||||
I2C_BOARD_INFO("24c64", 0x50),
|
||||
},
|
||||
};
|
||||
|
|
|
@ -13,6 +13,7 @@
|
|||
#ifndef __ASM_ARCH_AT91RM9200_GPIO_H
|
||||
#define __ASM_ARCH_AT91RM9200_GPIO_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <asm/irq.h>
|
||||
|
||||
#define PIN_BASE NR_AIC_IRQS
|
||||
|
@ -220,6 +221,7 @@ static inline int gpio_request(unsigned gpio, const char *label)
|
|||
|
||||
static inline void gpio_free(unsigned gpio)
|
||||
{
|
||||
might_sleep();
|
||||
}
|
||||
|
||||
extern int gpio_direction_input(unsigned gpio);
|
||||
|
|
|
@ -26,6 +26,7 @@
|
|||
#include <linux/serial_core.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/mm.h>
|
||||
#include <linux/dma-mapping.h>
|
||||
#include <linux/time.h>
|
||||
#include <linux/timex.h>
|
||||
#include <linux/delay.h>
|
||||
|
@ -449,12 +450,13 @@ static struct resource ep93xx_ohci_resources[] = {
|
|||
},
|
||||
};
|
||||
|
||||
|
||||
static struct platform_device ep93xx_ohci_device = {
|
||||
.name = "ep93xx-ohci",
|
||||
.id = -1,
|
||||
.dev = {
|
||||
.dma_mask = (void *)0xffffffff,
|
||||
.coherent_dma_mask = 0xffffffff,
|
||||
.dma_mask = &ep93xx_ohci_device.dev.coherent_dma_mask,
|
||||
.coherent_dma_mask = DMA_BIT_MASK(32),
|
||||
},
|
||||
.num_resources = ARRAY_SIZE(ep93xx_ohci_resources),
|
||||
.resource = ep93xx_ohci_resources,
|
||||
|
|
|
@ -1,5 +1,6 @@
|
|||
#ifndef _IMX_GPIO_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <mach/imx-regs.h>
|
||||
|
||||
#define IMX_GPIO_ALLOC_MODE_NORMAL 0
|
||||
|
@ -63,6 +64,8 @@ static inline int gpio_request(unsigned gpio, const char *label)
|
|||
|
||||
static inline void gpio_free(unsigned gpio)
|
||||
{
|
||||
might_sleep();
|
||||
|
||||
imx_gpio_free(gpio);
|
||||
}
|
||||
|
||||
|
|
|
@ -25,6 +25,7 @@
|
|||
#ifndef __ASM_ARCH_IXP4XX_GPIO_H
|
||||
#define __ASM_ARCH_IXP4XX_GPIO_H
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
static inline int gpio_request(unsigned gpio, const char *label)
|
||||
|
@ -34,6 +35,8 @@ static inline int gpio_request(unsigned gpio, const char *label)
|
|||
|
||||
static inline void gpio_free(unsigned gpio)
|
||||
{
|
||||
might_sleep();
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
|
|
|
@ -11,6 +11,8 @@
|
|||
#ifndef __ASM_ARCH_GPIO_H_
|
||||
#define __ASM_ARCH_GPIO_H_
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
||||
#define KS8695_GPIO_0 0
|
||||
#define KS8695_GPIO_1 1
|
||||
#define KS8695_GPIO_2 2
|
||||
|
@ -74,6 +76,7 @@ static inline int gpio_request(unsigned int pin, const char *label)
|
|||
|
||||
static inline void gpio_free(unsigned int pin)
|
||||
{
|
||||
might_sleep();
|
||||
}
|
||||
|
||||
#endif
|
||||
|
|
|
@ -35,6 +35,8 @@
|
|||
#include <mach/imx-uart.h>
|
||||
#include <mach/iomux-mx3.h>
|
||||
|
||||
#include "devices.h"
|
||||
|
||||
/*!
|
||||
* @file mx31ads.c
|
||||
*
|
||||
|
|
|
@ -91,12 +91,12 @@ static struct map_desc pcm037_io_desc[] __initdata = {
|
|||
.virtual = AIPS1_BASE_ADDR_VIRT,
|
||||
.pfn = __phys_to_pfn(AIPS1_BASE_ADDR),
|
||||
.length = AIPS1_SIZE,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE_NONSHARED
|
||||
}, {
|
||||
.virtual = AIPS2_BASE_ADDR_VIRT,
|
||||
.pfn = __phys_to_pfn(AIPS2_BASE_ADDR),
|
||||
.length = AIPS2_SIZE,
|
||||
.type = MT_DEVICE
|
||||
.type = MT_DEVICE_NONSHARED
|
||||
},
|
||||
};
|
||||
|
||||
|
|
|
@ -8,6 +8,7 @@
|
|||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/compiler.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/spinlock.h>
|
||||
|
@ -63,6 +64,7 @@ EXPORT_SYMBOL(gpio_request);
|
|||
|
||||
void gpio_free(unsigned gpio)
|
||||
{
|
||||
might_sleep();
|
||||
clear_bit(gpio, gpiores);
|
||||
return;
|
||||
}
|
||||
|
|
|
@ -165,6 +165,8 @@ EXPORT_SYMBOL(gpio_request);
|
|||
|
||||
void gpio_free(unsigned pin)
|
||||
{
|
||||
might_sleep();
|
||||
|
||||
if (pin >= GPIO_MAX || !test_bit(pin, gpio_valid)) {
|
||||
pr_debug("%s: invalid GPIO %d\n", __func__, pin);
|
||||
return;
|
||||
|
|
|
@ -204,7 +204,9 @@ static struct sharpsl_charger_machinfo corgi_pm_machinfo = {
|
|||
.read_devdata = corgipm_read_devdata,
|
||||
.charger_wakeup = corgi_charger_wakeup,
|
||||
.should_wakeup = corgi_should_wakeup,
|
||||
#ifdef CONFIG_BACKLIGHT_CORGI
|
||||
#if defined(CONFIG_LCD_CORGI)
|
||||
.backlight_limit = corgi_lcd_limit_intensity,
|
||||
#elif defined(CONFIG_BACKLIGHT_CORGI)
|
||||
.backlight_limit = corgibl_limit_intensity,
|
||||
#endif
|
||||
.charge_on_volt = SHARPSL_CHARGE_ON_VOLT,
|
||||
|
|
|
@ -26,6 +26,7 @@ struct corgits_machinfo {
|
|||
* SharpSL Backlight
|
||||
*/
|
||||
extern void corgibl_limit_intensity(int limit);
|
||||
extern void corgi_lcd_limit_intensity(int limit);
|
||||
|
||||
|
||||
/*
|
||||
|
|
|
@ -385,6 +385,16 @@ static void __init spitz_init_spi(void)
|
|||
if (err)
|
||||
goto err_free_2;
|
||||
|
||||
err = gpio_direction_output(SPITZ_GPIO_ADS7846_CS, 1);
|
||||
if (err)
|
||||
goto err_free_3;
|
||||
err = gpio_direction_output(SPITZ_GPIO_LCDCON_CS, 1);
|
||||
if (err)
|
||||
goto err_free_3;
|
||||
err = gpio_direction_output(SPITZ_GPIO_MAX1111_CS, 1);
|
||||
if (err)
|
||||
goto err_free_3;
|
||||
|
||||
if (machine_is_akita()) {
|
||||
spitz_lcdcon_info.gpio_backlight_cont = AKITA_GPIO_BACKLIGHT_CONT;
|
||||
spitz_lcdcon_info.gpio_backlight_on = AKITA_GPIO_BACKLIGHT_ON;
|
||||
|
@ -394,6 +404,8 @@ static void __init spitz_init_spi(void)
|
|||
spi_register_board_info(ARRAY_AND_SIZE(spitz_spi_devices));
|
||||
return;
|
||||
|
||||
err_free_3:
|
||||
gpio_free(SPITZ_GPIO_MAX1111_CS);
|
||||
err_free_2:
|
||||
gpio_free(SPITZ_GPIO_LCDCON_CS);
|
||||
err_free_1:
|
||||
|
|
|
@ -198,7 +198,9 @@ struct sharpsl_charger_machinfo spitz_pm_machinfo = {
|
|||
.read_devdata = spitzpm_read_devdata,
|
||||
.charger_wakeup = spitz_charger_wakeup,
|
||||
.should_wakeup = spitz_should_wakeup,
|
||||
#ifdef CONFIG_BACKLIGHT_CORGI
|
||||
#if defined(CONFIG_LCD_CORGI)
|
||||
.backlight_limit = corgi_lcd_limit_intensity,
|
||||
#elif defined(CONFIG_BACKLIGHT_CORGI)
|
||||
.backlight_limit = corgibl_limit_intensity,
|
||||
#endif
|
||||
.charge_on_volt = SHARPSL_CHARGE_ON_VOLT,
|
||||
|
|
|
@ -349,7 +349,7 @@ ENTRY(cpu_xsc3_switch_mm)
|
|||
cpu_xsc3_mt_table:
|
||||
.long 0x00 @ L_PTE_MT_UNCACHED
|
||||
.long PTE_EXT_TEX(1) @ L_PTE_MT_BUFFERABLE
|
||||
.long PTE_CACHEABLE @ L_PTE_MT_WRITETHROUGH
|
||||
.long PTE_EXT_TEX(5) | PTE_CACHEABLE @ L_PTE_MT_WRITETHROUGH
|
||||
.long PTE_CACHEABLE | PTE_BUFFERABLE @ L_PTE_MT_WRITEBACK
|
||||
.long PTE_EXT_TEX(1) | PTE_BUFFERABLE @ L_PTE_MT_DEV_SHARED
|
||||
.long 0x00 @ unused
|
||||
|
|
|
@ -188,7 +188,7 @@ static int mxc_gpio_get(struct gpio_chip *chip, unsigned offset)
|
|||
struct mxc_gpio_port *port =
|
||||
container_of(chip, struct mxc_gpio_port, chip);
|
||||
|
||||
return (__raw_readl(port->base + GPIO_DR) >> offset) & 1;
|
||||
return (__raw_readl(port->base + GPIO_PSR) >> offset) & 1;
|
||||
}
|
||||
|
||||
static int mxc_gpio_direction_input(struct gpio_chip *chip, unsigned offset)
|
||||
|
|
|
@ -14,6 +14,26 @@
|
|||
/* Allow IO space to be anywhere in the memory */
|
||||
#define IO_SPACE_LIMIT 0xffffffff
|
||||
|
||||
#ifdef CONFIG_ARCH_MX3
|
||||
#define __arch_ioremap __mx3_ioremap
|
||||
#define __arch_iounmap __iounmap
|
||||
|
||||
static inline void __iomem *
|
||||
__mx3_ioremap(unsigned long phys_addr, size_t size, unsigned int mtype)
|
||||
{
|
||||
if (mtype == MT_DEVICE) {
|
||||
/* Access all peripherals below 0x80000000 as nonshared device
|
||||
* but leave l2cc alone.
|
||||
*/
|
||||
if ((phys_addr < 0x80000000) && ((phys_addr < L2CC_BASE_ADDR) ||
|
||||
(phys_addr >= L2CC_BASE_ADDR + L2CC_SIZE)))
|
||||
mtype = MT_DEVICE_NONSHARED;
|
||||
}
|
||||
|
||||
return __arm_ioremap(phys_addr, size, mtype);
|
||||
}
|
||||
#endif
|
||||
|
||||
/* io address mapping macro */
|
||||
#define __io(a) ((void __iomem *)(a))
|
||||
|
||||
|
|
|
@ -11,6 +11,5 @@ extern int force_iommu, no_iommu;
|
|||
extern int iommu_detected;
|
||||
extern void iommu_dma_init(void);
|
||||
extern void machvec_init(const char *name);
|
||||
extern int forbid_dac;
|
||||
|
||||
#endif
|
||||
|
|
|
@ -365,7 +365,8 @@ struct kvm_vcpu_arch {
|
|||
long itc_offset;
|
||||
unsigned long itc_check;
|
||||
unsigned long timer_check;
|
||||
unsigned long timer_pending;
|
||||
unsigned int timer_pending;
|
||||
unsigned int timer_fired;
|
||||
|
||||
unsigned long vrr[8];
|
||||
unsigned long ibr[8];
|
||||
|
@ -417,6 +418,9 @@ struct kvm_arch {
|
|||
struct list_head assigned_dev_head;
|
||||
struct dmar_domain *intel_iommu_domain;
|
||||
struct hlist_head irq_ack_notifier_list;
|
||||
|
||||
unsigned long irq_sources_bitmap;
|
||||
unsigned long irq_states[KVM_IOAPIC_NUM_PINS];
|
||||
};
|
||||
|
||||
union cpuid3_t {
|
||||
|
|
|
@ -89,13 +89,6 @@ int iommu_dma_supported(struct device *dev, u64 mask)
|
|||
{
|
||||
struct dma_mapping_ops *ops = get_dma_ops(dev);
|
||||
|
||||
#ifdef CONFIG_PCI
|
||||
if (mask > 0xffffffff && forbid_dac > 0) {
|
||||
dev_info(dev, "Disallowing DAC for device\n");
|
||||
return 0;
|
||||
}
|
||||
#endif
|
||||
|
||||
if (ops->dma_supported_op)
|
||||
return ops->dma_supported_op(dev, mask);
|
||||
|
||||
|
|
|
@ -29,13 +29,18 @@ define cmd_offsets
|
|||
echo ""; \
|
||||
echo "#endif" ) > $@
|
||||
endef
|
||||
|
||||
# We use internal rules to avoid the "is up to date" message from make
|
||||
arch/ia64/kvm/asm-offsets.s: arch/ia64/kvm/asm-offsets.c
|
||||
arch/ia64/kvm/asm-offsets.s: arch/ia64/kvm/asm-offsets.c \
|
||||
$(wildcard $(srctree)/arch/ia64/include/asm/*.h)\
|
||||
$(wildcard $(srctree)/include/linux/*.h)
|
||||
$(call if_changed_dep,cc_s_c)
|
||||
|
||||
$(obj)/$(offsets-file): arch/ia64/kvm/asm-offsets.s
|
||||
$(call cmd,offsets)
|
||||
|
||||
FORCE : $(obj)/$(offsets-file)
|
||||
|
||||
#
|
||||
# Makefile for Kernel-based Virtual Machine module
|
||||
#
|
||||
|
@ -53,7 +58,6 @@ endif
|
|||
kvm-objs := $(common-objs) kvm-ia64.o kvm_fw.o
|
||||
obj-$(CONFIG_KVM) += kvm.o
|
||||
|
||||
FORCE : $(obj)/$(offsets-file)
|
||||
EXTRA_CFLAGS_vcpu.o += -mfixed-range=f2-f5,f12-f127
|
||||
kvm-intel-objs = vmm.o vmm_ivt.o trampoline.o vcpu.o optvfault.o mmio.o \
|
||||
vtlb.o process.o
|
||||
|
|
|
@ -385,6 +385,7 @@ static int handle_global_purge(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
|||
struct kvm *kvm = vcpu->kvm;
|
||||
struct call_data call_data;
|
||||
int i;
|
||||
|
||||
call_data.ptc_g_data = p->u.ptc_g_data;
|
||||
|
||||
for (i = 0; i < KVM_MAX_VCPUS; i++) {
|
||||
|
@ -418,33 +419,41 @@ int kvm_emulate_halt(struct kvm_vcpu *vcpu)
|
|||
ktime_t kt;
|
||||
long itc_diff;
|
||||
unsigned long vcpu_now_itc;
|
||||
|
||||
unsigned long expires;
|
||||
struct hrtimer *p_ht = &vcpu->arch.hlt_timer;
|
||||
unsigned long cyc_per_usec = local_cpu_data->cyc_per_usec;
|
||||
struct vpd *vpd = to_host(vcpu->kvm, vcpu->arch.vpd);
|
||||
|
||||
vcpu_now_itc = ia64_getreg(_IA64_REG_AR_ITC) + vcpu->arch.itc_offset;
|
||||
|
||||
if (time_after(vcpu_now_itc, vpd->itm)) {
|
||||
vcpu->arch.timer_check = 1;
|
||||
return 1;
|
||||
}
|
||||
itc_diff = vpd->itm - vcpu_now_itc;
|
||||
if (itc_diff < 0)
|
||||
itc_diff = -itc_diff;
|
||||
|
||||
expires = div64_u64(itc_diff, cyc_per_usec);
|
||||
kt = ktime_set(0, 1000 * expires);
|
||||
vcpu->arch.ht_active = 1;
|
||||
hrtimer_start(p_ht, kt, HRTIMER_MODE_ABS);
|
||||
|
||||
if (irqchip_in_kernel(vcpu->kvm)) {
|
||||
|
||||
vcpu_now_itc = ia64_getreg(_IA64_REG_AR_ITC) + vcpu->arch.itc_offset;
|
||||
|
||||
if (time_after(vcpu_now_itc, vpd->itm)) {
|
||||
vcpu->arch.timer_check = 1;
|
||||
return 1;
|
||||
}
|
||||
itc_diff = vpd->itm - vcpu_now_itc;
|
||||
if (itc_diff < 0)
|
||||
itc_diff = -itc_diff;
|
||||
|
||||
expires = div64_u64(itc_diff, cyc_per_usec);
|
||||
kt = ktime_set(0, 1000 * expires);
|
||||
|
||||
down_read(&vcpu->kvm->slots_lock);
|
||||
vcpu->arch.ht_active = 1;
|
||||
hrtimer_start(p_ht, kt, HRTIMER_MODE_ABS);
|
||||
|
||||
vcpu->arch.mp_state = KVM_MP_STATE_HALTED;
|
||||
kvm_vcpu_block(vcpu);
|
||||
hrtimer_cancel(p_ht);
|
||||
vcpu->arch.ht_active = 0;
|
||||
|
||||
if (test_and_clear_bit(KVM_REQ_UNHALT, &vcpu->requests))
|
||||
if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED)
|
||||
vcpu->arch.mp_state =
|
||||
KVM_MP_STATE_RUNNABLE;
|
||||
up_read(&vcpu->kvm->slots_lock);
|
||||
|
||||
if (vcpu->arch.mp_state != KVM_MP_STATE_RUNNABLE)
|
||||
return -EINTR;
|
||||
return 1;
|
||||
|
@ -484,10 +493,6 @@ static int (*kvm_vti_exit_handlers[])(struct kvm_vcpu *vcpu,
|
|||
static const int kvm_vti_max_exit_handlers =
|
||||
sizeof(kvm_vti_exit_handlers)/sizeof(*kvm_vti_exit_handlers);
|
||||
|
||||
static void kvm_prepare_guest_switch(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
}
|
||||
|
||||
static uint32_t kvm_get_exit_reason(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
struct exit_ctl_data *p_exit_data;
|
||||
|
@ -600,8 +605,6 @@ static int __vcpu_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
|||
|
||||
again:
|
||||
preempt_disable();
|
||||
|
||||
kvm_prepare_guest_switch(vcpu);
|
||||
local_irq_disable();
|
||||
|
||||
if (signal_pending(current)) {
|
||||
|
@ -614,7 +617,7 @@ again:
|
|||
|
||||
vcpu->guest_mode = 1;
|
||||
kvm_guest_enter();
|
||||
|
||||
down_read(&vcpu->kvm->slots_lock);
|
||||
r = vti_vcpu_run(vcpu, kvm_run);
|
||||
if (r < 0) {
|
||||
local_irq_enable();
|
||||
|
@ -634,9 +637,8 @@ again:
|
|||
* But we need to prevent reordering, hence this barrier():
|
||||
*/
|
||||
barrier();
|
||||
|
||||
kvm_guest_exit();
|
||||
|
||||
up_read(&vcpu->kvm->slots_lock);
|
||||
preempt_enable();
|
||||
|
||||
r = kvm_handle_exit(kvm_run, vcpu);
|
||||
|
@ -673,6 +675,7 @@ int kvm_arch_vcpu_ioctl_run(struct kvm_vcpu *vcpu, struct kvm_run *kvm_run)
|
|||
|
||||
if (unlikely(vcpu->arch.mp_state == KVM_MP_STATE_UNINITIALIZED)) {
|
||||
kvm_vcpu_block(vcpu);
|
||||
clear_bit(KVM_REQ_UNHALT, &vcpu->requests);
|
||||
vcpu_put(vcpu);
|
||||
return -EAGAIN;
|
||||
}
|
||||
|
@ -778,6 +781,9 @@ static void kvm_init_vm(struct kvm *kvm)
|
|||
kvm_build_io_pmt(kvm);
|
||||
|
||||
INIT_LIST_HEAD(&kvm->arch.assigned_dev_head);
|
||||
|
||||
/* Reserve bit 0 of irq_sources_bitmap for userspace irq source */
|
||||
set_bit(KVM_USERSPACE_IRQ_SOURCE_ID, &kvm->arch.irq_sources_bitmap);
|
||||
}
|
||||
|
||||
struct kvm *kvm_arch_create_vm(void)
|
||||
|
@ -941,9 +947,8 @@ long kvm_arch_vm_ioctl(struct file *filp,
|
|||
goto out;
|
||||
if (irqchip_in_kernel(kvm)) {
|
||||
mutex_lock(&kvm->lock);
|
||||
kvm_ioapic_set_irq(kvm->arch.vioapic,
|
||||
irq_event.irq,
|
||||
irq_event.level);
|
||||
kvm_set_irq(kvm, KVM_USERSPACE_IRQ_SOURCE_ID,
|
||||
irq_event.irq, irq_event.level);
|
||||
mutex_unlock(&kvm->lock);
|
||||
r = 0;
|
||||
}
|
||||
|
@ -1123,15 +1128,16 @@ static enum hrtimer_restart hlt_timer_fn(struct hrtimer *data)
|
|||
wait_queue_head_t *q;
|
||||
|
||||
vcpu = container_of(data, struct kvm_vcpu, arch.hlt_timer);
|
||||
q = &vcpu->wq;
|
||||
|
||||
if (vcpu->arch.mp_state != KVM_MP_STATE_HALTED)
|
||||
goto out;
|
||||
|
||||
q = &vcpu->wq;
|
||||
if (waitqueue_active(q)) {
|
||||
vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
|
||||
if (waitqueue_active(q))
|
||||
wake_up_interruptible(q);
|
||||
}
|
||||
|
||||
out:
|
||||
vcpu->arch.timer_fired = 1;
|
||||
vcpu->arch.timer_check = 1;
|
||||
return HRTIMER_NORESTART;
|
||||
}
|
||||
|
@ -1700,12 +1706,14 @@ static void vcpu_kick_intr(void *info)
|
|||
void kvm_vcpu_kick(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
int ipi_pcpu = vcpu->cpu;
|
||||
int cpu = get_cpu();
|
||||
|
||||
if (waitqueue_active(&vcpu->wq))
|
||||
wake_up_interruptible(&vcpu->wq);
|
||||
|
||||
if (vcpu->guest_mode)
|
||||
if (vcpu->guest_mode && cpu != ipi_pcpu)
|
||||
smp_call_function_single(ipi_pcpu, vcpu_kick_intr, vcpu, 0);
|
||||
put_cpu();
|
||||
}
|
||||
|
||||
int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig)
|
||||
|
@ -1715,13 +1723,7 @@ int kvm_apic_set_irq(struct kvm_vcpu *vcpu, u8 vec, u8 trig)
|
|||
|
||||
if (!test_and_set_bit(vec, &vpd->irr[0])) {
|
||||
vcpu->arch.irq_new_pending = 1;
|
||||
if (vcpu->arch.mp_state == KVM_MP_STATE_RUNNABLE)
|
||||
kvm_vcpu_kick(vcpu);
|
||||
else if (vcpu->arch.mp_state == KVM_MP_STATE_HALTED) {
|
||||
vcpu->arch.mp_state = KVM_MP_STATE_RUNNABLE;
|
||||
if (waitqueue_active(&vcpu->wq))
|
||||
wake_up_interruptible(&vcpu->wq);
|
||||
}
|
||||
kvm_vcpu_kick(vcpu);
|
||||
return 1;
|
||||
}
|
||||
return 0;
|
||||
|
@ -1791,7 +1793,7 @@ int kvm_cpu_has_interrupt(struct kvm_vcpu *vcpu)
|
|||
|
||||
int kvm_cpu_has_pending_timer(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
return 0;
|
||||
return vcpu->arch.timer_fired;
|
||||
}
|
||||
|
||||
gfn_t unalias_gfn(struct kvm *kvm, gfn_t gfn)
|
||||
|
|
|
@ -286,6 +286,12 @@ static u64 kvm_get_pal_call_index(struct kvm_vcpu *vcpu)
|
|||
return index;
|
||||
}
|
||||
|
||||
static void prepare_for_halt(struct kvm_vcpu *vcpu)
|
||||
{
|
||||
vcpu->arch.timer_pending = 1;
|
||||
vcpu->arch.timer_fired = 0;
|
||||
}
|
||||
|
||||
int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
||||
{
|
||||
|
||||
|
@ -304,11 +310,10 @@ int kvm_pal_emul(struct kvm_vcpu *vcpu, struct kvm_run *run)
|
|||
break;
|
||||
case PAL_HALT_LIGHT:
|
||||
{
|
||||
vcpu->arch.timer_pending = 1;
|
||||
INIT_PAL_STATUS_SUCCESS(result);
|
||||
prepare_for_halt(vcpu);
|
||||
if (kvm_highest_pending_irq(vcpu) == -1)
|
||||
ret = kvm_emulate_halt(vcpu);
|
||||
|
||||
}
|
||||
break;
|
||||
|
||||
|
|
|
@ -713,7 +713,7 @@ void leave_hypervisor_tail(void)
|
|||
if (!(VCPU(v, itv) & (1 << 16))) {
|
||||
vcpu_pend_interrupt(v, VCPU(v, itv)
|
||||
& 0xff);
|
||||
VMX(v, itc_check) = 0;
|
||||
VMX(v, itc_check) = 0;
|
||||
} else {
|
||||
v->arch.timer_pending = 1;
|
||||
}
|
||||
|
|
|
@ -327,7 +327,6 @@ config SGI_IP22
|
|||
select IP22_CPU_SCACHE
|
||||
select IRQ_CPU
|
||||
select GENERIC_ISA_DMA_SUPPORT_BROKEN
|
||||
select SGI_HAS_DS1286
|
||||
select SGI_HAS_I8042
|
||||
select SGI_HAS_INDYDOG
|
||||
select SGI_HAS_HAL2
|
||||
|
@ -382,7 +381,6 @@ config SGI_IP28
|
|||
select HW_HAS_EISA
|
||||
select I8253
|
||||
select I8259
|
||||
select SGI_HAS_DS1286
|
||||
select SGI_HAS_I8042
|
||||
select SGI_HAS_INDYDOG
|
||||
select SGI_HAS_HAL2
|
||||
|
@ -893,9 +891,6 @@ config EMMA2RH
|
|||
config SERIAL_RM9000
|
||||
bool
|
||||
|
||||
config SGI_HAS_DS1286
|
||||
bool
|
||||
|
||||
config SGI_HAS_INDYDOG
|
||||
bool
|
||||
|
||||
|
|
|
@ -771,7 +771,6 @@ CONFIG_WATCHDOG=y
|
|||
CONFIG_INDYDOG=m
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
# CONFIG_RTC is not set
|
||||
CONFIG_SGI_DS1286=m
|
||||
# CONFIG_R3964 is not set
|
||||
CONFIG_RAW_DRIVER=m
|
||||
CONFIG_MAX_RAW_DEVS=256
|
||||
|
|
|
@ -701,7 +701,6 @@ CONFIG_LEGACY_PTY_COUNT=256
|
|||
# CONFIG_WATCHDOG is not set
|
||||
CONFIG_HW_RANDOM=m
|
||||
# CONFIG_RTC is not set
|
||||
CONFIG_SGI_IP27_RTC=y
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_APPLICOM is not set
|
||||
# CONFIG_DRM is not set
|
||||
|
|
|
@ -70,7 +70,6 @@ CONFIG_CPU_BIG_ENDIAN=y
|
|||
CONFIG_SYS_SUPPORTS_BIG_ENDIAN=y
|
||||
CONFIG_IRQ_CPU=y
|
||||
CONFIG_SWAP_IO_SPACE=y
|
||||
CONFIG_SGI_HAS_DS1286=y
|
||||
CONFIG_SGI_HAS_INDYDOG=y
|
||||
CONFIG_SGI_HAS_SEEQ=y
|
||||
CONFIG_SGI_HAS_WD93=y
|
||||
|
@ -585,7 +584,6 @@ CONFIG_LEGACY_PTY_COUNT=256
|
|||
# CONFIG_IPMI_HANDLER is not set
|
||||
# CONFIG_HW_RANDOM is not set
|
||||
# CONFIG_RTC is not set
|
||||
CONFIG_SGI_DS1286=y
|
||||
# CONFIG_DTLK is not set
|
||||
# CONFIG_R3964 is not set
|
||||
# CONFIG_RAW_DRIVER is not set
|
||||
|
|
|
@ -558,39 +558,67 @@ static inline void __clear_bit_unlock(unsigned long nr, volatile unsigned long *
|
|||
__clear_bit(nr, addr);
|
||||
}
|
||||
|
||||
#if defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64)
|
||||
|
||||
/*
|
||||
* Return the bit position (0..63) of the most significant 1 bit in a word
|
||||
* Returns -1 if no 1 bit exists
|
||||
*/
|
||||
static inline unsigned long __fls(unsigned long x)
|
||||
static inline unsigned long __fls(unsigned long word)
|
||||
{
|
||||
int lz;
|
||||
int num;
|
||||
|
||||
if (sizeof(x) == 4) {
|
||||
if (BITS_PER_LONG == 32 &&
|
||||
__builtin_constant_p(cpu_has_mips_r) && cpu_has_mips_r) {
|
||||
__asm__(
|
||||
" .set push \n"
|
||||
" .set mips32 \n"
|
||||
" clz %0, %1 \n"
|
||||
" .set pop \n"
|
||||
: "=r" (lz)
|
||||
: "r" (x));
|
||||
: "=r" (num)
|
||||
: "r" (word));
|
||||
|
||||
return 31 - lz;
|
||||
return 31 - num;
|
||||
}
|
||||
|
||||
BUG_ON(sizeof(x) != 8);
|
||||
if (BITS_PER_LONG == 64 &&
|
||||
__builtin_constant_p(cpu_has_mips64) && cpu_has_mips64) {
|
||||
__asm__(
|
||||
" .set push \n"
|
||||
" .set mips64 \n"
|
||||
" dclz %0, %1 \n"
|
||||
" .set pop \n"
|
||||
: "=r" (num)
|
||||
: "r" (word));
|
||||
|
||||
__asm__(
|
||||
" .set push \n"
|
||||
" .set mips64 \n"
|
||||
" dclz %0, %1 \n"
|
||||
" .set pop \n"
|
||||
: "=r" (lz)
|
||||
: "r" (x));
|
||||
return 63 - num;
|
||||
}
|
||||
|
||||
return 63 - lz;
|
||||
num = BITS_PER_LONG - 1;
|
||||
|
||||
#if BITS_PER_LONG == 64
|
||||
if (!(word & (~0ul << 32))) {
|
||||
num -= 32;
|
||||
word <<= 32;
|
||||
}
|
||||
#endif
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-16)))) {
|
||||
num -= 16;
|
||||
word <<= 16;
|
||||
}
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-8)))) {
|
||||
num -= 8;
|
||||
word <<= 8;
|
||||
}
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-4)))) {
|
||||
num -= 4;
|
||||
word <<= 4;
|
||||
}
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-2)))) {
|
||||
num -= 2;
|
||||
word <<= 2;
|
||||
}
|
||||
if (!(word & (~0ul << (BITS_PER_LONG-1))))
|
||||
num -= 1;
|
||||
return num;
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -612,23 +640,43 @@ static inline unsigned long __ffs(unsigned long word)
|
|||
* This is defined the same way as ffs.
|
||||
* Note fls(0) = 0, fls(1) = 1, fls(0x80000000) = 32.
|
||||
*/
|
||||
static inline int fls(int word)
|
||||
static inline int fls(int x)
|
||||
{
|
||||
__asm__("clz %0, %1" : "=r" (word) : "r" (word));
|
||||
int r;
|
||||
|
||||
return 32 - word;
|
||||
if (__builtin_constant_p(cpu_has_mips_r) && cpu_has_mips_r) {
|
||||
__asm__("clz %0, %1" : "=r" (x) : "r" (x));
|
||||
|
||||
return 32 - x;
|
||||
}
|
||||
|
||||
r = 32;
|
||||
if (!x)
|
||||
return 0;
|
||||
if (!(x & 0xffff0000u)) {
|
||||
x <<= 16;
|
||||
r -= 16;
|
||||
}
|
||||
if (!(x & 0xff000000u)) {
|
||||
x <<= 8;
|
||||
r -= 8;
|
||||
}
|
||||
if (!(x & 0xf0000000u)) {
|
||||
x <<= 4;
|
||||
r -= 4;
|
||||
}
|
||||
if (!(x & 0xc0000000u)) {
|
||||
x <<= 2;
|
||||
r -= 2;
|
||||
}
|
||||
if (!(x & 0x80000000u)) {
|
||||
x <<= 1;
|
||||
r -= 1;
|
||||
}
|
||||
return r;
|
||||
}
|
||||
|
||||
#if defined(CONFIG_64BIT) && defined(CONFIG_CPU_MIPS64)
|
||||
static inline int fls64(__u64 word)
|
||||
{
|
||||
__asm__("dclz %0, %1" : "=r" (word) : "r" (word));
|
||||
|
||||
return 64 - word;
|
||||
}
|
||||
#else
|
||||
#include <asm-generic/bitops/fls64.h>
|
||||
#endif
|
||||
|
||||
/*
|
||||
* ffs - find first bit set.
|
||||
|
@ -646,16 +694,6 @@ static inline int ffs(int word)
|
|||
return fls(word & -word);
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
#include <asm-generic/bitops/__ffs.h>
|
||||
#include <asm-generic/bitops/__fls.h>
|
||||
#include <asm-generic/bitops/ffs.h>
|
||||
#include <asm-generic/bitops/fls.h>
|
||||
#include <asm-generic/bitops/fls64.h>
|
||||
|
||||
#endif /*defined(CONFIG_CPU_MIPS32) || defined(CONFIG_CPU_MIPS64) */
|
||||
|
||||
#include <asm-generic/bitops/ffz.h>
|
||||
#include <asm-generic/bitops/find.h>
|
||||
|
||||
|
|
|
@ -29,6 +29,7 @@
|
|||
#define _BRK_THREADBP 11 /* For threads, user bp (used by debuggers) */
|
||||
#define BRK_BUG 512 /* Used by BUG() */
|
||||
#define BRK_KDB 513 /* Used in KDB_ENTER() */
|
||||
#define BRK_MEMU 514 /* Used by FPU emulator */
|
||||
#define BRK_MULOVF 1023 /* Multiply overflow */
|
||||
|
||||
#endif /* __ASM_BREAK_H */
|
||||
|
|
|
@ -11,11 +11,19 @@
|
|||
#include <linux/compiler.h>
|
||||
#include <asm/types.h>
|
||||
|
||||
#ifdef __GNUC__
|
||||
#if defined(__MIPSEB__)
|
||||
# define __BIG_ENDIAN
|
||||
#elif defined(__MIPSEL__)
|
||||
# define __LITTLE_ENDIAN
|
||||
#else
|
||||
# error "MIPS, but neither __MIPSEB__, nor __MIPSEL__???"
|
||||
#endif
|
||||
|
||||
#define __SWAB_64_THRU_32__
|
||||
|
||||
#ifdef CONFIG_CPU_MIPSR2
|
||||
|
||||
static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x)
|
||||
static inline __attribute_const__ __u16 __arch_swab16(__u16 x)
|
||||
{
|
||||
__asm__(
|
||||
" wsbh %0, %1 \n"
|
||||
|
@ -24,9 +32,9 @@ static __inline__ __attribute_const__ __u16 ___arch__swab16(__u16 x)
|
|||
|
||||
return x;
|
||||
}
|
||||
#define __arch__swab16(x) ___arch__swab16(x)
|
||||
#define __arch_swab16 __arch_swab16
|
||||
|
||||
static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
|
||||
static inline __attribute_const__ __u32 __arch_swab32(__u32 x)
|
||||
{
|
||||
__asm__(
|
||||
" wsbh %0, %1 \n"
|
||||
|
@ -36,11 +44,10 @@ static __inline__ __attribute_const__ __u32 ___arch__swab32(__u32 x)
|
|||
|
||||
return x;
|
||||
}
|
||||
#define __arch__swab32(x) ___arch__swab32(x)
|
||||
#define __arch_swab32 __arch_swab32
|
||||
|
||||
#ifdef CONFIG_CPU_MIPS64_R2
|
||||
|
||||
static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x)
|
||||
static inline __attribute_const__ __u64 __arch_swab64(__u64 x)
|
||||
{
|
||||
__asm__(
|
||||
" dsbh %0, %1 \n"
|
||||
|
@ -51,26 +58,11 @@ static __inline__ __attribute_const__ __u64 ___arch__swab64(__u64 x)
|
|||
|
||||
return x;
|
||||
}
|
||||
|
||||
#define __arch__swab64(x) ___arch__swab64(x)
|
||||
|
||||
#define __arch_swab64 __arch_swab64
|
||||
#endif /* CONFIG_CPU_MIPS64_R2 */
|
||||
|
||||
#endif /* CONFIG_CPU_MIPSR2 */
|
||||
|
||||
#if !defined(__STRICT_ANSI__) || defined(__KERNEL__)
|
||||
# define __BYTEORDER_HAS_U64__
|
||||
# define __SWAB_64_THRU_32__
|
||||
#endif
|
||||
|
||||
#endif /* __GNUC__ */
|
||||
|
||||
#if defined(__MIPSEB__)
|
||||
# include <linux/byteorder/big_endian.h>
|
||||
#elif defined(__MIPSEL__)
|
||||
# include <linux/byteorder/little_endian.h>
|
||||
#else
|
||||
# error "MIPS, but neither __MIPSEB__, nor __MIPSEL__???"
|
||||
#endif
|
||||
#include <linux/byteorder.h>
|
||||
|
||||
#endif /* _ASM_BYTEORDER_H */
|
||||
|
|
|
@ -141,6 +141,8 @@
|
|||
#define cpu_has_mips64 (cpu_has_mips64r1 | cpu_has_mips64r2)
|
||||
#define cpu_has_mips_r1 (cpu_has_mips32r1 | cpu_has_mips64r1)
|
||||
#define cpu_has_mips_r2 (cpu_has_mips32r2 | cpu_has_mips64r2)
|
||||
#define cpu_has_mips_r (cpu_has_mips32r1 | cpu_has_mips32r2 | \
|
||||
cpu_has_mips64r1 | cpu_has_mips64r2)
|
||||
|
||||
#ifndef cpu_has_dsp
|
||||
#define cpu_has_dsp (cpu_data[0].ases & MIPS_ASE_DSP)
|
||||
|
|
|
@ -1,15 +0,0 @@
|
|||
/*
|
||||
* 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.
|
||||
*
|
||||
* Machine dependent access functions for RTC registers.
|
||||
*
|
||||
* Copyright (C) 2003 Ralf Baechle (ralf@linux-mips.org)
|
||||
*/
|
||||
#ifndef _ASM_DS1286_H
|
||||
#define _ASM_DS1286_H
|
||||
|
||||
#include <ds1286.h>
|
||||
|
||||
#endif /* _ASM_DS1286_H */
|
|
@ -23,6 +23,9 @@
|
|||
#ifndef _ASM_FPU_EMULATOR_H
|
||||
#define _ASM_FPU_EMULATOR_H
|
||||
|
||||
#include <asm/break.h>
|
||||
#include <asm/inst.h>
|
||||
|
||||
struct mips_fpu_emulator_stats {
|
||||
unsigned int emulated;
|
||||
unsigned int loads;
|
||||
|
@ -34,4 +37,18 @@ struct mips_fpu_emulator_stats {
|
|||
|
||||
extern struct mips_fpu_emulator_stats fpuemustats;
|
||||
|
||||
extern int mips_dsemul(struct pt_regs *regs, mips_instruction ir,
|
||||
unsigned long cpc);
|
||||
extern int do_dsemulret(struct pt_regs *xcp);
|
||||
|
||||
/*
|
||||
* Instruction inserted following the badinst to further tag the sequence
|
||||
*/
|
||||
#define BD_COOKIE 0x0000bd36 /* tne $0, $0 with baggage */
|
||||
|
||||
/*
|
||||
* Break instruction with special math emu break code set
|
||||
*/
|
||||
#define BREAK_MATH (0x0000000d | (BRK_MEMU << 16))
|
||||
|
||||
#endif /* _ASM_FPU_EMULATOR_H */
|
||||
|
|
|
@ -1,27 +0,0 @@
|
|||
/*
|
||||
* Registers for the SGS-Thomson M48T35 Timekeeper RAM chip
|
||||
*/
|
||||
#ifndef _ASM_M48T35_H
|
||||
#define _ASM_M48T35_H
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
|
||||
extern spinlock_t rtc_lock;
|
||||
|
||||
struct m48t35_rtc {
|
||||
volatile u8 pad[0x7ff8]; /* starts at 0x7ff8 */
|
||||
volatile u8 control;
|
||||
volatile u8 sec;
|
||||
volatile u8 min;
|
||||
volatile u8 hour;
|
||||
volatile u8 day;
|
||||
volatile u8 date;
|
||||
volatile u8 month;
|
||||
volatile u8 year;
|
||||
};
|
||||
|
||||
#define M48T35_RTC_SET 0x80
|
||||
#define M48T35_RTC_STOPPED 0x80
|
||||
#define M48T35_RTC_READ 0x40
|
||||
|
||||
#endif /* _ASM_M48T35_H */
|
|
@ -286,11 +286,12 @@ static inline int __cpu_has_fpu(void)
|
|||
#define R4K_OPTS (MIPS_CPU_TLB | MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE \
|
||||
| MIPS_CPU_COUNTER)
|
||||
|
||||
static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
||||
static inline void cpu_probe_legacy(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
{
|
||||
switch (c->processor_id & 0xff00) {
|
||||
case PRID_IMP_R2000:
|
||||
c->cputype = CPU_R2000;
|
||||
__cpu_name[cpu] = "R2000";
|
||||
c->isa_level = MIPS_CPU_ISA_I;
|
||||
c->options = MIPS_CPU_TLB | MIPS_CPU_3K_CACHE |
|
||||
MIPS_CPU_NOFPUEX;
|
||||
|
@ -299,13 +300,19 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
c->tlbsize = 64;
|
||||
break;
|
||||
case PRID_IMP_R3000:
|
||||
if ((c->processor_id & 0xff) == PRID_REV_R3000A)
|
||||
if (cpu_has_confreg())
|
||||
if ((c->processor_id & 0xff) == PRID_REV_R3000A) {
|
||||
if (cpu_has_confreg()) {
|
||||
c->cputype = CPU_R3081E;
|
||||
else
|
||||
__cpu_name[cpu] = "R3081";
|
||||
} else {
|
||||
c->cputype = CPU_R3000A;
|
||||
else
|
||||
__cpu_name[cpu] = "R3000A";
|
||||
}
|
||||
break;
|
||||
} else {
|
||||
c->cputype = CPU_R3000;
|
||||
__cpu_name[cpu] = "R3000";
|
||||
}
|
||||
c->isa_level = MIPS_CPU_ISA_I;
|
||||
c->options = MIPS_CPU_TLB | MIPS_CPU_3K_CACHE |
|
||||
MIPS_CPU_NOFPUEX;
|
||||
|
@ -315,15 +322,21 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_R4000:
|
||||
if (read_c0_config() & CONF_SC) {
|
||||
if ((c->processor_id & 0xff) >= PRID_REV_R4400)
|
||||
if ((c->processor_id & 0xff) >= PRID_REV_R4400) {
|
||||
c->cputype = CPU_R4400PC;
|
||||
else
|
||||
__cpu_name[cpu] = "R4400PC";
|
||||
} else {
|
||||
c->cputype = CPU_R4000PC;
|
||||
__cpu_name[cpu] = "R4000PC";
|
||||
}
|
||||
} else {
|
||||
if ((c->processor_id & 0xff) >= PRID_REV_R4400)
|
||||
if ((c->processor_id & 0xff) >= PRID_REV_R4400) {
|
||||
c->cputype = CPU_R4400SC;
|
||||
else
|
||||
__cpu_name[cpu] = "R4400SC";
|
||||
} else {
|
||||
c->cputype = CPU_R4000SC;
|
||||
__cpu_name[cpu] = "R4000SC";
|
||||
}
|
||||
}
|
||||
|
||||
c->isa_level = MIPS_CPU_ISA_III;
|
||||
|
@ -336,25 +349,34 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
switch (c->processor_id & 0xf0) {
|
||||
case PRID_REV_VR4111:
|
||||
c->cputype = CPU_VR4111;
|
||||
__cpu_name[cpu] = "NEC VR4111";
|
||||
break;
|
||||
case PRID_REV_VR4121:
|
||||
c->cputype = CPU_VR4121;
|
||||
__cpu_name[cpu] = "NEC VR4121";
|
||||
break;
|
||||
case PRID_REV_VR4122:
|
||||
if ((c->processor_id & 0xf) < 0x3)
|
||||
if ((c->processor_id & 0xf) < 0x3) {
|
||||
c->cputype = CPU_VR4122;
|
||||
else
|
||||
__cpu_name[cpu] = "NEC VR4122";
|
||||
} else {
|
||||
c->cputype = CPU_VR4181A;
|
||||
__cpu_name[cpu] = "NEC VR4181A";
|
||||
}
|
||||
break;
|
||||
case PRID_REV_VR4130:
|
||||
if ((c->processor_id & 0xf) < 0x4)
|
||||
if ((c->processor_id & 0xf) < 0x4) {
|
||||
c->cputype = CPU_VR4131;
|
||||
else
|
||||
__cpu_name[cpu] = "NEC VR4131";
|
||||
} else {
|
||||
c->cputype = CPU_VR4133;
|
||||
__cpu_name[cpu] = "NEC VR4133";
|
||||
}
|
||||
break;
|
||||
default:
|
||||
printk(KERN_INFO "Unexpected CPU of NEC VR4100 series\n");
|
||||
c->cputype = CPU_VR41XX;
|
||||
__cpu_name[cpu] = "NEC Vr41xx";
|
||||
break;
|
||||
}
|
||||
c->isa_level = MIPS_CPU_ISA_III;
|
||||
|
@ -363,6 +385,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_R4300:
|
||||
c->cputype = CPU_R4300;
|
||||
__cpu_name[cpu] = "R4300";
|
||||
c->isa_level = MIPS_CPU_ISA_III;
|
||||
c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
MIPS_CPU_LLSC;
|
||||
|
@ -370,6 +393,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_R4600:
|
||||
c->cputype = CPU_R4600;
|
||||
__cpu_name[cpu] = "R4600";
|
||||
c->isa_level = MIPS_CPU_ISA_III;
|
||||
c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
MIPS_CPU_LLSC;
|
||||
|
@ -384,6 +408,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
* it's c0_prid id number with the TX3900.
|
||||
*/
|
||||
c->cputype = CPU_R4650;
|
||||
__cpu_name[cpu] = "R4650";
|
||||
c->isa_level = MIPS_CPU_ISA_III;
|
||||
c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_LLSC;
|
||||
c->tlbsize = 48;
|
||||
|
@ -395,25 +420,26 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
|
||||
if ((c->processor_id & 0xf0) == (PRID_REV_TX3927 & 0xf0)) {
|
||||
c->cputype = CPU_TX3927;
|
||||
__cpu_name[cpu] = "TX3927";
|
||||
c->tlbsize = 64;
|
||||
} else {
|
||||
switch (c->processor_id & 0xff) {
|
||||
case PRID_REV_TX3912:
|
||||
c->cputype = CPU_TX3912;
|
||||
__cpu_name[cpu] = "TX3912";
|
||||
c->tlbsize = 32;
|
||||
break;
|
||||
case PRID_REV_TX3922:
|
||||
c->cputype = CPU_TX3922;
|
||||
__cpu_name[cpu] = "TX3922";
|
||||
c->tlbsize = 64;
|
||||
break;
|
||||
default:
|
||||
c->cputype = CPU_UNKNOWN;
|
||||
break;
|
||||
}
|
||||
}
|
||||
break;
|
||||
case PRID_IMP_R4700:
|
||||
c->cputype = CPU_R4700;
|
||||
__cpu_name[cpu] = "R4700";
|
||||
c->isa_level = MIPS_CPU_ISA_III;
|
||||
c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
MIPS_CPU_LLSC;
|
||||
|
@ -421,6 +447,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_TX49:
|
||||
c->cputype = CPU_TX49XX;
|
||||
__cpu_name[cpu] = "R49XX";
|
||||
c->isa_level = MIPS_CPU_ISA_III;
|
||||
c->options = R4K_OPTS | MIPS_CPU_LLSC;
|
||||
if (!(c->processor_id & 0x08))
|
||||
|
@ -429,6 +456,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_R5000:
|
||||
c->cputype = CPU_R5000;
|
||||
__cpu_name[cpu] = "R5000";
|
||||
c->isa_level = MIPS_CPU_ISA_IV;
|
||||
c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
MIPS_CPU_LLSC;
|
||||
|
@ -436,6 +464,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_R5432:
|
||||
c->cputype = CPU_R5432;
|
||||
__cpu_name[cpu] = "R5432";
|
||||
c->isa_level = MIPS_CPU_ISA_IV;
|
||||
c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
MIPS_CPU_WATCH | MIPS_CPU_LLSC;
|
||||
|
@ -443,6 +472,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_R5500:
|
||||
c->cputype = CPU_R5500;
|
||||
__cpu_name[cpu] = "R5500";
|
||||
c->isa_level = MIPS_CPU_ISA_IV;
|
||||
c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
MIPS_CPU_WATCH | MIPS_CPU_LLSC;
|
||||
|
@ -450,6 +480,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_NEVADA:
|
||||
c->cputype = CPU_NEVADA;
|
||||
__cpu_name[cpu] = "Nevada";
|
||||
c->isa_level = MIPS_CPU_ISA_IV;
|
||||
c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
MIPS_CPU_DIVEC | MIPS_CPU_LLSC;
|
||||
|
@ -457,6 +488,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_R6000:
|
||||
c->cputype = CPU_R6000;
|
||||
__cpu_name[cpu] = "R6000";
|
||||
c->isa_level = MIPS_CPU_ISA_II;
|
||||
c->options = MIPS_CPU_TLB | MIPS_CPU_FPU |
|
||||
MIPS_CPU_LLSC;
|
||||
|
@ -464,6 +496,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_R6000A:
|
||||
c->cputype = CPU_R6000A;
|
||||
__cpu_name[cpu] = "R6000A";
|
||||
c->isa_level = MIPS_CPU_ISA_II;
|
||||
c->options = MIPS_CPU_TLB | MIPS_CPU_FPU |
|
||||
MIPS_CPU_LLSC;
|
||||
|
@ -471,6 +504,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_RM7000:
|
||||
c->cputype = CPU_RM7000;
|
||||
__cpu_name[cpu] = "RM7000";
|
||||
c->isa_level = MIPS_CPU_ISA_IV;
|
||||
c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
MIPS_CPU_LLSC;
|
||||
|
@ -486,6 +520,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_RM9000:
|
||||
c->cputype = CPU_RM9000;
|
||||
__cpu_name[cpu] = "RM9000";
|
||||
c->isa_level = MIPS_CPU_ISA_IV;
|
||||
c->options = R4K_OPTS | MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
MIPS_CPU_LLSC;
|
||||
|
@ -500,6 +535,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_R8000:
|
||||
c->cputype = CPU_R8000;
|
||||
__cpu_name[cpu] = "RM8000";
|
||||
c->isa_level = MIPS_CPU_ISA_IV;
|
||||
c->options = MIPS_CPU_TLB | MIPS_CPU_4KEX |
|
||||
MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
|
@ -508,6 +544,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_R10000:
|
||||
c->cputype = CPU_R10000;
|
||||
__cpu_name[cpu] = "R10000";
|
||||
c->isa_level = MIPS_CPU_ISA_IV;
|
||||
c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX |
|
||||
MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
|
@ -517,6 +554,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_R12000:
|
||||
c->cputype = CPU_R12000;
|
||||
__cpu_name[cpu] = "R12000";
|
||||
c->isa_level = MIPS_CPU_ISA_IV;
|
||||
c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX |
|
||||
MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
|
@ -526,6 +564,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_R14000:
|
||||
c->cputype = CPU_R14000;
|
||||
__cpu_name[cpu] = "R14000";
|
||||
c->isa_level = MIPS_CPU_ISA_IV;
|
||||
c->options = MIPS_CPU_TLB | MIPS_CPU_4K_CACHE | MIPS_CPU_4KEX |
|
||||
MIPS_CPU_FPU | MIPS_CPU_32FPR |
|
||||
|
@ -535,6 +574,7 @@ static inline void cpu_probe_legacy(struct cpuinfo_mips *c)
|
|||
break;
|
||||
case PRID_IMP_LOONGSON2:
|
||||
c->cputype = CPU_LOONGSON2;
|
||||
__cpu_name[cpu] = "ICT Loongson-2";
|
||||
c->isa_level = MIPS_CPU_ISA_III;
|
||||
c->options = R4K_OPTS |
|
||||
MIPS_CPU_FPU | MIPS_CPU_LLSC |
|
||||
|
@ -652,21 +692,24 @@ static inline unsigned int decode_config3(struct cpuinfo_mips *c)
|
|||
|
||||
static void __cpuinit decode_configs(struct cpuinfo_mips *c)
|
||||
{
|
||||
int ok;
|
||||
|
||||
/* MIPS32 or MIPS64 compliant CPU. */
|
||||
c->options = MIPS_CPU_4KEX | MIPS_CPU_4K_CACHE | MIPS_CPU_COUNTER |
|
||||
MIPS_CPU_DIVEC | MIPS_CPU_LLSC | MIPS_CPU_MCHECK;
|
||||
|
||||
c->scache.flags = MIPS_CACHE_NOT_PRESENT;
|
||||
|
||||
/* Read Config registers. */
|
||||
if (!decode_config0(c))
|
||||
return; /* actually worth a panic() */
|
||||
if (!decode_config1(c))
|
||||
return;
|
||||
if (!decode_config2(c))
|
||||
return;
|
||||
if (!decode_config3(c))
|
||||
return;
|
||||
ok = decode_config0(c); /* Read Config registers. */
|
||||
BUG_ON(!ok); /* Arch spec violation! */
|
||||
if (ok)
|
||||
ok = decode_config1(c);
|
||||
if (ok)
|
||||
ok = decode_config2(c);
|
||||
if (ok)
|
||||
ok = decode_config3(c);
|
||||
|
||||
mips_probe_watch_registers(c);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_CPU_MIPSR2
|
||||
|
@ -675,52 +718,62 @@ extern void spram_config(void);
|
|||
static inline void spram_config(void) {}
|
||||
#endif
|
||||
|
||||
static inline void cpu_probe_mips(struct cpuinfo_mips *c)
|
||||
static inline void cpu_probe_mips(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
{
|
||||
decode_configs(c);
|
||||
mips_probe_watch_registers(c);
|
||||
switch (c->processor_id & 0xff00) {
|
||||
case PRID_IMP_4KC:
|
||||
c->cputype = CPU_4KC;
|
||||
__cpu_name[cpu] = "MIPS 4Kc";
|
||||
break;
|
||||
case PRID_IMP_4KEC:
|
||||
c->cputype = CPU_4KEC;
|
||||
__cpu_name[cpu] = "MIPS 4KEc";
|
||||
break;
|
||||
case PRID_IMP_4KECR2:
|
||||
c->cputype = CPU_4KEC;
|
||||
__cpu_name[cpu] = "MIPS 4KEc";
|
||||
break;
|
||||
case PRID_IMP_4KSC:
|
||||
case PRID_IMP_4KSD:
|
||||
c->cputype = CPU_4KSC;
|
||||
__cpu_name[cpu] = "MIPS 4KSc";
|
||||
break;
|
||||
case PRID_IMP_5KC:
|
||||
c->cputype = CPU_5KC;
|
||||
__cpu_name[cpu] = "MIPS 5Kc";
|
||||
break;
|
||||
case PRID_IMP_20KC:
|
||||
c->cputype = CPU_20KC;
|
||||
__cpu_name[cpu] = "MIPS 20Kc";
|
||||
break;
|
||||
case PRID_IMP_24K:
|
||||
case PRID_IMP_24KE:
|
||||
c->cputype = CPU_24K;
|
||||
__cpu_name[cpu] = "MIPS 24Kc";
|
||||
break;
|
||||
case PRID_IMP_25KF:
|
||||
c->cputype = CPU_25KF;
|
||||
__cpu_name[cpu] = "MIPS 25Kc";
|
||||
break;
|
||||
case PRID_IMP_34K:
|
||||
c->cputype = CPU_34K;
|
||||
__cpu_name[cpu] = "MIPS 34Kc";
|
||||
break;
|
||||
case PRID_IMP_74K:
|
||||
c->cputype = CPU_74K;
|
||||
__cpu_name[cpu] = "MIPS 74Kc";
|
||||
break;
|
||||
case PRID_IMP_1004K:
|
||||
c->cputype = CPU_1004K;
|
||||
__cpu_name[cpu] = "MIPS 1004Kc";
|
||||
break;
|
||||
}
|
||||
|
||||
spram_config();
|
||||
}
|
||||
|
||||
static inline void cpu_probe_alchemy(struct cpuinfo_mips *c)
|
||||
static inline void cpu_probe_alchemy(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
{
|
||||
decode_configs(c);
|
||||
switch (c->processor_id & 0xff00) {
|
||||
|
@ -729,23 +782,31 @@ static inline void cpu_probe_alchemy(struct cpuinfo_mips *c)
|
|||
switch ((c->processor_id >> 24) & 0xff) {
|
||||
case 0:
|
||||
c->cputype = CPU_AU1000;
|
||||
__cpu_name[cpu] = "Au1000";
|
||||
break;
|
||||
case 1:
|
||||
c->cputype = CPU_AU1500;
|
||||
__cpu_name[cpu] = "Au1500";
|
||||
break;
|
||||
case 2:
|
||||
c->cputype = CPU_AU1100;
|
||||
__cpu_name[cpu] = "Au1100";
|
||||
break;
|
||||
case 3:
|
||||
c->cputype = CPU_AU1550;
|
||||
__cpu_name[cpu] = "Au1550";
|
||||
break;
|
||||
case 4:
|
||||
c->cputype = CPU_AU1200;
|
||||
if (2 == (c->processor_id & 0xff))
|
||||
__cpu_name[cpu] = "Au1200";
|
||||
if ((c->processor_id & 0xff) == 2) {
|
||||
c->cputype = CPU_AU1250;
|
||||
__cpu_name[cpu] = "Au1250";
|
||||
}
|
||||
break;
|
||||
case 5:
|
||||
c->cputype = CPU_AU1210;
|
||||
__cpu_name[cpu] = "Au1210";
|
||||
break;
|
||||
default:
|
||||
panic("Unknown Au Core!");
|
||||
|
@ -755,154 +816,67 @@ static inline void cpu_probe_alchemy(struct cpuinfo_mips *c)
|
|||
}
|
||||
}
|
||||
|
||||
static inline void cpu_probe_sibyte(struct cpuinfo_mips *c)
|
||||
static inline void cpu_probe_sibyte(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
{
|
||||
decode_configs(c);
|
||||
|
||||
switch (c->processor_id & 0xff00) {
|
||||
case PRID_IMP_SB1:
|
||||
c->cputype = CPU_SB1;
|
||||
__cpu_name[cpu] = "SiByte SB1";
|
||||
/* FPU in pass1 is known to have issues. */
|
||||
if ((c->processor_id & 0xff) < 0x02)
|
||||
c->options &= ~(MIPS_CPU_FPU | MIPS_CPU_32FPR);
|
||||
break;
|
||||
case PRID_IMP_SB1A:
|
||||
c->cputype = CPU_SB1A;
|
||||
__cpu_name[cpu] = "SiByte SB1A";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void cpu_probe_sandcraft(struct cpuinfo_mips *c)
|
||||
static inline void cpu_probe_sandcraft(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
{
|
||||
decode_configs(c);
|
||||
switch (c->processor_id & 0xff00) {
|
||||
case PRID_IMP_SR71000:
|
||||
c->cputype = CPU_SR71000;
|
||||
__cpu_name[cpu] = "Sandcraft SR71000";
|
||||
c->scache.ways = 8;
|
||||
c->tlbsize = 64;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
static inline void cpu_probe_nxp(struct cpuinfo_mips *c)
|
||||
static inline void cpu_probe_nxp(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
{
|
||||
decode_configs(c);
|
||||
switch (c->processor_id & 0xff00) {
|
||||
case PRID_IMP_PR4450:
|
||||
c->cputype = CPU_PR4450;
|
||||
__cpu_name[cpu] = "Philips PR4450";
|
||||
c->isa_level = MIPS_CPU_ISA_M32R1;
|
||||
break;
|
||||
default:
|
||||
panic("Unknown NXP Core!"); /* REVISIT: die? */
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
static inline void cpu_probe_broadcom(struct cpuinfo_mips *c)
|
||||
static inline void cpu_probe_broadcom(struct cpuinfo_mips *c, unsigned int cpu)
|
||||
{
|
||||
decode_configs(c);
|
||||
switch (c->processor_id & 0xff00) {
|
||||
case PRID_IMP_BCM3302:
|
||||
c->cputype = CPU_BCM3302;
|
||||
__cpu_name[cpu] = "Broadcom BCM3302";
|
||||
break;
|
||||
case PRID_IMP_BCM4710:
|
||||
c->cputype = CPU_BCM4710;
|
||||
break;
|
||||
default:
|
||||
c->cputype = CPU_UNKNOWN;
|
||||
__cpu_name[cpu] = "Broadcom BCM4710";
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
const char *__cpu_name[NR_CPUS];
|
||||
|
||||
/*
|
||||
* Name a CPU
|
||||
*/
|
||||
static __cpuinit const char *cpu_to_name(struct cpuinfo_mips *c)
|
||||
{
|
||||
const char *name = NULL;
|
||||
|
||||
switch (c->cputype) {
|
||||
case CPU_UNKNOWN: name = "unknown"; break;
|
||||
case CPU_R2000: name = "R2000"; break;
|
||||
case CPU_R3000: name = "R3000"; break;
|
||||
case CPU_R3000A: name = "R3000A"; break;
|
||||
case CPU_R3041: name = "R3041"; break;
|
||||
case CPU_R3051: name = "R3051"; break;
|
||||
case CPU_R3052: name = "R3052"; break;
|
||||
case CPU_R3081: name = "R3081"; break;
|
||||
case CPU_R3081E: name = "R3081E"; break;
|
||||
case CPU_R4000PC: name = "R4000PC"; break;
|
||||
case CPU_R4000SC: name = "R4000SC"; break;
|
||||
case CPU_R4000MC: name = "R4000MC"; break;
|
||||
case CPU_R4200: name = "R4200"; break;
|
||||
case CPU_R4400PC: name = "R4400PC"; break;
|
||||
case CPU_R4400SC: name = "R4400SC"; break;
|
||||
case CPU_R4400MC: name = "R4400MC"; break;
|
||||
case CPU_R4600: name = "R4600"; break;
|
||||
case CPU_R6000: name = "R6000"; break;
|
||||
case CPU_R6000A: name = "R6000A"; break;
|
||||
case CPU_R8000: name = "R8000"; break;
|
||||
case CPU_R10000: name = "R10000"; break;
|
||||
case CPU_R12000: name = "R12000"; break;
|
||||
case CPU_R14000: name = "R14000"; break;
|
||||
case CPU_R4300: name = "R4300"; break;
|
||||
case CPU_R4650: name = "R4650"; break;
|
||||
case CPU_R4700: name = "R4700"; break;
|
||||
case CPU_R5000: name = "R5000"; break;
|
||||
case CPU_R5000A: name = "R5000A"; break;
|
||||
case CPU_R4640: name = "R4640"; break;
|
||||
case CPU_NEVADA: name = "Nevada"; break;
|
||||
case CPU_RM7000: name = "RM7000"; break;
|
||||
case CPU_RM9000: name = "RM9000"; break;
|
||||
case CPU_R5432: name = "R5432"; break;
|
||||
case CPU_4KC: name = "MIPS 4Kc"; break;
|
||||
case CPU_5KC: name = "MIPS 5Kc"; break;
|
||||
case CPU_R4310: name = "R4310"; break;
|
||||
case CPU_SB1: name = "SiByte SB1"; break;
|
||||
case CPU_SB1A: name = "SiByte SB1A"; break;
|
||||
case CPU_TX3912: name = "TX3912"; break;
|
||||
case CPU_TX3922: name = "TX3922"; break;
|
||||
case CPU_TX3927: name = "TX3927"; break;
|
||||
case CPU_AU1000: name = "Au1000"; break;
|
||||
case CPU_AU1500: name = "Au1500"; break;
|
||||
case CPU_AU1100: name = "Au1100"; break;
|
||||
case CPU_AU1550: name = "Au1550"; break;
|
||||
case CPU_AU1200: name = "Au1200"; break;
|
||||
case CPU_AU1210: name = "Au1210"; break;
|
||||
case CPU_AU1250: name = "Au1250"; break;
|
||||
case CPU_4KEC: name = "MIPS 4KEc"; break;
|
||||
case CPU_4KSC: name = "MIPS 4KSc"; break;
|
||||
case CPU_VR41XX: name = "NEC Vr41xx"; break;
|
||||
case CPU_R5500: name = "R5500"; break;
|
||||
case CPU_TX49XX: name = "TX49xx"; break;
|
||||
case CPU_20KC: name = "MIPS 20Kc"; break;
|
||||
case CPU_24K: name = "MIPS 24K"; break;
|
||||
case CPU_25KF: name = "MIPS 25Kf"; break;
|
||||
case CPU_34K: name = "MIPS 34K"; break;
|
||||
case CPU_1004K: name = "MIPS 1004K"; break;
|
||||
case CPU_74K: name = "MIPS 74K"; break;
|
||||
case CPU_VR4111: name = "NEC VR4111"; break;
|
||||
case CPU_VR4121: name = "NEC VR4121"; break;
|
||||
case CPU_VR4122: name = "NEC VR4122"; break;
|
||||
case CPU_VR4131: name = "NEC VR4131"; break;
|
||||
case CPU_VR4133: name = "NEC VR4133"; break;
|
||||
case CPU_VR4181: name = "NEC VR4181"; break;
|
||||
case CPU_VR4181A: name = "NEC VR4181A"; break;
|
||||
case CPU_SR71000: name = "Sandcraft SR71000"; break;
|
||||
case CPU_BCM3302: name = "Broadcom BCM3302"; break;
|
||||
case CPU_BCM4710: name = "Broadcom BCM4710"; break;
|
||||
case CPU_PR4450: name = "Philips PR4450"; break;
|
||||
case CPU_LOONGSON2: name = "ICT Loongson-2"; break;
|
||||
default:
|
||||
BUG();
|
||||
}
|
||||
|
||||
return name;
|
||||
}
|
||||
|
||||
__cpuinit void cpu_probe(void)
|
||||
{
|
||||
struct cpuinfo_mips *c = ¤t_cpu_data;
|
||||
|
@ -915,30 +889,31 @@ __cpuinit void cpu_probe(void)
|
|||
c->processor_id = read_c0_prid();
|
||||
switch (c->processor_id & 0xff0000) {
|
||||
case PRID_COMP_LEGACY:
|
||||
cpu_probe_legacy(c);
|
||||
cpu_probe_legacy(c, cpu);
|
||||
break;
|
||||
case PRID_COMP_MIPS:
|
||||
cpu_probe_mips(c);
|
||||
cpu_probe_mips(c, cpu);
|
||||
break;
|
||||
case PRID_COMP_ALCHEMY:
|
||||
cpu_probe_alchemy(c);
|
||||
cpu_probe_alchemy(c, cpu);
|
||||
break;
|
||||
case PRID_COMP_SIBYTE:
|
||||
cpu_probe_sibyte(c);
|
||||
cpu_probe_sibyte(c, cpu);
|
||||
break;
|
||||
case PRID_COMP_BROADCOM:
|
||||
cpu_probe_broadcom(c);
|
||||
cpu_probe_broadcom(c, cpu);
|
||||
break;
|
||||
case PRID_COMP_SANDCRAFT:
|
||||
cpu_probe_sandcraft(c);
|
||||
cpu_probe_sandcraft(c, cpu);
|
||||
break;
|
||||
case PRID_COMP_NXP:
|
||||
cpu_probe_nxp(c);
|
||||
cpu_probe_nxp(c, cpu);
|
||||
break;
|
||||
default:
|
||||
c->cputype = CPU_UNKNOWN;
|
||||
}
|
||||
|
||||
BUG_ON(!__cpu_name[cpu]);
|
||||
BUG_ON(c->cputype == CPU_UNKNOWN);
|
||||
|
||||
/*
|
||||
* Platform code can force the cpu type to optimize code
|
||||
* generation. In that case be sure the cpu type is correctly
|
||||
|
@ -958,8 +933,6 @@ __cpuinit void cpu_probe(void)
|
|||
}
|
||||
}
|
||||
|
||||
__cpu_name[cpu] = cpu_to_name(c);
|
||||
|
||||
if (cpu_has_mips_r2)
|
||||
c->srsets = ((read_c0_srsctl() >> 26) & 0x0f) + 1;
|
||||
else
|
||||
|
|
|
@ -195,12 +195,6 @@ void __init smp_prepare_cpus(unsigned int max_cpus)
|
|||
/* preload SMP state for boot cpu */
|
||||
void __devinit smp_prepare_boot_cpu(void)
|
||||
{
|
||||
/*
|
||||
* This assumes that bootup is always handled by the processor
|
||||
* with the logic and physical number 0.
|
||||
*/
|
||||
__cpu_number_map[0] = 0;
|
||||
__cpu_logical_map[0] = 0;
|
||||
cpu_set(0, phys_cpu_present_map);
|
||||
cpu_set(0, cpu_online_map);
|
||||
cpu_set(0, cpu_callin_map);
|
||||
|
|
|
@ -32,6 +32,7 @@
|
|||
#include <asm/cpu.h>
|
||||
#include <asm/dsp.h>
|
||||
#include <asm/fpu.h>
|
||||
#include <asm/fpu_emulator.h>
|
||||
#include <asm/mipsregs.h>
|
||||
#include <asm/mipsmtregs.h>
|
||||
#include <asm/module.h>
|
||||
|
@ -722,6 +723,21 @@ static void do_trap_or_bp(struct pt_regs *regs, unsigned int code,
|
|||
die_if_kernel("Kernel bug detected", regs);
|
||||
force_sig(SIGTRAP, current);
|
||||
break;
|
||||
case BRK_MEMU:
|
||||
/*
|
||||
* Address errors may be deliberately induced by the FPU
|
||||
* emulator to retake control of the CPU after executing the
|
||||
* instruction in the delay slot of an emulated branch.
|
||||
*
|
||||
* Terminate if exception was recognized as a delay slot return
|
||||
* otherwise handle as normal.
|
||||
*/
|
||||
if (do_dsemulret(regs))
|
||||
return;
|
||||
|
||||
die_if_kernel("Math emu break/trap", regs);
|
||||
force_sig(SIGTRAP, current);
|
||||
break;
|
||||
default:
|
||||
scnprintf(b, sizeof(b), "%s instruction in kernel code", str);
|
||||
die_if_kernel(b, regs);
|
||||
|
@ -1555,6 +1571,8 @@ void __cpuinit set_uncached_handler(unsigned long offset, void *addr,
|
|||
#ifdef CONFIG_64BIT
|
||||
unsigned long uncached_ebase = TO_UNCAC(ebase);
|
||||
#endif
|
||||
if (cpu_has_mips_r2)
|
||||
ebase += (read_c0_ebase() & 0x3ffff000);
|
||||
|
||||
if (!addr)
|
||||
panic(panic_null_cerr);
|
||||
|
@ -1588,8 +1606,11 @@ void __init trap_init(void)
|
|||
|
||||
if (cpu_has_veic || cpu_has_vint)
|
||||
ebase = (unsigned long) alloc_bootmem_low_pages(0x200 + VECTORSPACING*64);
|
||||
else
|
||||
else {
|
||||
ebase = CAC_BASE;
|
||||
if (cpu_has_mips_r2)
|
||||
ebase += (read_c0_ebase() & 0x3ffff000);
|
||||
}
|
||||
|
||||
per_cpu_trap_init();
|
||||
|
||||
|
@ -1697,11 +1718,11 @@ void __init trap_init(void)
|
|||
|
||||
if (cpu_has_vce)
|
||||
/* Special exception: R4[04]00 uses also the divec space. */
|
||||
memcpy((void *)(CAC_BASE + 0x180), &except_vec3_r4000, 0x100);
|
||||
memcpy((void *)(ebase + 0x180), &except_vec3_r4000, 0x100);
|
||||
else if (cpu_has_4kex)
|
||||
memcpy((void *)(CAC_BASE + 0x180), &except_vec3_generic, 0x80);
|
||||
memcpy((void *)(ebase + 0x180), &except_vec3_generic, 0x80);
|
||||
else
|
||||
memcpy((void *)(CAC_BASE + 0x080), &except_vec3_generic, 0x80);
|
||||
memcpy((void *)(ebase + 0x080), &except_vec3_generic, 0x80);
|
||||
|
||||
signal_init();
|
||||
#ifdef CONFIG_MIPS32_COMPAT
|
||||
|
|
|
@ -499,21 +499,9 @@ sigill:
|
|||
|
||||
asmlinkage void do_ade(struct pt_regs *regs)
|
||||
{
|
||||
extern int do_dsemulret(struct pt_regs *);
|
||||
unsigned int __user *pc;
|
||||
mm_segment_t seg;
|
||||
|
||||
/*
|
||||
* Address errors may be deliberately induced by the FPU emulator to
|
||||
* retake control of the CPU after executing the instruction in the
|
||||
* delay slot of an emulated branch.
|
||||
*/
|
||||
/* Terminate if exception was recognized as a delay slot return */
|
||||
if (do_dsemulret(regs))
|
||||
return;
|
||||
|
||||
/* Otherwise handle as normal */
|
||||
|
||||
/*
|
||||
* Did we catch a fault trying to load an instruction?
|
||||
* Or are we running in MIPS16 mode?
|
||||
|
|
|
@ -48,7 +48,6 @@
|
|||
#include <asm/branch.h>
|
||||
|
||||
#include "ieee754.h"
|
||||
#include "dsemul.h"
|
||||
|
||||
/* Strap kernel emulator for full MIPS IV emulation */
|
||||
|
||||
|
@ -346,9 +345,6 @@ static int cop1Emulate(struct pt_regs *xcp, struct mips_fpu_struct *ctx)
|
|||
/* cop control register rd -> gpr[rt] */
|
||||
u32 value;
|
||||
|
||||
if (ir == CP1UNDEF) {
|
||||
return do_dsemulret(xcp);
|
||||
}
|
||||
if (MIPSInst_RD(ir) == FPCREG_CSR) {
|
||||
value = ctx->fcr31;
|
||||
value = (value & ~0x3) | mips_rm[value & 0x3];
|
||||
|
|
|
@ -18,7 +18,6 @@
|
|||
#include <asm/fpu_emulator.h>
|
||||
|
||||
#include "ieee754.h"
|
||||
#include "dsemul.h"
|
||||
|
||||
/* Strap kernel emulator for full MIPS IV emulation */
|
||||
|
||||
|
@ -94,7 +93,7 @@ int mips_dsemul(struct pt_regs *regs, mips_instruction ir, unsigned long cpc)
|
|||
return SIGBUS;
|
||||
|
||||
err = __put_user(ir, &fr->emul);
|
||||
err |= __put_user((mips_instruction)BADINST, &fr->badinst);
|
||||
err |= __put_user((mips_instruction)BREAK_MATH, &fr->badinst);
|
||||
err |= __put_user((mips_instruction)BD_COOKIE, &fr->cookie);
|
||||
err |= __put_user(cpc, &fr->epc);
|
||||
|
||||
|
@ -130,13 +129,13 @@ int do_dsemulret(struct pt_regs *xcp)
|
|||
/*
|
||||
* Do some sanity checking on the stackframe:
|
||||
*
|
||||
* - Is the instruction pointed to by the EPC an BADINST?
|
||||
* - Is the instruction pointed to by the EPC an BREAK_MATH?
|
||||
* - Is the following memory word the BD_COOKIE?
|
||||
*/
|
||||
err = __get_user(insn, &fr->badinst);
|
||||
err |= __get_user(cookie, &fr->cookie);
|
||||
|
||||
if (unlikely(err || (insn != BADINST) || (cookie != BD_COOKIE))) {
|
||||
if (unlikely(err || (insn != BREAK_MATH) || (cookie != BD_COOKIE))) {
|
||||
fpuemustats.errors++;
|
||||
return 0;
|
||||
}
|
||||
|
|
|
@ -1,17 +0,0 @@
|
|||
extern int mips_dsemul(struct pt_regs *regs, mips_instruction ir, unsigned long cpc);
|
||||
extern int do_dsemulret(struct pt_regs *xcp);
|
||||
|
||||
/* Instruction which will always cause an address error */
|
||||
#define AdELOAD 0x8c000001 /* lw $0,1($0) */
|
||||
/* Instruction which will plainly cause a CP1 exception when FPU is disabled */
|
||||
#define CP1UNDEF 0x44400001 /* cfc1 $0,$0 undef */
|
||||
|
||||
/* Instruction inserted following the badinst to further tag the sequence */
|
||||
#define BD_COOKIE 0x0000bd36 /* tne $0,$0 with baggage */
|
||||
|
||||
/* Setup which instruction to use for trampoline */
|
||||
#ifdef STANDALONE_EMULATOR
|
||||
#define BADINST CP1UNDEF
|
||||
#else
|
||||
#define BADINST AdELOAD
|
||||
#endif
|
|
@ -49,6 +49,7 @@
|
|||
#include <linux/platform_device.h>
|
||||
#include <linux/delay.h>
|
||||
#include <linux/gpio.h>
|
||||
#include <linux/leds.h>
|
||||
#include <asm/io.h>
|
||||
#include <asm/reboot.h>
|
||||
#include <asm/txx9/generic.h>
|
||||
|
@ -210,10 +211,6 @@ static void __init rbtx4927_mem_setup(void)
|
|||
/* TX4927-SIO DTR on (PIO[15]) */
|
||||
gpio_request(15, "sio-dtr");
|
||||
gpio_direction_output(15, 1);
|
||||
gpio_request(0, "led");
|
||||
gpio_direction_output(0, 1);
|
||||
gpio_request(1, "led");
|
||||
gpio_direction_output(1, 1);
|
||||
|
||||
tx4927_sio_init(0, 0);
|
||||
#ifdef CONFIG_SERIAL_TXX9_CONSOLE
|
||||
|
@ -315,6 +312,25 @@ static void __init rbtx4927_mtd_init(void)
|
|||
tx4927_mtd_init(i);
|
||||
}
|
||||
|
||||
static void __init rbtx4927_gpioled_init(void)
|
||||
{
|
||||
static struct gpio_led leds[] = {
|
||||
{ .name = "gpioled:green:0", .gpio = 0, .active_low = 1, },
|
||||
{ .name = "gpioled:green:1", .gpio = 1, .active_low = 1, },
|
||||
};
|
||||
static struct gpio_led_platform_data pdata = {
|
||||
.num_leds = ARRAY_SIZE(leds),
|
||||
.leds = leds,
|
||||
};
|
||||
struct platform_device *pdev = platform_device_alloc("leds-gpio", 0);
|
||||
|
||||
if (!pdev)
|
||||
return;
|
||||
pdev->dev.platform_data = &pdata;
|
||||
if (platform_device_add(pdev))
|
||||
platform_device_put(pdev);
|
||||
}
|
||||
|
||||
static void __init rbtx4927_device_init(void)
|
||||
{
|
||||
toshiba_rbtx4927_rtc_init();
|
||||
|
@ -322,6 +338,7 @@ static void __init rbtx4927_device_init(void)
|
|||
tx4927_wdt_init();
|
||||
rbtx4927_mtd_init();
|
||||
txx9_iocled_init(RBTX4927_LED_ADDR - IO_BASE, -1, 3, 1, "green", NULL);
|
||||
rbtx4927_gpioled_init();
|
||||
}
|
||||
|
||||
struct txx9_board_vec rbtx4927_vec __initdata = {
|
||||
|
|
|
@ -308,16 +308,22 @@ static void __init rbtx4939_device_init(void)
|
|||
#if defined(CONFIG_TC35815) || defined(CONFIG_TC35815_MODULE)
|
||||
int i, j;
|
||||
unsigned char ethaddr[2][6];
|
||||
u8 bdipsw = readb(rbtx4939_bdipsw_addr) & 0x0f;
|
||||
|
||||
for (i = 0; i < 2; i++) {
|
||||
unsigned long area = CKSEG1 + 0x1fff0000 + (i * 0x10);
|
||||
if (readb(rbtx4939_bdipsw_addr) & 8) {
|
||||
if (bdipsw == 0)
|
||||
memcpy(ethaddr[i], (void *)area, 6);
|
||||
else {
|
||||
u16 buf[3];
|
||||
area -= 0x03000000;
|
||||
if (bdipsw & 8)
|
||||
area -= 0x03000000;
|
||||
else
|
||||
area -= 0x01000000;
|
||||
for (j = 0; j < 3; j++)
|
||||
buf[j] = le16_to_cpup((u16 *)(area + j * 2));
|
||||
memcpy(ethaddr[i], buf, 6);
|
||||
} else
|
||||
memcpy(ethaddr[i], (void *)area, 6);
|
||||
}
|
||||
}
|
||||
tx4939_ethaddr_init(ethaddr[0], ethaddr[1]);
|
||||
#endif
|
||||
|
|
|
@ -108,8 +108,7 @@ config ARCH_NO_VIRT_TO_BUS
|
|||
config PPC
|
||||
bool
|
||||
default y
|
||||
select HAVE_DYNAMIC_FTRACE
|
||||
select HAVE_FTRACE
|
||||
select HAVE_FUNCTION_TRACER
|
||||
select ARCH_WANT_OPTIONAL_GPIOLIB
|
||||
select HAVE_IDE
|
||||
select HAVE_IOREMAP_PROT
|
||||
|
|
|
@ -122,7 +122,7 @@ KBUILD_CFLAGS += -mcpu=powerpc
|
|||
endif
|
||||
|
||||
# Work around a gcc code-gen bug with -fno-omit-frame-pointer.
|
||||
ifeq ($(CONFIG_FTRACE),y)
|
||||
ifeq ($(CONFIG_FUNCTION_TRACER),y)
|
||||
KBUILD_CFLAGS += -mno-sched-epilog
|
||||
endif
|
||||
|
||||
|
|
|
@ -1,7 +1,7 @@
|
|||
#ifndef _ASM_POWERPC_FTRACE
|
||||
#define _ASM_POWERPC_FTRACE
|
||||
|
||||
#ifdef CONFIG_FTRACE
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
#define MCOUNT_ADDR ((long)(_mcount))
|
||||
#define MCOUNT_INSN_SIZE 4 /* sizeof mcount call */
|
||||
|
||||
|
|
|
@ -12,7 +12,7 @@ CFLAGS_prom_init.o += -fPIC
|
|||
CFLAGS_btext.o += -fPIC
|
||||
endif
|
||||
|
||||
ifdef CONFIG_FTRACE
|
||||
ifdef CONFIG_FUNCTION_TRACER
|
||||
# Do not trace early boot code
|
||||
CFLAGS_REMOVE_cputable.o = -pg -mno-sched-epilog
|
||||
CFLAGS_REMOVE_prom_init.o = -pg -mno-sched-epilog
|
||||
|
|
|
@ -1158,7 +1158,7 @@ machine_check_in_rtas:
|
|||
|
||||
#endif /* CONFIG_PPC_RTAS */
|
||||
|
||||
#ifdef CONFIG_FTRACE
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
_GLOBAL(mcount)
|
||||
_GLOBAL(_mcount)
|
||||
|
|
|
@ -884,7 +884,7 @@ _GLOBAL(enter_prom)
|
|||
mtlr r0
|
||||
blr
|
||||
|
||||
#ifdef CONFIG_FTRACE
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
#ifdef CONFIG_DYNAMIC_FTRACE
|
||||
_GLOBAL(mcount)
|
||||
_GLOBAL(_mcount)
|
||||
|
|
|
@ -28,17 +28,17 @@ static unsigned int ftrace_nop = 0x60000000;
|
|||
#endif
|
||||
|
||||
|
||||
static unsigned int notrace ftrace_calc_offset(long ip, long addr)
|
||||
static unsigned int ftrace_calc_offset(long ip, long addr)
|
||||
{
|
||||
return (int)(addr - ip);
|
||||
}
|
||||
|
||||
notrace unsigned char *ftrace_nop_replace(void)
|
||||
unsigned char *ftrace_nop_replace(void)
|
||||
{
|
||||
return (char *)&ftrace_nop;
|
||||
}
|
||||
|
||||
notrace unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr)
|
||||
unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr)
|
||||
{
|
||||
static unsigned int op;
|
||||
|
||||
|
@ -68,7 +68,7 @@ notrace unsigned char *ftrace_call_replace(unsigned long ip, unsigned long addr)
|
|||
# define _ASM_PTR " .long "
|
||||
#endif
|
||||
|
||||
notrace int
|
||||
int
|
||||
ftrace_modify_code(unsigned long ip, unsigned char *old_code,
|
||||
unsigned char *new_code)
|
||||
{
|
||||
|
@ -113,7 +113,7 @@ ftrace_modify_code(unsigned long ip, unsigned char *old_code,
|
|||
return faulted;
|
||||
}
|
||||
|
||||
notrace int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||
int ftrace_update_ftrace_func(ftrace_func_t func)
|
||||
{
|
||||
unsigned long ip = (unsigned long)(&ftrace_call);
|
||||
unsigned char old[MCOUNT_INSN_SIZE], *new;
|
||||
|
@ -126,23 +126,6 @@ notrace int ftrace_update_ftrace_func(ftrace_func_t func)
|
|||
return ret;
|
||||
}
|
||||
|
||||
notrace int ftrace_mcount_set(unsigned long *data)
|
||||
{
|
||||
unsigned long ip = (long)(&mcount_call);
|
||||
unsigned long *addr = data;
|
||||
unsigned char old[MCOUNT_INSN_SIZE], *new;
|
||||
|
||||
/*
|
||||
* Replace the mcount stub with a pointer to the
|
||||
* ip recorder function.
|
||||
*/
|
||||
memcpy(old, &mcount_call, MCOUNT_INSN_SIZE);
|
||||
new = ftrace_call_replace(ip, *addr);
|
||||
*addr = ftrace_modify_code(ip, old, new);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
int __init ftrace_dyn_arch_init(void *data)
|
||||
{
|
||||
/* This is running in kstop_machine */
|
||||
|
|
|
@ -68,7 +68,7 @@ EXPORT_SYMBOL(single_step_exception);
|
|||
EXPORT_SYMBOL(sys_sigreturn);
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_FTRACE
|
||||
#ifdef CONFIG_FUNCTION_TRACER
|
||||
EXPORT_SYMBOL(_mcount);
|
||||
#endif
|
||||
|
||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue