mirror of https://gitee.com/openkylin/linux.git
Merge ../linux-2.6
This commit is contained in:
commit
a4e0d9af40
3
CREDITS
3
CREDITS
|
@ -3344,8 +3344,7 @@ S: Spain
|
||||||
N: Linus Torvalds
|
N: Linus Torvalds
|
||||||
E: torvalds@linux-foundation.org
|
E: torvalds@linux-foundation.org
|
||||||
D: Original kernel hacker
|
D: Original kernel hacker
|
||||||
S: 12725 SW Millikan Way, Suite 400
|
S: Portland, Oregon 97005
|
||||||
S: Beaverton, Oregon 97005
|
|
||||||
S: USA
|
S: USA
|
||||||
|
|
||||||
N: Marcelo Tosatti
|
N: Marcelo Tosatti
|
||||||
|
|
|
@ -0,0 +1,20 @@
|
||||||
|
What: /sys/dev
|
||||||
|
Date: April 2008
|
||||||
|
KernelVersion: 2.6.26
|
||||||
|
Contact: Dan Williams <dan.j.williams@intel.com>
|
||||||
|
Description: The /sys/dev tree provides a method to look up the sysfs
|
||||||
|
path for a device using the information returned from
|
||||||
|
stat(2). There are two directories, 'block' and 'char',
|
||||||
|
beneath /sys/dev containing symbolic links with names of
|
||||||
|
the form "<major>:<minor>". These links point to the
|
||||||
|
corresponding sysfs path for the given device.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
$ readlink /sys/dev/block/8:32
|
||||||
|
../../block/sdc
|
||||||
|
|
||||||
|
Entries in /sys/dev/char and /sys/dev/block will be
|
||||||
|
dynamically created and destroyed as devices enter and
|
||||||
|
leave the system.
|
||||||
|
|
||||||
|
Users: mdadm <linux-raid@vger.kernel.org>
|
|
@ -22,3 +22,12 @@ ready and available in memory. The DMA of the "completion indication"
|
||||||
could race with data DMA. Mapping the memory used for completion
|
could race with data DMA. Mapping the memory used for completion
|
||||||
indications with DMA_ATTR_WRITE_BARRIER would prevent the race.
|
indications with DMA_ATTR_WRITE_BARRIER would prevent the race.
|
||||||
|
|
||||||
|
DMA_ATTR_WEAK_ORDERING
|
||||||
|
----------------------
|
||||||
|
|
||||||
|
DMA_ATTR_WEAK_ORDERING specifies that reads and writes to the mapping
|
||||||
|
may be weakly ordered, that is that reads and writes may pass each other.
|
||||||
|
|
||||||
|
Since it is optional for platforms to implement DMA_ATTR_WEAK_ORDERING,
|
||||||
|
those that do not will simply ignore the attribute and exhibit default
|
||||||
|
behavior.
|
||||||
|
|
|
@ -524,6 +524,44 @@ These utilities include endpoint autoconfiguration.
|
||||||
<!-- !Edrivers/usb/gadget/epautoconf.c -->
|
<!-- !Edrivers/usb/gadget/epautoconf.c -->
|
||||||
</sect1>
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="composite"><title>Composite Device Framework</title>
|
||||||
|
|
||||||
|
<para>The core API is sufficient for writing drivers for composite
|
||||||
|
USB devices (with more than one function in a given configuration),
|
||||||
|
and also multi-configuration devices (also more than one function,
|
||||||
|
but not necessarily sharing a given configuration).
|
||||||
|
There is however an optional framework which makes it easier to
|
||||||
|
reuse and combine functions.
|
||||||
|
</para>
|
||||||
|
|
||||||
|
<para>Devices using this framework provide a <emphasis>struct
|
||||||
|
usb_composite_driver</emphasis>, which in turn provides one or
|
||||||
|
more <emphasis>struct usb_configuration</emphasis> instances.
|
||||||
|
Each such configuration includes at least one
|
||||||
|
<emphasis>struct usb_function</emphasis>, which packages a user
|
||||||
|
visible role such as "network link" or "mass storage device".
|
||||||
|
Management functions may also exist, such as "Device Firmware
|
||||||
|
Upgrade".
|
||||||
|
</para>
|
||||||
|
|
||||||
|
!Iinclude/linux/usb/composite.h
|
||||||
|
!Edrivers/usb/gadget/composite.c
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
<sect1 id="functions"><title>Composite Device Functions</title>
|
||||||
|
|
||||||
|
<para>At this writing, a few of the current gadget drivers have
|
||||||
|
been converted to this framework.
|
||||||
|
Near-term plans include converting all of them, except for "gadgetfs".
|
||||||
|
</para>
|
||||||
|
|
||||||
|
!Edrivers/usb/gadget/f_acm.c
|
||||||
|
!Edrivers/usb/gadget/f_serial.c
|
||||||
|
|
||||||
|
</sect1>
|
||||||
|
|
||||||
|
|
||||||
</chapter>
|
</chapter>
|
||||||
|
|
||||||
<chapter id="controllers"><title>Peripheral Controller Drivers</title>
|
<chapter id="controllers"><title>Peripheral Controller Drivers</title>
|
||||||
|
|
|
@ -21,6 +21,18 @@
|
||||||
</affiliation>
|
</affiliation>
|
||||||
</author>
|
</author>
|
||||||
|
|
||||||
|
<copyright>
|
||||||
|
<year>2006-2008</year>
|
||||||
|
<holder>Hans-Jürgen Koch.</holder>
|
||||||
|
</copyright>
|
||||||
|
|
||||||
|
<legalnotice>
|
||||||
|
<para>
|
||||||
|
This documentation is Free Software licensed under the terms of the
|
||||||
|
GPL version 2.
|
||||||
|
</para>
|
||||||
|
</legalnotice>
|
||||||
|
|
||||||
<pubdate>2006-12-11</pubdate>
|
<pubdate>2006-12-11</pubdate>
|
||||||
|
|
||||||
<abstract>
|
<abstract>
|
||||||
|
@ -29,6 +41,12 @@
|
||||||
</abstract>
|
</abstract>
|
||||||
|
|
||||||
<revhistory>
|
<revhistory>
|
||||||
|
<revision>
|
||||||
|
<revnumber>0.5</revnumber>
|
||||||
|
<date>2008-05-22</date>
|
||||||
|
<authorinitials>hjk</authorinitials>
|
||||||
|
<revremark>Added description of write() function.</revremark>
|
||||||
|
</revision>
|
||||||
<revision>
|
<revision>
|
||||||
<revnumber>0.4</revnumber>
|
<revnumber>0.4</revnumber>
|
||||||
<date>2007-11-26</date>
|
<date>2007-11-26</date>
|
||||||
|
@ -57,20 +75,9 @@
|
||||||
</bookinfo>
|
</bookinfo>
|
||||||
|
|
||||||
<chapter id="aboutthisdoc">
|
<chapter id="aboutthisdoc">
|
||||||
<?dbhtml filename="about.html"?>
|
<?dbhtml filename="aboutthis.html"?>
|
||||||
<title>About this document</title>
|
<title>About this document</title>
|
||||||
|
|
||||||
<sect1 id="copyright">
|
|
||||||
<?dbhtml filename="copyright.html"?>
|
|
||||||
<title>Copyright and License</title>
|
|
||||||
<para>
|
|
||||||
Copyright (c) 2006 by Hans-Jürgen Koch.</para>
|
|
||||||
<para>
|
|
||||||
This documentation is Free Software licensed under the terms of the
|
|
||||||
GPL version 2.
|
|
||||||
</para>
|
|
||||||
</sect1>
|
|
||||||
|
|
||||||
<sect1 id="translations">
|
<sect1 id="translations">
|
||||||
<?dbhtml filename="translations.html"?>
|
<?dbhtml filename="translations.html"?>
|
||||||
<title>Translations</title>
|
<title>Translations</title>
|
||||||
|
@ -189,6 +196,30 @@ interested in translating it, please email me
|
||||||
represents the total interrupt count. You can use this number
|
represents the total interrupt count. You can use this number
|
||||||
to figure out if you missed some interrupts.
|
to figure out if you missed some interrupts.
|
||||||
</para>
|
</para>
|
||||||
|
<para>
|
||||||
|
For some hardware that has more than one interrupt source internally,
|
||||||
|
but not separate IRQ mask and status registers, there might be
|
||||||
|
situations where userspace cannot determine what the interrupt source
|
||||||
|
was if the kernel handler disables them by writing to the chip's IRQ
|
||||||
|
register. In such a case, the kernel has to disable the IRQ completely
|
||||||
|
to leave the chip's register untouched. Now the userspace part can
|
||||||
|
determine the cause of the interrupt, but it cannot re-enable
|
||||||
|
interrupts. Another cornercase is chips where re-enabling interrupts
|
||||||
|
is a read-modify-write operation to a combined IRQ status/acknowledge
|
||||||
|
register. This would be racy if a new interrupt occurred
|
||||||
|
simultaneously.
|
||||||
|
</para>
|
||||||
|
<para>
|
||||||
|
To address these problems, UIO also implements a write() function. It
|
||||||
|
is normally not used and can be ignored for hardware that has only a
|
||||||
|
single interrupt source or has separate IRQ mask and status registers.
|
||||||
|
If you need it, however, a write to <filename>/dev/uioX</filename>
|
||||||
|
will call the <function>irqcontrol()</function> function implemented
|
||||||
|
by the driver. You have to write a 32-bit value that is usually either
|
||||||
|
0 or 1 to disable or enable interrupts. If a driver does not implement
|
||||||
|
<function>irqcontrol()</function>, <function>write()</function> will
|
||||||
|
return with <varname>-ENOSYS</varname>.
|
||||||
|
</para>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
To handle interrupts properly, your custom kernel module can
|
To handle interrupts properly, your custom kernel module can
|
||||||
|
@ -362,6 +393,14 @@ device is actually used.
|
||||||
<function>open()</function>, you will probably also want a custom
|
<function>open()</function>, you will probably also want a custom
|
||||||
<function>release()</function> function.
|
<function>release()</function> function.
|
||||||
</para></listitem>
|
</para></listitem>
|
||||||
|
|
||||||
|
<listitem><para>
|
||||||
|
<varname>int (*irqcontrol)(struct uio_info *info, s32 irq_on)
|
||||||
|
</varname>: Optional. If you need to be able to enable or disable
|
||||||
|
interrupts from userspace by writing to <filename>/dev/uioX</filename>,
|
||||||
|
you can implement this function. The parameter <varname>irq_on</varname>
|
||||||
|
will be 0 to disable interrupts and 1 to enable them.
|
||||||
|
</para></listitem>
|
||||||
</itemizedlist>
|
</itemizedlist>
|
||||||
|
|
||||||
<para>
|
<para>
|
||||||
|
|
|
@ -358,7 +358,7 @@ Here is a list of some of the different kernel trees available:
|
||||||
- pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
|
- pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
|
||||||
git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
|
git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
|
||||||
|
|
||||||
- SCSI, James Bottomley <James.Bottomley@SteelEye.com>
|
- SCSI, James Bottomley <James.Bottomley@hansenpartnership.com>
|
||||||
git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
|
git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
|
||||||
|
|
||||||
- x86, Ingo Molnar <mingo@elte.hu>
|
- x86, Ingo Molnar <mingo@elte.hu>
|
||||||
|
|
|
@ -336,3 +336,13 @@ When: After the only user (hal) has seen a release with the patches
|
||||||
Why: Over 1K .text/.data size reduction, data is available in other
|
Why: Over 1K .text/.data size reduction, data is available in other
|
||||||
ways (ioctls)
|
ways (ioctls)
|
||||||
Who: Johannes Berg <johannes@sipsolutions.net>
|
Who: Johannes Berg <johannes@sipsolutions.net>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: CONFIG_NF_CT_ACCT
|
||||||
|
When: 2.6.29
|
||||||
|
Why: Accounting can now be enabled/disabled without kernel recompilation.
|
||||||
|
Currently used only to set a default value for a feature that is also
|
||||||
|
controlled by a kernel/module/sysfs/sysctl parameter.
|
||||||
|
Who: Krzysztof Piotr Oledzki <ole@ans.pl>
|
||||||
|
|
||||||
|
|
|
@ -26,11 +26,11 @@ You can simplify mounting by just typing:
|
||||||
|
|
||||||
this will allocate the first available loopback device (and load loop.o
|
this will allocate the first available loopback device (and load loop.o
|
||||||
kernel module if necessary) automatically. If the loopback driver is not
|
kernel module if necessary) automatically. If the loopback driver is not
|
||||||
loaded automatically, make sure that your kernel is compiled with kmod
|
loaded automatically, make sure that you have compiled the module and
|
||||||
support (CONFIG_KMOD) enabled. Beware that umount will not
|
that modprobe is functioning. Beware that umount will not deallocate
|
||||||
deallocate /dev/loopN device if /etc/mtab file on your system is a
|
/dev/loopN device if /etc/mtab file on your system is a symbolic link to
|
||||||
symbolic link to /proc/mounts. You will need to do it manually using
|
/proc/mounts. You will need to do it manually using "-d" switch of
|
||||||
"-d" switch of losetup(8). Read losetup(8) manpage for more info.
|
losetup(8). Read losetup(8) manpage for more info.
|
||||||
|
|
||||||
To create the BFS image under UnixWare you need to find out first which
|
To create the BFS image under UnixWare you need to find out first which
|
||||||
slice contains it. The command prtvtoc(1M) is your friend:
|
slice contains it. The command prtvtoc(1M) is your friend:
|
||||||
|
|
|
@ -248,6 +248,7 @@ The top level sysfs directory looks like:
|
||||||
block/
|
block/
|
||||||
bus/
|
bus/
|
||||||
class/
|
class/
|
||||||
|
dev/
|
||||||
devices/
|
devices/
|
||||||
firmware/
|
firmware/
|
||||||
net/
|
net/
|
||||||
|
@ -274,6 +275,11 @@ fs/ contains a directory for some filesystems. Currently each
|
||||||
filesystem wanting to export attributes must create its own hierarchy
|
filesystem wanting to export attributes must create its own hierarchy
|
||||||
below fs/ (see ./fuse.txt for an example).
|
below fs/ (see ./fuse.txt for an example).
|
||||||
|
|
||||||
|
dev/ contains two directories char/ and block/. Inside these two
|
||||||
|
directories there are symlinks named <major>:<minor>. These symlinks
|
||||||
|
point to the sysfs directory for the given device. /sys/dev provides a
|
||||||
|
quick way to lookup the sysfs interface for a device from the result of
|
||||||
|
a stat(2) operation.
|
||||||
|
|
||||||
More information can driver-model specific features can be found in
|
More information can driver-model specific features can be found in
|
||||||
Documentation/driver-model/.
|
Documentation/driver-model/.
|
||||||
|
|
|
@ -0,0 +1,137 @@
|
||||||
|
Paravirt_ops on IA64
|
||||||
|
====================
|
||||||
|
21 May 2008, Isaku Yamahata <yamahata@valinux.co.jp>
|
||||||
|
|
||||||
|
|
||||||
|
Introduction
|
||||||
|
------------
|
||||||
|
The aim of this documentation is to help with maintainability and/or to
|
||||||
|
encourage people to use paravirt_ops/IA64.
|
||||||
|
|
||||||
|
paravirt_ops (pv_ops in short) is a way for virtualization support of
|
||||||
|
Linux kernel on x86. Several ways for virtualization support were
|
||||||
|
proposed, paravirt_ops is the winner.
|
||||||
|
On the other hand, now there are also several IA64 virtualization
|
||||||
|
technologies like kvm/IA64, xen/IA64 and many other academic IA64
|
||||||
|
hypervisors so that it is good to add generic virtualization
|
||||||
|
infrastructure on Linux/IA64.
|
||||||
|
|
||||||
|
|
||||||
|
What is paravirt_ops?
|
||||||
|
---------------------
|
||||||
|
It has been developed on x86 as virtualization support via API, not ABI.
|
||||||
|
It allows each hypervisor to override operations which are important for
|
||||||
|
hypervisors at API level. And it allows a single kernel binary to run on
|
||||||
|
all supported execution environments including native machine.
|
||||||
|
Essentially paravirt_ops is a set of function pointers which represent
|
||||||
|
operations corresponding to low level sensitive instructions and high
|
||||||
|
level functionalities in various area. But one significant difference
|
||||||
|
from usual function pointer table is that it allows optimization with
|
||||||
|
binary patch. It is because some of these operations are very
|
||||||
|
performance sensitive and indirect call overhead is not negligible.
|
||||||
|
With binary patch, indirect C function call can be transformed into
|
||||||
|
direct C function call or in-place execution to eliminate the overhead.
|
||||||
|
|
||||||
|
Thus, operations of paravirt_ops are classified into three categories.
|
||||||
|
- simple indirect call
|
||||||
|
These operations correspond to high level functionality so that the
|
||||||
|
overhead of indirect call isn't very important.
|
||||||
|
|
||||||
|
- indirect call which allows optimization with binary patch
|
||||||
|
Usually these operations correspond to low level instructions. They
|
||||||
|
are called frequently and performance critical. So the overhead is
|
||||||
|
very important.
|
||||||
|
|
||||||
|
- a set of macros for hand written assembly code
|
||||||
|
Hand written assembly codes (.S files) also need paravirtualization
|
||||||
|
because they include sensitive instructions or some of code paths in
|
||||||
|
them are very performance critical.
|
||||||
|
|
||||||
|
|
||||||
|
The relation to the IA64 machine vector
|
||||||
|
---------------------------------------
|
||||||
|
Linux/IA64 has the IA64 machine vector functionality which allows the
|
||||||
|
kernel to switch implementations (e.g. initialization, ipi, dma api...)
|
||||||
|
depending on executing platform.
|
||||||
|
We can replace some implementations very easily defining a new machine
|
||||||
|
vector. Thus another approach for virtualization support would be
|
||||||
|
enhancing the machine vector functionality.
|
||||||
|
But paravirt_ops approach was taken because
|
||||||
|
- virtualization support needs wider support than machine vector does.
|
||||||
|
e.g. low level instruction paravirtualization. It must be
|
||||||
|
initialized very early before platform detection.
|
||||||
|
|
||||||
|
- virtualization support needs more functionality like binary patch.
|
||||||
|
Probably the calling overhead might not be very large compared to the
|
||||||
|
emulation overhead of virtualization. However in the native case, the
|
||||||
|
overhead should be eliminated completely.
|
||||||
|
A single kernel binary should run on each environment including native,
|
||||||
|
and the overhead of paravirt_ops on native environment should be as
|
||||||
|
small as possible.
|
||||||
|
|
||||||
|
- for full virtualization technology, e.g. KVM/IA64 or
|
||||||
|
Xen/IA64 HVM domain, the result would be
|
||||||
|
(the emulated platform machine vector. probably dig) + (pv_ops).
|
||||||
|
This means that the virtualization support layer should be under
|
||||||
|
the machine vector layer.
|
||||||
|
|
||||||
|
Possibly it might be better to move some function pointers from
|
||||||
|
paravirt_ops to machine vector. In fact, Xen domU case utilizes both
|
||||||
|
pv_ops and machine vector.
|
||||||
|
|
||||||
|
|
||||||
|
IA64 paravirt_ops
|
||||||
|
-----------------
|
||||||
|
In this section, the concrete paravirt_ops will be discussed.
|
||||||
|
Because of the architecture difference between ia64 and x86, the
|
||||||
|
resulting set of functions is very different from x86 pv_ops.
|
||||||
|
|
||||||
|
- C function pointer tables
|
||||||
|
They are not very performance critical so that simple C indirect
|
||||||
|
function call is acceptable. The following structures are defined at
|
||||||
|
this moment. For details see linux/include/asm-ia64/paravirt.h
|
||||||
|
- struct pv_info
|
||||||
|
This structure describes the execution environment.
|
||||||
|
- struct pv_init_ops
|
||||||
|
This structure describes the various initialization hooks.
|
||||||
|
- struct pv_iosapic_ops
|
||||||
|
This structure describes hooks to iosapic operations.
|
||||||
|
- struct pv_irq_ops
|
||||||
|
This structure describes hooks to irq related operations
|
||||||
|
- struct pv_time_op
|
||||||
|
This structure describes hooks to steal time accounting.
|
||||||
|
|
||||||
|
- a set of indirect calls which need optimization
|
||||||
|
Currently this class of functions correspond to a subset of IA64
|
||||||
|
intrinsics. At this moment the optimization with binary patch isn't
|
||||||
|
implemented yet.
|
||||||
|
struct pv_cpu_op is defined. For details see
|
||||||
|
linux/include/asm-ia64/paravirt_privop.h
|
||||||
|
Mostly they correspond to ia64 intrinsics 1-to-1.
|
||||||
|
Caveat: Now they are defined as C indirect function pointers, but in
|
||||||
|
order to support binary patch optimization, they will be changed
|
||||||
|
using GCC extended inline assembly code.
|
||||||
|
|
||||||
|
- a set of macros for hand written assembly code (.S files)
|
||||||
|
For maintenance purpose, the taken approach for .S files is single
|
||||||
|
source code and compile multiple times with different macros definitions.
|
||||||
|
Each pv_ops instance must define those macros to compile.
|
||||||
|
The important thing here is that sensitive, but non-privileged
|
||||||
|
instructions must be paravirtualized and that some privileged
|
||||||
|
instructions also need paravirtualization for reasonable performance.
|
||||||
|
Developers who modify .S files must be aware of that. At this moment
|
||||||
|
an easy checker is implemented to detect paravirtualization breakage.
|
||||||
|
But it doesn't cover all the cases.
|
||||||
|
|
||||||
|
Sometimes this set of macros is called pv_cpu_asm_op. But there is no
|
||||||
|
corresponding structure in the source code.
|
||||||
|
Those macros mostly 1:1 correspond to a subset of privileged
|
||||||
|
instructions. See linux/include/asm-ia64/native/inst.h.
|
||||||
|
And some functions written in assembly also need to be overrided so
|
||||||
|
that each pv_ops instance have to define some macros. Again see
|
||||||
|
linux/include/asm-ia64/native/inst.h.
|
||||||
|
|
||||||
|
|
||||||
|
Those structures must be initialized very early before start_kernel.
|
||||||
|
Probably initialized in head.S using multi entry point or some other trick.
|
||||||
|
For native case implementation see linux/arch/ia64/kernel/paravirt.c.
|
|
@ -1,5 +1,3 @@
|
||||||
$Id: gameport-programming.txt,v 1.3 2001/04/24 13:51:37 vojtech Exp $
|
|
||||||
|
|
||||||
Programming gameport drivers
|
Programming gameport drivers
|
||||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
Linux Input drivers v1.0
|
Linux Input drivers v1.0
|
||||||
(c) 1999-2001 Vojtech Pavlik <vojtech@ucw.cz>
|
(c) 1999-2001 Vojtech Pavlik <vojtech@ucw.cz>
|
||||||
Sponsored by SuSE
|
Sponsored by SuSE
|
||||||
$Id: input.txt,v 1.8 2002/05/29 03:15:01 bradleym Exp $
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
0. Disclaimer
|
0. Disclaimer
|
||||||
|
|
|
@ -5,8 +5,6 @@
|
||||||
|
|
||||||
7 Aug 1998
|
7 Aug 1998
|
||||||
|
|
||||||
$Id: joystick-api.txt,v 1.2 2001/05/08 21:21:23 vojtech Exp $
|
|
||||||
|
|
||||||
1. Initialization
|
1. Initialization
|
||||||
~~~~~~~~~~~~~~~~~
|
~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,6 @@
|
||||||
(c) 1998-2000 Vojtech Pavlik <vojtech@ucw.cz>
|
(c) 1998-2000 Vojtech Pavlik <vojtech@ucw.cz>
|
||||||
(c) 1998 Andree Borrmann <a.borrmann@tu-bs.de>
|
(c) 1998 Andree Borrmann <a.borrmann@tu-bs.de>
|
||||||
Sponsored by SuSE
|
Sponsored by SuSE
|
||||||
$Id: joystick-parport.txt,v 1.6 2001/09/25 09:31:32 vojtech Exp $
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
0. Disclaimer
|
0. Disclaimer
|
||||||
|
|
|
@ -1,7 +1,6 @@
|
||||||
Linux Joystick driver v2.0.0
|
Linux Joystick driver v2.0.0
|
||||||
(c) 1996-2000 Vojtech Pavlik <vojtech@ucw.cz>
|
(c) 1996-2000 Vojtech Pavlik <vojtech@ucw.cz>
|
||||||
Sponsored by SuSE
|
Sponsored by SuSE
|
||||||
$Id: joystick.txt,v 1.12 2002/03/03 12:13:07 jdeneux Exp $
|
|
||||||
----------------------------------------------------------------------------
|
----------------------------------------------------------------------------
|
||||||
|
|
||||||
0. Disclaimer
|
0. Disclaimer
|
||||||
|
|
|
@ -1206,7 +1206,7 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
or
|
or
|
||||||
memmap=0x10000$0x18690000
|
memmap=0x10000$0x18690000
|
||||||
|
|
||||||
memtest= [KNL,X86_64] Enable memtest
|
memtest= [KNL,X86] Enable memtest
|
||||||
Format: <integer>
|
Format: <integer>
|
||||||
range: 0,4 : pattern number
|
range: 0,4 : pattern number
|
||||||
default : 0 <disable>
|
default : 0 <disable>
|
||||||
|
@ -1279,6 +1279,13 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
This usage is only documented in each driver source
|
This usage is only documented in each driver source
|
||||||
file if at all.
|
file if at all.
|
||||||
|
|
||||||
|
nf_conntrack.acct=
|
||||||
|
[NETFILTER] Enable connection tracking flow accounting
|
||||||
|
0 to disable accounting
|
||||||
|
1 to enable accounting
|
||||||
|
Default value depends on CONFIG_NF_CT_ACCT that is
|
||||||
|
going to be removed in 2.6.29.
|
||||||
|
|
||||||
nfsaddrs= [NFS]
|
nfsaddrs= [NFS]
|
||||||
See Documentation/filesystems/nfsroot.txt.
|
See Documentation/filesystems/nfsroot.txt.
|
||||||
|
|
||||||
|
@ -2158,6 +2165,10 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||||
Note that genuine overcurrent events won't be
|
Note that genuine overcurrent events won't be
|
||||||
reported either.
|
reported either.
|
||||||
|
|
||||||
|
unknown_nmi_panic
|
||||||
|
[X86-32,X86-64]
|
||||||
|
Set unknown_nmi_panic=1 early on boot.
|
||||||
|
|
||||||
usbcore.autosuspend=
|
usbcore.autosuspend=
|
||||||
[USB] The autosuspend time delay (in seconds) used
|
[USB] The autosuspend time delay (in seconds) used
|
||||||
for newly-detected USB devices (default 2). This
|
for newly-detected USB devices (default 2). This
|
||||||
|
|
|
@ -236,6 +236,11 @@ All md devices contain:
|
||||||
writing the word for the desired state, however some states
|
writing the word for the desired state, however some states
|
||||||
cannot be explicitly set, and some transitions are not allowed.
|
cannot be explicitly set, and some transitions are not allowed.
|
||||||
|
|
||||||
|
Select/poll works on this file. All changes except between
|
||||||
|
active_idle and active (which can be frequent and are not
|
||||||
|
very interesting) are notified. active->active_idle is
|
||||||
|
reported if the metadata is externally managed.
|
||||||
|
|
||||||
clear
|
clear
|
||||||
No devices, no size, no level
|
No devices, no size, no level
|
||||||
Writing is equivalent to STOP_ARRAY ioctl
|
Writing is equivalent to STOP_ARRAY ioctl
|
||||||
|
@ -292,6 +297,10 @@ Each directory contains:
|
||||||
writemostly - device will only be subject to read
|
writemostly - device will only be subject to read
|
||||||
requests if there are no other options.
|
requests if there are no other options.
|
||||||
This applies only to raid1 arrays.
|
This applies only to raid1 arrays.
|
||||||
|
blocked - device has failed, metadata is "external",
|
||||||
|
and the failure hasn't been acknowledged yet.
|
||||||
|
Writes that would write to this device if
|
||||||
|
it were not faulty are blocked.
|
||||||
spare - device is working, but not a full member.
|
spare - device is working, but not a full member.
|
||||||
This includes spares that are in the process
|
This includes spares that are in the process
|
||||||
of being recovered to
|
of being recovered to
|
||||||
|
@ -301,6 +310,12 @@ Each directory contains:
|
||||||
Writing "remove" removes the device from the array.
|
Writing "remove" removes the device from the array.
|
||||||
Writing "writemostly" sets the writemostly flag.
|
Writing "writemostly" sets the writemostly flag.
|
||||||
Writing "-writemostly" clears the writemostly flag.
|
Writing "-writemostly" clears the writemostly flag.
|
||||||
|
Writing "blocked" sets the "blocked" flag.
|
||||||
|
Writing "-blocked" clear the "blocked" flag and allows writes
|
||||||
|
to complete.
|
||||||
|
|
||||||
|
This file responds to select/poll. Any change to 'faulty'
|
||||||
|
or 'blocked' causes an event.
|
||||||
|
|
||||||
errors
|
errors
|
||||||
An approximate count of read errors that have been detected on
|
An approximate count of read errors that have been detected on
|
||||||
|
@ -332,7 +347,7 @@ Each directory contains:
|
||||||
for storage of data. This will normally be the same as the
|
for storage of data. This will normally be the same as the
|
||||||
component_size. This can be written while assembling an
|
component_size. This can be written while assembling an
|
||||||
array. If a value less than the current component_size is
|
array. If a value less than the current component_size is
|
||||||
written, component_size will be reduced to this value.
|
written, it will be rejected.
|
||||||
|
|
||||||
|
|
||||||
An active md device will also contain and entry for each active device
|
An active md device will also contain and entry for each active device
|
||||||
|
@ -381,6 +396,19 @@ also have
|
||||||
'check' and 'repair' will start the appropriate process
|
'check' and 'repair' will start the appropriate process
|
||||||
providing the current state is 'idle'.
|
providing the current state is 'idle'.
|
||||||
|
|
||||||
|
This file responds to select/poll. Any important change in the value
|
||||||
|
triggers a poll event. Sometimes the value will briefly be
|
||||||
|
"recover" if a recovery seems to be needed, but cannot be
|
||||||
|
achieved. In that case, the transition to "recover" isn't
|
||||||
|
notified, but the transition away is.
|
||||||
|
|
||||||
|
degraded
|
||||||
|
This contains a count of the number of devices by which the
|
||||||
|
arrays is degraded. So an optimal array with show '0'. A
|
||||||
|
single failed/missing drive will show '1', etc.
|
||||||
|
This file responds to select/poll, any increase or decrease
|
||||||
|
in the count of missing devices will trigger an event.
|
||||||
|
|
||||||
mismatch_count
|
mismatch_count
|
||||||
When performing 'check' and 'repair', and possibly when
|
When performing 'check' and 'repair', and possibly when
|
||||||
performing 'resync', md will count the number of errors that are
|
performing 'resync', md will count the number of errors that are
|
||||||
|
|
|
@ -513,21 +513,11 @@ Additional Configurations
|
||||||
Intel(R) PRO/1000 PT Dual Port Server Connection
|
Intel(R) PRO/1000 PT Dual Port Server Connection
|
||||||
Intel(R) PRO/1000 PT Dual Port Server Adapter
|
Intel(R) PRO/1000 PT Dual Port Server Adapter
|
||||||
Intel(R) PRO/1000 PF Dual Port Server Adapter
|
Intel(R) PRO/1000 PF Dual Port Server Adapter
|
||||||
Intel(R) PRO/1000 PT Quad Port Server Adapter
|
Intel(R) PRO/1000 PT Quad Port Server Adapter
|
||||||
|
|
||||||
NAPI
|
NAPI
|
||||||
----
|
----
|
||||||
NAPI (Rx polling mode) is supported in the e1000 driver. NAPI is enabled
|
NAPI (Rx polling mode) is enabled in the e1000 driver.
|
||||||
or disabled based on the configuration of the kernel. To override
|
|
||||||
the default, use the following compile-time flags.
|
|
||||||
|
|
||||||
To enable NAPI, compile the driver module, passing in a configuration option:
|
|
||||||
|
|
||||||
make CFLAGS_EXTRA=-DE1000_NAPI install
|
|
||||||
|
|
||||||
To disable NAPI, compile the driver module, passing in a configuration option:
|
|
||||||
|
|
||||||
make CFLAGS_EXTRA=-DE1000_NO_NAPI install
|
|
||||||
|
|
||||||
See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI.
|
See www.cyberus.ca/~hadi/usenix-paper.tgz for more information on NAPI.
|
||||||
|
|
||||||
|
|
|
@ -148,7 +148,7 @@
|
||||||
getsockopt(sockfd, SOL_SOCKET, SO_NO_CHECK, &value, ...);
|
getsockopt(sockfd, SOL_SOCKET, SO_NO_CHECK, &value, ...);
|
||||||
|
|
||||||
is meaningless (as in TCP). Packets with a zero checksum field are
|
is meaningless (as in TCP). Packets with a zero checksum field are
|
||||||
illegal (cf. RFC 3828, sec. 3.1) will be silently discarded.
|
illegal (cf. RFC 3828, sec. 3.1) and will be silently discarded.
|
||||||
|
|
||||||
4) Fragmentation
|
4) Fragmentation
|
||||||
|
|
||||||
|
|
|
@ -89,10 +89,12 @@ Table of Contents
|
||||||
3) OpenPIC Interrupt Controllers
|
3) OpenPIC Interrupt Controllers
|
||||||
4) ISA Interrupt Controllers
|
4) ISA Interrupt Controllers
|
||||||
|
|
||||||
VIII - Specifying GPIO information for devices
|
IX - Specifying GPIO information for devices
|
||||||
1) gpios property
|
1) gpios property
|
||||||
2) gpio-controller nodes
|
2) gpio-controller nodes
|
||||||
|
|
||||||
|
X - Specifying device power management information (sleep property)
|
||||||
|
|
||||||
Appendix A - Sample SOC node for MPC8540
|
Appendix A - Sample SOC node for MPC8540
|
||||||
|
|
||||||
|
|
||||||
|
@ -2488,8 +2490,8 @@ encodings listed below:
|
||||||
2 = high to low edge sensitive type enabled
|
2 = high to low edge sensitive type enabled
|
||||||
3 = low to high edge sensitive type enabled
|
3 = low to high edge sensitive type enabled
|
||||||
|
|
||||||
VIII - Specifying GPIO information for devices
|
IX - Specifying GPIO information for devices
|
||||||
==============================================
|
============================================
|
||||||
|
|
||||||
1) gpios property
|
1) gpios property
|
||||||
-----------------
|
-----------------
|
||||||
|
@ -2537,116 +2539,151 @@ Example of two SOC GPIO banks defined as gpio-controller nodes:
|
||||||
gpio-controller;
|
gpio-controller;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
X - Specifying Device Power Management Information (sleep property)
|
||||||
|
===================================================================
|
||||||
|
|
||||||
|
Devices on SOCs often have mechanisms for placing devices into low-power
|
||||||
|
states that are decoupled from the devices' own register blocks. Sometimes,
|
||||||
|
this information is more complicated than a cell-index property can
|
||||||
|
reasonably describe. Thus, each device controlled in such a manner
|
||||||
|
may contain a "sleep" property which describes these connections.
|
||||||
|
|
||||||
|
The sleep property consists of one or more sleep resources, each of
|
||||||
|
which consists of a phandle to a sleep controller, followed by a
|
||||||
|
controller-specific sleep specifier of zero or more cells.
|
||||||
|
|
||||||
|
The semantics of what type of low power modes are possible are defined
|
||||||
|
by the sleep controller. Some examples of the types of low power modes
|
||||||
|
that may be supported are:
|
||||||
|
|
||||||
|
- Dynamic: The device may be disabled or enabled at any time.
|
||||||
|
- System Suspend: The device may request to be disabled or remain
|
||||||
|
awake during system suspend, but will not be disabled until then.
|
||||||
|
- Permanent: The device is disabled permanently (until the next hard
|
||||||
|
reset).
|
||||||
|
|
||||||
|
Some devices may share a clock domain with each other, such that they should
|
||||||
|
only be suspended when none of the devices are in use. Where reasonable,
|
||||||
|
such nodes should be placed on a virtual bus, where the bus has the sleep
|
||||||
|
property. If the clock domain is shared among devices that cannot be
|
||||||
|
reasonably grouped in this manner, then create a virtual sleep controller
|
||||||
|
(similar to an interrupt nexus, except that defining a standardized
|
||||||
|
sleep-map should wait until its necessity is demonstrated).
|
||||||
|
|
||||||
Appendix A - Sample SOC node for MPC8540
|
Appendix A - Sample SOC node for MPC8540
|
||||||
========================================
|
========================================
|
||||||
|
|
||||||
Note that the #address-cells and #size-cells for the SoC node
|
soc@e0000000 {
|
||||||
in this example have been explicitly listed; these are likely
|
|
||||||
not necessary as they are usually the same as the root node.
|
|
||||||
|
|
||||||
soc8540@e0000000 {
|
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
#interrupt-cells = <2>;
|
compatible = "fsl,mpc8540-ccsr", "simple-bus";
|
||||||
device_type = "soc";
|
device_type = "soc";
|
||||||
ranges = <00000000 e0000000 00100000>
|
ranges = <0x00000000 0xe0000000 0x00100000>
|
||||||
reg = <e0000000 00003000>;
|
|
||||||
bus-frequency = <0>;
|
bus-frequency = <0>;
|
||||||
|
interrupt-parent = <&pic>;
|
||||||
mdio@24520 {
|
|
||||||
reg = <24520 20>;
|
|
||||||
device_type = "mdio";
|
|
||||||
compatible = "gianfar";
|
|
||||||
|
|
||||||
ethernet-phy@0 {
|
|
||||||
linux,phandle = <2452000>
|
|
||||||
interrupt-parent = <40000>;
|
|
||||||
interrupts = <35 1>;
|
|
||||||
reg = <0>;
|
|
||||||
device_type = "ethernet-phy";
|
|
||||||
};
|
|
||||||
|
|
||||||
ethernet-phy@1 {
|
|
||||||
linux,phandle = <2452001>
|
|
||||||
interrupt-parent = <40000>;
|
|
||||||
interrupts = <35 1>;
|
|
||||||
reg = <1>;
|
|
||||||
device_type = "ethernet-phy";
|
|
||||||
};
|
|
||||||
|
|
||||||
ethernet-phy@3 {
|
|
||||||
linux,phandle = <2452002>
|
|
||||||
interrupt-parent = <40000>;
|
|
||||||
interrupts = <35 1>;
|
|
||||||
reg = <3>;
|
|
||||||
device_type = "ethernet-phy";
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
|
||||||
|
|
||||||
ethernet@24000 {
|
ethernet@24000 {
|
||||||
#size-cells = <0>;
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
device_type = "network";
|
device_type = "network";
|
||||||
model = "TSEC";
|
model = "TSEC";
|
||||||
compatible = "gianfar";
|
compatible = "gianfar", "simple-bus";
|
||||||
reg = <24000 1000>;
|
reg = <0x24000 0x1000>;
|
||||||
mac-address = [ 00 E0 0C 00 73 00 ];
|
local-mac-address = [ 00 E0 0C 00 73 00 ];
|
||||||
interrupts = <d 3 e 3 12 3>;
|
interrupts = <29 2 30 2 34 2>;
|
||||||
interrupt-parent = <40000>;
|
phy-handle = <&phy0>;
|
||||||
phy-handle = <2452000>;
|
sleep = <&pmc 00000080>;
|
||||||
|
ranges;
|
||||||
|
|
||||||
|
mdio@24520 {
|
||||||
|
reg = <0x24520 0x20>;
|
||||||
|
compatible = "fsl,gianfar-mdio";
|
||||||
|
|
||||||
|
phy0: ethernet-phy@0 {
|
||||||
|
interrupts = <5 1>;
|
||||||
|
reg = <0>;
|
||||||
|
device_type = "ethernet-phy";
|
||||||
|
};
|
||||||
|
|
||||||
|
phy1: ethernet-phy@1 {
|
||||||
|
interrupts = <5 1>;
|
||||||
|
reg = <1>;
|
||||||
|
device_type = "ethernet-phy";
|
||||||
|
};
|
||||||
|
|
||||||
|
phy3: ethernet-phy@3 {
|
||||||
|
interrupts = <7 1>;
|
||||||
|
reg = <3>;
|
||||||
|
device_type = "ethernet-phy";
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
ethernet@25000 {
|
ethernet@25000 {
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
device_type = "network";
|
device_type = "network";
|
||||||
model = "TSEC";
|
model = "TSEC";
|
||||||
compatible = "gianfar";
|
compatible = "gianfar";
|
||||||
reg = <25000 1000>;
|
reg = <0x25000 0x1000>;
|
||||||
mac-address = [ 00 E0 0C 00 73 01 ];
|
local-mac-address = [ 00 E0 0C 00 73 01 ];
|
||||||
interrupts = <13 3 14 3 18 3>;
|
interrupts = <13 2 14 2 18 2>;
|
||||||
interrupt-parent = <40000>;
|
phy-handle = <&phy1>;
|
||||||
phy-handle = <2452001>;
|
sleep = <&pmc 00000040>;
|
||||||
};
|
};
|
||||||
|
|
||||||
ethernet@26000 {
|
ethernet@26000 {
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
device_type = "network";
|
device_type = "network";
|
||||||
model = "FEC";
|
model = "FEC";
|
||||||
compatible = "gianfar";
|
compatible = "gianfar";
|
||||||
reg = <26000 1000>;
|
reg = <0x26000 0x1000>;
|
||||||
mac-address = [ 00 E0 0C 00 73 02 ];
|
local-mac-address = [ 00 E0 0C 00 73 02 ];
|
||||||
interrupts = <19 3>;
|
interrupts = <41 2>;
|
||||||
interrupt-parent = <40000>;
|
phy-handle = <&phy3>;
|
||||||
phy-handle = <2452002>;
|
sleep = <&pmc 00000020>;
|
||||||
};
|
};
|
||||||
|
|
||||||
serial@4500 {
|
serial@4500 {
|
||||||
device_type = "serial";
|
#address-cells = <1>;
|
||||||
compatible = "ns16550";
|
#size-cells = <1>;
|
||||||
reg = <4500 100>;
|
compatible = "fsl,mpc8540-duart", "simple-bus";
|
||||||
clock-frequency = <0>;
|
sleep = <&pmc 00000002>;
|
||||||
interrupts = <1a 3>;
|
ranges;
|
||||||
interrupt-parent = <40000>;
|
|
||||||
|
serial@4500 {
|
||||||
|
device_type = "serial";
|
||||||
|
compatible = "ns16550";
|
||||||
|
reg = <0x4500 0x100>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
interrupts = <42 2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
serial@4600 {
|
||||||
|
device_type = "serial";
|
||||||
|
compatible = "ns16550";
|
||||||
|
reg = <0x4600 0x100>;
|
||||||
|
clock-frequency = <0>;
|
||||||
|
interrupts = <42 2>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
pic@40000 {
|
pic: pic@40000 {
|
||||||
linux,phandle = <40000>;
|
|
||||||
interrupt-controller;
|
interrupt-controller;
|
||||||
#address-cells = <0>;
|
#address-cells = <0>;
|
||||||
reg = <40000 40000>;
|
#interrupt-cells = <2>;
|
||||||
|
reg = <0x40000 0x40000>;
|
||||||
compatible = "chrp,open-pic";
|
compatible = "chrp,open-pic";
|
||||||
device_type = "open-pic";
|
device_type = "open-pic";
|
||||||
};
|
};
|
||||||
|
|
||||||
i2c@3000 {
|
i2c@3000 {
|
||||||
interrupt-parent = <40000>;
|
interrupts = <43 2>;
|
||||||
interrupts = <1b 3>;
|
reg = <0x3000 0x100>;
|
||||||
reg = <3000 18>;
|
|
||||||
device_type = "i2c";
|
|
||||||
compatible = "fsl-i2c";
|
compatible = "fsl-i2c";
|
||||||
dfsrr;
|
dfsrr;
|
||||||
|
sleep = <&pmc 00000004>;
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pmc: power@e0070 {
|
||||||
|
compatible = "fsl,mpc8540-pmc", "fsl,mpc8548-pmc";
|
||||||
|
reg = <0xe0070 0x20>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,38 @@
|
||||||
|
Every GPIO controller node must have #gpio-cells property defined,
|
||||||
|
this information will be used to translate gpio-specifiers.
|
||||||
|
|
||||||
|
On CPM1 devices, all ports are using slightly different register layouts.
|
||||||
|
Ports A, C and D are 16bit ports and Ports B and E are 32bit ports.
|
||||||
|
|
||||||
|
On CPM2 devices, all ports are 32bit ports and use a common register layout.
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible : "fsl,cpm1-pario-bank-a", "fsl,cpm1-pario-bank-b",
|
||||||
|
"fsl,cpm1-pario-bank-c", "fsl,cpm1-pario-bank-d",
|
||||||
|
"fsl,cpm1-pario-bank-e", "fsl,cpm2-pario-bank"
|
||||||
|
- #gpio-cells : Should be two. The first cell is the pin number and the
|
||||||
|
second cell is used to specify optional paramters (currently unused).
|
||||||
|
- gpio-controller : Marks the port as GPIO controller.
|
||||||
|
|
||||||
|
Example of three SOC GPIO banks defined as gpio-controller nodes:
|
||||||
|
|
||||||
|
CPM1_PIO_A: gpio-controller@950 {
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
compatible = "fsl,cpm1-pario-bank-a";
|
||||||
|
reg = <0x950 0x10>;
|
||||||
|
gpio-controller;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPM1_PIO_B: gpio-controller@ab8 {
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
compatible = "fsl,cpm1-pario-bank-b";
|
||||||
|
reg = <0xab8 0x10>;
|
||||||
|
gpio-controller;
|
||||||
|
};
|
||||||
|
|
||||||
|
CPM1_PIO_E: gpio-controller@ac8 {
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
compatible = "fsl,cpm1-pario-bank-e";
|
||||||
|
reg = <0xac8 0x18>;
|
||||||
|
gpio-controller;
|
||||||
|
};
|
|
@ -1,22 +1,37 @@
|
||||||
* USB (Universal Serial Bus Controller)
|
Freescale QUICC Engine USB Controller
|
||||||
|
|
||||||
Required properties:
|
Required properties:
|
||||||
- compatible : could be "qe_udc" or "fhci-hcd".
|
- compatible : should be "fsl,<chip>-qe-usb", "fsl,mpc8323-qe-usb".
|
||||||
- mode : the could be "host" or "slave".
|
- reg : the first two cells should contain usb registers location and
|
||||||
- reg : Offset and length of the register set for the device
|
length, the next two two cells should contain PRAM location and
|
||||||
- interrupts : <a b> where a is the interrupt number and b is a
|
length.
|
||||||
field that represents an encoding of the sense and level
|
- interrupts : should contain USB interrupt.
|
||||||
information for the interrupt. This should be encoded based on
|
- interrupt-parent : interrupt source phandle.
|
||||||
the information in section 2) depending on the type of interrupt
|
- fsl,fullspeed-clock : specifies the full speed USB clock source:
|
||||||
controller you have.
|
"none": clock source is disabled
|
||||||
- interrupt-parent : the phandle for the interrupt controller that
|
"brg1" through "brg16": clock source is BRG1-BRG16, respectively
|
||||||
services interrupts for this device.
|
"clk1" through "clk24": clock source is CLK1-CLK24, respectively
|
||||||
|
- fsl,lowspeed-clock : specifies the low speed USB clock source:
|
||||||
|
"none": clock source is disabled
|
||||||
|
"brg1" through "brg16": clock source is BRG1-BRG16, respectively
|
||||||
|
"clk1" through "clk24": clock source is CLK1-CLK24, respectively
|
||||||
|
- hub-power-budget : USB power budget for the root hub, in mA.
|
||||||
|
- gpios : should specify GPIOs in this order: USBOE, USBTP, USBTN, USBRP,
|
||||||
|
USBRN, SPEED (optional), and POWER (optional).
|
||||||
|
|
||||||
Example(slave):
|
Example:
|
||||||
usb@6c0 {
|
|
||||||
compatible = "qe_udc";
|
usb@6c0 {
|
||||||
reg = <6c0 40>;
|
compatible = "fsl,mpc8360-qe-usb", "fsl,mpc8323-qe-usb";
|
||||||
interrupts = <8b 0>;
|
reg = <0x6c0 0x40 0x8b00 0x100>;
|
||||||
interrupt-parent = <700>;
|
interrupts = <11>;
|
||||||
mode = "slave";
|
interrupt-parent = <&qeic>;
|
||||||
};
|
fsl,fullspeed-clock = "clk21";
|
||||||
|
gpios = <&qe_pio_b 2 0 /* USBOE */
|
||||||
|
&qe_pio_b 3 0 /* USBTP */
|
||||||
|
&qe_pio_b 8 0 /* USBTN */
|
||||||
|
&qe_pio_b 9 0 /* USBRP */
|
||||||
|
&qe_pio_b 11 0 /* USBRN */
|
||||||
|
&qe_pio_e 20 0 /* SPEED */
|
||||||
|
&qe_pio_e 21 0 /* POWER */>;
|
||||||
|
};
|
||||||
|
|
|
@ -0,0 +1,17 @@
|
||||||
|
Freescale MPC8349E-mITX-compatible Power Management Micro Controller Unit (MCU)
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible : "fsl,<mcu-chip>-<board>", "fsl,mcu-mpc8349emitx".
|
||||||
|
- reg : should specify I2C address (0x0a).
|
||||||
|
- #gpio-cells : should be 2.
|
||||||
|
- gpio-controller : should be present.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
mcu@0a {
|
||||||
|
#gpio-cells = <2>;
|
||||||
|
compatible = "fsl,mc9s08qg8-mpc8349emitx",
|
||||||
|
"fsl,mcu-mpc8349emitx";
|
||||||
|
reg = <0x0a>;
|
||||||
|
gpio-controller;
|
||||||
|
};
|
|
@ -0,0 +1,63 @@
|
||||||
|
* Power Management Controller
|
||||||
|
|
||||||
|
Properties:
|
||||||
|
- compatible: "fsl,<chip>-pmc".
|
||||||
|
|
||||||
|
"fsl,mpc8349-pmc" should be listed for any chip whose PMC is
|
||||||
|
compatible. "fsl,mpc8313-pmc" should also be listed for any chip
|
||||||
|
whose PMC is compatible, and implies deep-sleep capability.
|
||||||
|
|
||||||
|
"fsl,mpc8548-pmc" should be listed for any chip whose PMC is
|
||||||
|
compatible. "fsl,mpc8536-pmc" should also be listed for any chip
|
||||||
|
whose PMC is compatible, and implies deep-sleep capability.
|
||||||
|
|
||||||
|
"fsl,mpc8641d-pmc" should be listed for any chip whose PMC is
|
||||||
|
compatible; all statements below that apply to "fsl,mpc8548-pmc" also
|
||||||
|
apply to "fsl,mpc8641d-pmc".
|
||||||
|
|
||||||
|
Compatibility does not include bit assigments in SCCR/PMCDR/DEVDISR; these
|
||||||
|
bit assigments are indicated via the sleep specifier in each device's
|
||||||
|
sleep property.
|
||||||
|
|
||||||
|
- reg: For devices compatible with "fsl,mpc8349-pmc", the first resource
|
||||||
|
is the PMC block, and the second resource is the Clock Configuration
|
||||||
|
block.
|
||||||
|
|
||||||
|
For devices compatible with "fsl,mpc8548-pmc", the first resource
|
||||||
|
is a 32-byte block beginning with DEVDISR.
|
||||||
|
|
||||||
|
- interrupts: For "fsl,mpc8349-pmc"-compatible devices, the first
|
||||||
|
resource is the PMC block interrupt.
|
||||||
|
|
||||||
|
- fsl,mpc8313-wakeup-timer: For "fsl,mpc8313-pmc"-compatible devices,
|
||||||
|
this is a phandle to an "fsl,gtm" node on which timer 4 can be used as
|
||||||
|
a wakeup source from deep sleep.
|
||||||
|
|
||||||
|
Sleep specifiers:
|
||||||
|
|
||||||
|
fsl,mpc8349-pmc: Sleep specifiers consist of one cell. For each bit
|
||||||
|
that is set in the cell, the corresponding bit in SCCR will be saved
|
||||||
|
and cleared on suspend, and restored on resume. This sleep controller
|
||||||
|
supports disabling and resuming devices at any time.
|
||||||
|
|
||||||
|
fsl,mpc8536-pmc: Sleep specifiers consist of three cells, the third of
|
||||||
|
which will be ORed into PMCDR upon suspend, and cleared from PMCDR
|
||||||
|
upon resume. The first two cells are as described for fsl,mpc8578-pmc.
|
||||||
|
This sleep controller only supports disabling devices during system
|
||||||
|
sleep, or permanently.
|
||||||
|
|
||||||
|
fsl,mpc8548-pmc: Sleep specifiers consist of one or two cells, the
|
||||||
|
first of which will be ORed into DEVDISR (and the second into
|
||||||
|
DEVDISR2, if present -- this cell should be zero or absent if the
|
||||||
|
hardware does not have DEVDISR2) upon a request for permanent device
|
||||||
|
disabling. This sleep controller does not support configuring devices
|
||||||
|
to disable during system sleep (unless supported by another compatible
|
||||||
|
match), or dynamically.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
power@b00 {
|
||||||
|
compatible = "fsl,mpc8313-pmc", "fsl,mpc8349-pmc";
|
||||||
|
reg = <0xb00 0x100 0xa00 0x100>;
|
||||||
|
interrupts = <80 8>;
|
||||||
|
};
|
|
@ -24,46 +24,39 @@ Example:
|
||||||
|
|
||||||
* Gianfar-compatible ethernet nodes
|
* Gianfar-compatible ethernet nodes
|
||||||
|
|
||||||
Required properties:
|
Properties:
|
||||||
|
|
||||||
- device_type : Should be "network"
|
- device_type : Should be "network"
|
||||||
- model : Model of the device. Can be "TSEC", "eTSEC", or "FEC"
|
- model : Model of the device. Can be "TSEC", "eTSEC", or "FEC"
|
||||||
- compatible : Should be "gianfar"
|
- compatible : Should be "gianfar"
|
||||||
- reg : Offset and length of the register set for the device
|
- reg : Offset and length of the register set for the device
|
||||||
- mac-address : List of bytes representing the ethernet address of
|
- local-mac-address : List of bytes representing the ethernet address of
|
||||||
this controller
|
this controller
|
||||||
- interrupts : <a b> where a is the interrupt number and b is a
|
- interrupts : For FEC devices, the first interrupt is the device's
|
||||||
field that represents an encoding of the sense and level
|
interrupt. For TSEC and eTSEC devices, the first interrupt is
|
||||||
information for the interrupt. This should be encoded based on
|
transmit, the second is receive, and the third is error.
|
||||||
the information in section 2) depending on the type of interrupt
|
|
||||||
controller you have.
|
|
||||||
- interrupt-parent : the phandle for the interrupt controller that
|
|
||||||
services interrupts for this device.
|
|
||||||
- phy-handle : The phandle for the PHY connected to this ethernet
|
- phy-handle : The phandle for the PHY connected to this ethernet
|
||||||
controller.
|
controller.
|
||||||
- fixed-link : <a b c d e> where a is emulated phy id - choose any,
|
- fixed-link : <a b c d e> where a is emulated phy id - choose any,
|
||||||
but unique to the all specified fixed-links, b is duplex - 0 half,
|
but unique to the all specified fixed-links, b is duplex - 0 half,
|
||||||
1 full, c is link speed - d#10/d#100/d#1000, d is pause - 0 no
|
1 full, c is link speed - d#10/d#100/d#1000, d is pause - 0 no
|
||||||
pause, 1 pause, e is asym_pause - 0 no asym_pause, 1 asym_pause.
|
pause, 1 pause, e is asym_pause - 0 no asym_pause, 1 asym_pause.
|
||||||
|
|
||||||
Recommended properties:
|
|
||||||
|
|
||||||
- phy-connection-type : a string naming the controller/PHY interface type,
|
- phy-connection-type : a string naming the controller/PHY interface type,
|
||||||
i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id", "sgmii",
|
i.e., "mii" (default), "rmii", "gmii", "rgmii", "rgmii-id", "sgmii",
|
||||||
"tbi", or "rtbi". This property is only really needed if the connection
|
"tbi", or "rtbi". This property is only really needed if the connection
|
||||||
is of type "rgmii-id", as all other connection types are detected by
|
is of type "rgmii-id", as all other connection types are detected by
|
||||||
hardware.
|
hardware.
|
||||||
|
- fsl,magic-packet : If present, indicates that the hardware supports
|
||||||
|
waking up via magic packet.
|
||||||
|
|
||||||
Example:
|
Example:
|
||||||
ethernet@24000 {
|
ethernet@24000 {
|
||||||
#size-cells = <0>;
|
|
||||||
device_type = "network";
|
device_type = "network";
|
||||||
model = "TSEC";
|
model = "TSEC";
|
||||||
compatible = "gianfar";
|
compatible = "gianfar";
|
||||||
reg = <24000 1000>;
|
reg = <0x24000 0x1000>;
|
||||||
mac-address = [ 00 E0 0C 00 73 00 ];
|
local-mac-address = [ 00 E0 0C 00 73 00 ];
|
||||||
interrupts = <d 3 e 3 12 3>;
|
interrupts = <29 2 30 2 34 2>;
|
||||||
interrupt-parent = <40000>;
|
interrupt-parent = <&mpic>;
|
||||||
phy-handle = <2452000>
|
phy-handle = <&phy0>
|
||||||
};
|
};
|
||||||
|
|
|
@ -0,0 +1,28 @@
|
||||||
|
Freescale Localbus UPM programmed to work with NAND flash
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible : "fsl,upm-nand".
|
||||||
|
- reg : should specify localbus chip select and size used for the chip.
|
||||||
|
- fsl,upm-addr-offset : UPM pattern offset for the address latch.
|
||||||
|
- fsl,upm-cmd-offset : UPM pattern offset for the command latch.
|
||||||
|
- gpios : may specify optional GPIO connected to the Ready-Not-Busy pin.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
upm@1,0 {
|
||||||
|
compatible = "fsl,upm-nand";
|
||||||
|
reg = <1 0 1>;
|
||||||
|
fsl,upm-addr-offset = <16>;
|
||||||
|
fsl,upm-cmd-offset = <8>;
|
||||||
|
gpios = <&qe_pio_e 18 0>;
|
||||||
|
|
||||||
|
flash {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "...";
|
||||||
|
|
||||||
|
partition@0 {
|
||||||
|
...
|
||||||
|
};
|
||||||
|
};
|
||||||
|
};
|
|
@ -0,0 +1,15 @@
|
||||||
|
LED connected to GPIO
|
||||||
|
|
||||||
|
Required properties:
|
||||||
|
- compatible : should be "gpio-led".
|
||||||
|
- label : (optional) the label for this LED. If omitted, the label is
|
||||||
|
taken from the node name (excluding the unit address).
|
||||||
|
- gpios : should specify LED GPIO.
|
||||||
|
|
||||||
|
Example:
|
||||||
|
|
||||||
|
led@0 {
|
||||||
|
compatible = "gpio-led";
|
||||||
|
label = "hdd";
|
||||||
|
gpios = <&mcu_pio 0 1>;
|
||||||
|
};
|
|
@ -42,7 +42,7 @@
|
||||||
<sect1><title>Device Components</title>
|
<sect1><title>Device Components</title>
|
||||||
!Esound/core/device.c
|
!Esound/core/device.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>KMOD and Device File Entries</title>
|
<sect1><title>Module requests and Device File Entries</title>
|
||||||
!Esound/core/sound.c
|
!Esound/core/sound.c
|
||||||
</sect1>
|
</sect1>
|
||||||
<sect1><title>Memory Management Helpers</title>
|
<sect1><title>Memory Management Helpers</title>
|
||||||
|
|
|
@ -270,8 +270,8 @@ The pinout of the connectors on the IO8+ is:
|
||||||
Hardware handshaking issues.
|
Hardware handshaking issues.
|
||||||
============================
|
============================
|
||||||
|
|
||||||
The driver can be compiled in two different ways. The default
|
The driver can be told to operate in two different ways. The default
|
||||||
("Specialix DTR/RTS pin is RTS" is off) the pin behaves as DTR when
|
behaviour is specialix.sx_rtscts = 0 where the pin behaves as DTR when
|
||||||
hardware handshaking is off. It behaves as the RTS hardware
|
hardware handshaking is off. It behaves as the RTS hardware
|
||||||
handshaking signal when hardware handshaking is selected.
|
handshaking signal when hardware handshaking is selected.
|
||||||
|
|
||||||
|
@ -280,7 +280,7 @@ cable will either be compatible with hardware handshaking or with
|
||||||
software handshaking. So switching on the fly is not really an
|
software handshaking. So switching on the fly is not really an
|
||||||
option.
|
option.
|
||||||
|
|
||||||
I actually prefer to use the "Specialix DTR/RTS pin is RTS" option.
|
I actually prefer to use the "specialix.sx_rtscts=1" option.
|
||||||
This makes the DTR/RTS pin always an RTS pin, and ioctls to
|
This makes the DTR/RTS pin always an RTS pin, and ioctls to
|
||||||
change DTR are always ignored. I have a cable that is configured
|
change DTR are always ignored. I have a cable that is configured
|
||||||
for this.
|
for this.
|
||||||
|
@ -379,7 +379,5 @@ it doesn't fit in your computer, bring back the card.
|
||||||
You have to WRITE to the address register to even
|
You have to WRITE to the address register to even
|
||||||
read-probe a CD186x register. Disable autodetection?
|
read-probe a CD186x register. Disable autodetection?
|
||||||
-- Specialix: any suggestions?
|
-- Specialix: any suggestions?
|
||||||
- Arbitrary baud rates are not implemented yet.
|
|
||||||
If you need this, bug me about it.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -3,9 +3,8 @@ Rules on how to access information in the Linux kernel sysfs
|
||||||
The kernel-exported sysfs exports internal kernel implementation details
|
The kernel-exported sysfs exports internal kernel implementation details
|
||||||
and depends on internal kernel structures and layout. It is agreed upon
|
and depends on internal kernel structures and layout. It is agreed upon
|
||||||
by the kernel developers that the Linux kernel does not provide a stable
|
by the kernel developers that the Linux kernel does not provide a stable
|
||||||
internal API. As sysfs is a direct export of kernel internal
|
internal API. Therefore, there are aspects of the sysfs interface that
|
||||||
structures, the sysfs interface cannot provide a stable interface either;
|
may not be stable across kernel releases.
|
||||||
it may always change along with internal kernel changes.
|
|
||||||
|
|
||||||
To minimize the risk of breaking users of sysfs, which are in most cases
|
To minimize the risk of breaking users of sysfs, which are in most cases
|
||||||
low-level userspace applications, with a new kernel release, the users
|
low-level userspace applications, with a new kernel release, the users
|
||||||
|
|
|
@ -305,21 +305,14 @@ driver, like this:
|
||||||
|
|
||||||
which will result in the needed drivers getting loaded automatically.
|
which will result in the needed drivers getting loaded automatically.
|
||||||
|
|
||||||
g. if you are planning on using kerneld to automatically load the
|
g. if you are planning on having the kernel automatically request
|
||||||
module for you, then you need to edit /etc/conf.modules and add the
|
the module for you, then you need to edit /etc/conf.modules and add the
|
||||||
following lines:
|
following lines:
|
||||||
|
|
||||||
options ixj dspio=0x340 xio=0x330 ixjdebug=0
|
options ixj dspio=0x340 xio=0x330 ixjdebug=0
|
||||||
|
|
||||||
If you do this, then when you execute an application that uses the
|
If you do this, then when you execute an application that uses the
|
||||||
module kerneld will load the module for you. Note that to do this,
|
module the kernel will request that it is loaded.
|
||||||
you need to have your kernel set to support kerneld. You can check
|
|
||||||
for this by looking at /usr/src/linux/.config and you should see this:
|
|
||||||
|
|
||||||
# Loadable module support
|
|
||||||
#
|
|
||||||
<snip>
|
|
||||||
CONFIG_KMOD=y
|
|
||||||
|
|
||||||
h. if you want non-root users to be able to read and write to the
|
h. if you want non-root users to be able to read and write to the
|
||||||
ixj devices (this is a good idea!) you should do the following:
|
ixj devices (this is a good idea!) you should do the following:
|
||||||
|
|
|
@ -1,6 +1,7 @@
|
||||||
|
|
||||||
Linux Gadget Serial Driver v2.0
|
Linux Gadget Serial Driver v2.0
|
||||||
11/20/2004
|
11/20/2004
|
||||||
|
(updated 8-May-2008 for v2.3)
|
||||||
|
|
||||||
|
|
||||||
License and Disclaimer
|
License and Disclaimer
|
||||||
|
@ -31,7 +32,7 @@ Prerequisites
|
||||||
-------------
|
-------------
|
||||||
Versions of the gadget serial driver are available for the
|
Versions of the gadget serial driver are available for the
|
||||||
2.4 Linux kernels, but this document assumes you are using
|
2.4 Linux kernels, but this document assumes you are using
|
||||||
version 2.0 or later of the gadget serial driver in a 2.6
|
version 2.3 or later of the gadget serial driver in a 2.6
|
||||||
Linux kernel.
|
Linux kernel.
|
||||||
|
|
||||||
This document assumes that you are familiar with Linux and
|
This document assumes that you are familiar with Linux and
|
||||||
|
@ -40,6 +41,12 @@ standard utilities, use minicom and HyperTerminal, and work with
|
||||||
USB and serial devices. It also assumes you configure the Linux
|
USB and serial devices. It also assumes you configure the Linux
|
||||||
gadget and usb drivers as modules.
|
gadget and usb drivers as modules.
|
||||||
|
|
||||||
|
With version 2.3 of the driver, major and minor device nodes are
|
||||||
|
no longer statically defined. Your Linux based system should mount
|
||||||
|
sysfs in /sys, and use "mdev" (in Busybox) or "udev" to make the
|
||||||
|
/dev nodes matching the sysfs /sys/class/tty files.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Overview
|
Overview
|
||||||
--------
|
--------
|
||||||
|
@ -104,15 +111,8 @@ driver. All this are listed under "USB Gadget Support" when
|
||||||
configuring the kernel. Then rebuild and install the kernel or
|
configuring the kernel. Then rebuild and install the kernel or
|
||||||
modules.
|
modules.
|
||||||
|
|
||||||
The gadget serial driver uses major number 127, for now. So you
|
|
||||||
will need to create a device node for it, like this:
|
|
||||||
|
|
||||||
mknod /dev/ttygserial c 127 0
|
|
||||||
|
|
||||||
You only need to do this once.
|
|
||||||
|
|
||||||
Then you must load the gadget serial driver. To load it as an
|
Then you must load the gadget serial driver. To load it as an
|
||||||
ACM device, do this:
|
ACM device (recommended for interoperability), do this:
|
||||||
|
|
||||||
modprobe g_serial use_acm=1
|
modprobe g_serial use_acm=1
|
||||||
|
|
||||||
|
@ -125,6 +125,23 @@ controller driver. This must be done each time you reboot the gadget
|
||||||
side Linux system. You can add this to the start up scripts, if
|
side Linux system. You can add this to the start up scripts, if
|
||||||
desired.
|
desired.
|
||||||
|
|
||||||
|
Your system should use mdev (from busybox) or udev to make the
|
||||||
|
device nodes. After this gadget driver has been set up you should
|
||||||
|
then see a /dev/ttyGS0 node:
|
||||||
|
|
||||||
|
# ls -l /dev/ttyGS0 | cat
|
||||||
|
crw-rw---- 1 root root 253, 0 May 8 14:10 /dev/ttyGS0
|
||||||
|
#
|
||||||
|
|
||||||
|
Note that the major number (253, above) is system-specific. If
|
||||||
|
you need to create /dev nodes by hand, the right numbers to use
|
||||||
|
will be in the /sys/class/tty/ttyGS0/dev file.
|
||||||
|
|
||||||
|
When you link this gadget driver early, perhaps even statically,
|
||||||
|
you may want to set up an /etc/inittab entry to run "getty" on it.
|
||||||
|
The /dev/ttyGS0 line should work like most any other serial port.
|
||||||
|
|
||||||
|
|
||||||
If gadget serial is loaded as an ACM device you will want to use
|
If gadget serial is loaded as an ACM device you will want to use
|
||||||
either the Windows or Linux ACM driver on the host side. If gadget
|
either the Windows or Linux ACM driver on the host side. If gadget
|
||||||
serial is loaded as a bulk in/out device, you will want to use the
|
serial is loaded as a bulk in/out device, you will want to use the
|
||||||
|
|
|
@ -81,8 +81,11 @@ re-enumeration shows that the device now attached to that port has the
|
||||||
same descriptors as before, including the Vendor and Product IDs, then
|
same descriptors as before, including the Vendor and Product IDs, then
|
||||||
the kernel continues to use the same device structure. In effect, the
|
the kernel continues to use the same device structure. In effect, the
|
||||||
kernel treats the device as though it had merely been reset instead of
|
kernel treats the device as though it had merely been reset instead of
|
||||||
unplugged. The same thing happens if the host controller is in the
|
unplugged.
|
||||||
expected state but a USB device was unplugged and then replugged.
|
|
||||||
|
The same thing happens if the host controller is in the expected state
|
||||||
|
but a USB device was unplugged and then replugged, or if a USB device
|
||||||
|
fails to carry out a normal resume.
|
||||||
|
|
||||||
If no device is now attached to the port, or if the descriptors are
|
If no device is now attached to the port, or if the descriptors are
|
||||||
different from what the kernel remembers, then the treatment is what
|
different from what the kernel remembers, then the treatment is what
|
||||||
|
|
|
@ -1,165 +0,0 @@
|
||||||
Specification and Internals for the New UHCI Driver (Whitepaper...)
|
|
||||||
|
|
||||||
brought to you by
|
|
||||||
|
|
||||||
Georg Acher, acher@in.tum.de (executive slave) (base guitar)
|
|
||||||
Deti Fliegl, deti@fliegl.de (executive slave) (lead voice)
|
|
||||||
Thomas Sailer, sailer@ife.ee.ethz.ch (chief consultant) (cheer leader)
|
|
||||||
|
|
||||||
$Id: README.uhci,v 1.1 1999/12/14 14:03:02 fliegl Exp $
|
|
||||||
|
|
||||||
This document and the new uhci sources can be found on
|
|
||||||
http://hotswap.in.tum.de/usb
|
|
||||||
|
|
||||||
1. General issues
|
|
||||||
|
|
||||||
1.1 Why a new UHCI driver, we already have one?!?
|
|
||||||
|
|
||||||
Correct, but its internal structure got more and more mixed up by the (still
|
|
||||||
ongoing) efforts to get isochronous transfers (ISO) to work.
|
|
||||||
Since there is an increasing need for reliable ISO-transfers (especially
|
|
||||||
for USB-audio needed by TS and for a DAB-USB-Receiver build by GA and DF),
|
|
||||||
this state was a bit unsatisfying in our opinion, so we've decided (based
|
|
||||||
on knowledge and experiences with the old UHCI driver) to start
|
|
||||||
from scratch with a new approach, much simpler but at the same time more
|
|
||||||
powerful.
|
|
||||||
It is inspired by the way Win98/Win2000 handles USB requests via URBs,
|
|
||||||
but it's definitely 100% free of MS-code and doesn't crash while
|
|
||||||
unplugging an used ISO-device like Win98 ;-)
|
|
||||||
Some code for HW setup and root hub management was taken from the
|
|
||||||
original UHCI driver, but heavily modified to fit into the new code.
|
|
||||||
The invention of the basic concept, and major coding were completed in two
|
|
||||||
days (and nights) on the 16th and 17th of October 1999, now known as the
|
|
||||||
great USB-October-Revolution started by GA, DF, and TS ;-)
|
|
||||||
|
|
||||||
Since the concept is in no way UHCI dependent, we hope that it will also be
|
|
||||||
transferred to the OHCI-driver, so both drivers share a common API.
|
|
||||||
|
|
||||||
1.2. Advantages and disadvantages
|
|
||||||
|
|
||||||
+ All USB transfer types work now!
|
|
||||||
+ Asynchronous operation
|
|
||||||
+ Simple, but powerful interface (only two calls for start and cancel)
|
|
||||||
+ Easy migration to the new API, simplified by a compatibility API
|
|
||||||
+ Simple usage of ISO transfers
|
|
||||||
+ Automatic linking of requests
|
|
||||||
+ ISO transfers allow variable length for each frame and striping
|
|
||||||
+ No CPU dependent and non-portable atomic memory access, no asm()-inlines
|
|
||||||
+ Tested on x86 and Alpha
|
|
||||||
|
|
||||||
- Rewriting for ISO transfers needed
|
|
||||||
|
|
||||||
1.3. Is there some compatibility to the old API?
|
|
||||||
|
|
||||||
Yes, but only for control, bulk and interrupt transfers. We've implemented
|
|
||||||
some wrapper calls for these transfer types. The usbcore works fine with
|
|
||||||
these wrappers. For ISO there's no compatibility, because the old ISO-API
|
|
||||||
and its semantics were unnecessary complicated in our opinion.
|
|
||||||
|
|
||||||
1.4. What's really working?
|
|
||||||
|
|
||||||
As said above, CTRL and BULK already work fine even with the wrappers,
|
|
||||||
so legacy code wouldn't notice the change.
|
|
||||||
Regarding to Thomas, ISO transfers now run stable with USB audio.
|
|
||||||
INT transfers (e.g. mouse driver) work fine, too.
|
|
||||||
|
|
||||||
1.5. Are there any bugs?
|
|
||||||
|
|
||||||
No ;-)
|
|
||||||
Hm...
|
|
||||||
Well, of course this implementation needs extensive testing on all available
|
|
||||||
hardware, but we believe that any fixes shouldn't harm the overall concept.
|
|
||||||
|
|
||||||
1.6. What should be done next?
|
|
||||||
|
|
||||||
A large part of the request handling seems to be identical for UHCI and
|
|
||||||
OHCI, so it would be a good idea to extract the common parts and have only
|
|
||||||
the HW specific stuff in uhci.c. Furthermore, all other USB device drivers
|
|
||||||
should need URBification, if they use isochronous or interrupt transfers.
|
|
||||||
One thing missing in the current implementation (and the old UHCI driver)
|
|
||||||
is fair queueing for BULK transfers. Since this would need (in principle)
|
|
||||||
the alteration of already constructed TD chains (to switch from depth to
|
|
||||||
breadth execution), another way has to be found. Maybe some simple
|
|
||||||
heuristics work with the same effect.
|
|
||||||
|
|
||||||
---------------------------------------------------------------------------
|
|
||||||
|
|
||||||
2. Internal structure and mechanisms
|
|
||||||
|
|
||||||
To get quickly familiar with the internal structures, here's a short
|
|
||||||
description how the new UHCI driver works. However, the ultimate source of
|
|
||||||
truth is only uhci.c!
|
|
||||||
|
|
||||||
2.1. Descriptor structure (QHs and TDs)
|
|
||||||
|
|
||||||
During initialization, the following skeleton is allocated in init_skel:
|
|
||||||
|
|
||||||
framespecific | common chain
|
|
||||||
|
|
||||||
framelist[]
|
|
||||||
[ 0 ]-----> TD --> TD -------\
|
|
||||||
[ 1 ]-----> TD --> TD --------> TD ----> QH -------> QH -------> QH ---> NULL
|
|
||||||
... TD --> TD -------/
|
|
||||||
[1023]-----> TD --> TD ------/
|
|
||||||
|
|
||||||
^^ ^^ ^^ ^^ ^^ ^^
|
|
||||||
1024 TDs for 7 TDs for 1 TD for Start of Start of End Chain
|
|
||||||
ISO INT (2-128ms) 1ms-INT CTRL Chain BULK Chain
|
|
||||||
|
|
||||||
For each CTRL or BULK transfer a new QH is allocated and the containing data
|
|
||||||
transfers are appended as (vertical) TDs. After building the whole QH with its
|
|
||||||
dangling TDs, the QH is inserted before the BULK Chain QH (for CTRL) or
|
|
||||||
before the End Chain QH (for BULK). Since only the QH->next pointers are
|
|
||||||
affected, no atomic memory operation is required. The three QHs in the
|
|
||||||
common chain are never equipped with TDs!
|
|
||||||
|
|
||||||
For ISO or INT, the TD for each frame is simply inserted into the appropriate
|
|
||||||
ISO/INT-TD-chain for the desired frame. The 7 skeleton INT-TDs are scattered
|
|
||||||
among the 1024 frames similar to the old UHCI driver.
|
|
||||||
|
|
||||||
For CTRL/BULK/ISO, the last TD in the transfer has the IOC-bit set. For INT,
|
|
||||||
every TD (there is only one...) has the IOC-bit set.
|
|
||||||
|
|
||||||
Besides the data for the UHCI controller (2 or 4 32bit words), the descriptors
|
|
||||||
are double-linked through the .vertical and .horizontal elements in the
|
|
||||||
SW data of the descriptor (using the double-linked list structures and
|
|
||||||
operations), but SW-linking occurs only in closed domains, i.e. for each of
|
|
||||||
the 1024 ISO-chains and the 8 INT-chains there is a closed cycle. This
|
|
||||||
simplifies all insertions and unlinking operations and avoids costly
|
|
||||||
bus_to_virt()-calls.
|
|
||||||
|
|
||||||
2.2. URB structure and linking to QH/TDs
|
|
||||||
|
|
||||||
During assembly of the QH and TDs of the requested action, these descriptors
|
|
||||||
are stored in urb->urb_list, so the allocated QH/TD descriptors are bound to
|
|
||||||
this URB.
|
|
||||||
If the assembly was successful and the descriptors were added to the HW chain,
|
|
||||||
the corresponding URB is inserted into a global URB list for this controller.
|
|
||||||
This list stores all pending URBs.
|
|
||||||
|
|
||||||
2.3. Interrupt processing
|
|
||||||
|
|
||||||
Since UHCI provides no means to directly detect completed transactions, the
|
|
||||||
following is done in each UHCI interrupt (uhci_interrupt()):
|
|
||||||
|
|
||||||
For each URB in the pending queue (process_urb()), the ACTIVE-flag of the
|
|
||||||
associated TDs are processed (depending on the transfer type
|
|
||||||
process_{transfer|interrupt|iso}()). If the TDs are not active anymore,
|
|
||||||
they indicate the completion of the transaction and the status is calculated.
|
|
||||||
Inactive QH/TDs are removed from the HW chain (since the host controller
|
|
||||||
already removed the TDs from the QH, no atomic access is needed) and
|
|
||||||
eventually the URB is marked as completed (OK or errors) and removed from the
|
|
||||||
pending queue. Then the next linked URB is submitted. After (or immediately
|
|
||||||
before) that, the completion handler is called.
|
|
||||||
|
|
||||||
2.4. Unlinking URBs
|
|
||||||
|
|
||||||
First, all QH/TDs stored in the URB are unlinked from the HW chain.
|
|
||||||
To ensure that the host controller really left a vertical TD chain, we
|
|
||||||
wait for one frame. After that, the TDs are physically destroyed.
|
|
||||||
|
|
||||||
2.5. URB linking and the consequences
|
|
||||||
|
|
||||||
Since URBs can be linked and the corresponding submit_urb is called in
|
|
||||||
the UHCI-interrupt, all work associated with URB/QH/TD assembly has to be
|
|
||||||
interrupt save. This forces kmalloc to use GFP_ATOMIC in the interrupt.
|
|
|
@ -193,9 +193,6 @@ Description: Automatic 'ovcamchip' module loading: 0 disabled, 1 enabled.
|
||||||
loads that module automatically. This action is performed as
|
loads that module automatically. This action is performed as
|
||||||
once soon as the 'w9968cf' module is loaded into memory.
|
once soon as the 'w9968cf' module is loaded into memory.
|
||||||
Default: 1
|
Default: 1
|
||||||
Note: The kernel must be compiled with the CONFIG_KMOD option
|
|
||||||
enabled for the 'ovcamchip' module to be loaded and for
|
|
||||||
this parameter to be present.
|
|
||||||
-------------------------------------------------------------------------------
|
-------------------------------------------------------------------------------
|
||||||
Name: simcams
|
Name: simcams
|
||||||
Type: int
|
Type: int
|
||||||
|
|
17
MAINTAINERS
17
MAINTAINERS
|
@ -1988,6 +1988,12 @@ M: mikulas@artax.karlin.mff.cuni.cz
|
||||||
W: http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi
|
W: http://artax.karlin.mff.cuni.cz/~mikulas/vyplody/hpfs/index-e.cgi
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
HTCPEN TOUCHSCREEN DRIVER
|
||||||
|
P: Pau Oliva Fora
|
||||||
|
M: pof@eslack.org
|
||||||
|
L: linux-input@vger.kernel.org
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
HUGETLB FILESYSTEM
|
HUGETLB FILESYSTEM
|
||||||
P: William Irwin
|
P: William Irwin
|
||||||
M: wli@holomorphy.com
|
M: wli@holomorphy.com
|
||||||
|
@ -3527,7 +3533,7 @@ S: Supported
|
||||||
|
|
||||||
S390 NETWORK DRIVERS
|
S390 NETWORK DRIVERS
|
||||||
P: Ursula Braun
|
P: Ursula Braun
|
||||||
M: ubraun@linux.vnet.ibm.com
|
M: ursula.braun@de.ibm.com
|
||||||
P: Frank Blaschka
|
P: Frank Blaschka
|
||||||
M: blaschka@linux.vnet.ibm.com
|
M: blaschka@linux.vnet.ibm.com
|
||||||
M: linux390@de.ibm.com
|
M: linux390@de.ibm.com
|
||||||
|
@ -3547,7 +3553,7 @@ S: Supported
|
||||||
|
|
||||||
S390 IUCV NETWORK LAYER
|
S390 IUCV NETWORK LAYER
|
||||||
P: Ursula Braun
|
P: Ursula Braun
|
||||||
M: ubraun@linux.vnet.ibm.com
|
M: ursula.braun@de.ibm.com
|
||||||
M: linux390@de.ibm.com
|
M: linux390@de.ibm.com
|
||||||
L: linux-s390@vger.kernel.org
|
L: linux-s390@vger.kernel.org
|
||||||
W: http://www.ibm.com/developerworks/linux/linux390/
|
W: http://www.ibm.com/developerworks/linux/linux390/
|
||||||
|
@ -4041,9 +4047,10 @@ W: http://www.buzzard.org.uk/toshiba/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
TPM DEVICE DRIVER
|
TPM DEVICE DRIVER
|
||||||
P: Debora Velarde
|
P: Debora Velarde
|
||||||
P: Rajiv Andrade
|
M: debora@linux.vnet.ibm.com
|
||||||
M: tpmdd-devel@lists.sourceforge.net
|
P: Rajiv Andrade
|
||||||
|
M: srajiv@linux.vnet.ibm.com
|
||||||
W: http://tpmdd.sourceforge.net
|
W: http://tpmdd.sourceforge.net
|
||||||
P: Marcel Selhorst
|
P: Marcel Selhorst
|
||||||
M: tpm@selhorst.net
|
M: tpm@selhorst.net
|
||||||
|
|
3
Makefile
3
Makefile
|
@ -1148,7 +1148,8 @@ clean: archclean $(clean-dirs)
|
||||||
@find . $(RCS_FIND_IGNORE) \
|
@find . $(RCS_FIND_IGNORE) \
|
||||||
\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
|
\( -name '*.[oas]' -o -name '*.ko' -o -name '.*.cmd' \
|
||||||
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
|
-o -name '.*.d' -o -name '.*.tmp' -o -name '*.mod.c' \
|
||||||
-o -name '*.symtypes' -o -name 'modules.order' \) \
|
-o -name '*.symtypes' -o -name 'modules.order' \
|
||||||
|
-o -name 'Module.markers' \) \
|
||||||
-type f -print | xargs rm -f
|
-type f -print | xargs rm -f
|
||||||
|
|
||||||
# mrproper - Delete all generated files, including .config
|
# mrproper - Delete all generated files, including .config
|
||||||
|
|
|
@ -554,9 +554,8 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
|
||||||
|
|
||||||
device_info = kmalloc(sizeof(struct dmabounce_device_info), GFP_ATOMIC);
|
device_info = kmalloc(sizeof(struct dmabounce_device_info), GFP_ATOMIC);
|
||||||
if (!device_info) {
|
if (!device_info) {
|
||||||
printk(KERN_ERR
|
dev_err(dev,
|
||||||
"Could not allocated dmabounce_device_info for %s",
|
"Could not allocated dmabounce_device_info\n");
|
||||||
dev->bus_id);
|
|
||||||
return -ENOMEM;
|
return -ENOMEM;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -594,8 +593,7 @@ dmabounce_register_dev(struct device *dev, unsigned long small_buffer_size,
|
||||||
|
|
||||||
dev->archdata.dmabounce = device_info;
|
dev->archdata.dmabounce = device_info;
|
||||||
|
|
||||||
printk(KERN_INFO "dmabounce: registered device %s on %s bus\n",
|
dev_info(dev, "dmabounce: registered device\n");
|
||||||
dev->bus_id, dev->bus->name);
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
|
@ -614,16 +612,15 @@ dmabounce_unregister_dev(struct device *dev)
|
||||||
dev->archdata.dmabounce = NULL;
|
dev->archdata.dmabounce = NULL;
|
||||||
|
|
||||||
if (!device_info) {
|
if (!device_info) {
|
||||||
printk(KERN_WARNING
|
dev_warn(dev,
|
||||||
"%s: Never registered with dmabounce but attempting" \
|
"Never registered with dmabounce but attempting"
|
||||||
"to unregister!\n", dev->bus_id);
|
"to unregister!\n");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!list_empty(&device_info->safe_buffers)) {
|
if (!list_empty(&device_info->safe_buffers)) {
|
||||||
printk(KERN_ERR
|
dev_err(dev,
|
||||||
"%s: Removing from dmabounce with pending buffers!\n",
|
"Removing from dmabounce with pending buffers!\n");
|
||||||
dev->bus_id);
|
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -639,8 +636,7 @@ dmabounce_unregister_dev(struct device *dev)
|
||||||
|
|
||||||
kfree(device_info);
|
kfree(device_info);
|
||||||
|
|
||||||
printk(KERN_INFO "dmabounce: device %s on %s bus unregistered\n",
|
dev_info(dev, "dmabounce: device unregistered\n");
|
||||||
dev->bus_id, dev->bus->name);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -543,7 +543,6 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info)
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
strncpy(dev->dev.bus_id, info->name, sizeof(dev->dev.bus_id));
|
|
||||||
/*
|
/*
|
||||||
* If the parent device has a DMA mask associated with it,
|
* If the parent device has a DMA mask associated with it,
|
||||||
* propagate it down to the children.
|
* propagate it down to the children.
|
||||||
|
@ -553,6 +552,7 @@ locomo_init_one_child(struct locomo *lchip, struct locomo_dev_info *info)
|
||||||
dev->dev.dma_mask = &dev->dma_mask;
|
dev->dev.dma_mask = &dev->dma_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
dev_set_name(&dev->dev, "%s", info->name);
|
||||||
dev->devid = info->devid;
|
dev->devid = info->devid;
|
||||||
dev->dev.parent = lchip->dev;
|
dev->dev.parent = lchip->dev;
|
||||||
dev->dev.bus = &locomo_bus_type;
|
dev->dev.bus = &locomo_bus_type;
|
||||||
|
|
|
@ -550,9 +550,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id),
|
dev_set_name(&dev->dev, "%4.4lx", info->offset);
|
||||||
"%4.4lx", info->offset);
|
|
||||||
|
|
||||||
dev->devid = info->devid;
|
dev->devid = info->devid;
|
||||||
dev->dev.parent = sachip->dev;
|
dev->dev.parent = sachip->dev;
|
||||||
dev->dev.bus = &sa1111_bus_type;
|
dev->dev.bus = &sa1111_bus_type;
|
||||||
|
@ -560,7 +558,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
|
||||||
dev->dev.coherent_dma_mask = sachip->dev->coherent_dma_mask;
|
dev->dev.coherent_dma_mask = sachip->dev->coherent_dma_mask;
|
||||||
dev->res.start = sachip->phys + info->offset;
|
dev->res.start = sachip->phys + info->offset;
|
||||||
dev->res.end = dev->res.start + 511;
|
dev->res.end = dev->res.start + 511;
|
||||||
dev->res.name = dev->dev.bus_id;
|
dev->res.name = dev_name(&dev->dev);
|
||||||
dev->res.flags = IORESOURCE_MEM;
|
dev->res.flags = IORESOURCE_MEM;
|
||||||
dev->mapbase = sachip->base + info->offset;
|
dev->mapbase = sachip->base + info->offset;
|
||||||
dev->skpcr_mask = info->skpcr_mask;
|
dev->skpcr_mask = info->skpcr_mask;
|
||||||
|
@ -570,6 +568,7 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printk("SA1111: failed to allocate resource for %s\n",
|
printk("SA1111: failed to allocate resource for %s\n",
|
||||||
dev->res.name);
|
dev->res.name);
|
||||||
|
dev_set_name(&dev->dev, NULL);
|
||||||
kfree(dev);
|
kfree(dev);
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
@ -593,7 +592,8 @@ sa1111_init_one_child(struct sa1111 *sachip, struct resource *parent,
|
||||||
if (dev->dma_mask != 0xffffffffUL) {
|
if (dev->dma_mask != 0xffffffffUL) {
|
||||||
ret = dmabounce_register_dev(&dev->dev, 1024, 4096);
|
ret = dmabounce_register_dev(&dev->dev, 1024, 4096);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printk("SA1111: Failed to register %s with dmabounce", dev->dev.bus_id);
|
dev_err(&dev->dev, "SA1111: Failed to register"
|
||||||
|
" with dmabounce\n");
|
||||||
device_unregister(&dev->dev);
|
device_unregister(&dev->dev);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -247,7 +247,7 @@ static int __devinit scoop_probe(struct platform_device *pdev)
|
||||||
devptr->gpio.base = -1;
|
devptr->gpio.base = -1;
|
||||||
|
|
||||||
if (inf->gpio_base != 0) {
|
if (inf->gpio_base != 0) {
|
||||||
devptr->gpio.label = pdev->dev.bus_id;
|
devptr->gpio.label = dev_name(&pdev->dev);
|
||||||
devptr->gpio.base = inf->gpio_base;
|
devptr->gpio.base = inf->gpio_base;
|
||||||
devptr->gpio.ngpio = 12; /* PA11 = 0, PA12 = 1, etc. up to PA22 = 11 */
|
devptr->gpio.ngpio = 12; /* PA11 = 0, PA12 = 1, etc. up to PA22 = 11 */
|
||||||
devptr->gpio.set = scoop_gpio_set;
|
devptr->gpio.set = scoop_gpio_set;
|
||||||
|
|
|
@ -783,7 +783,7 @@ static void ecard_proc_init(void)
|
||||||
|
|
||||||
#define ec_set_resource(ec,nr,st,sz) \
|
#define ec_set_resource(ec,nr,st,sz) \
|
||||||
do { \
|
do { \
|
||||||
(ec)->resource[nr].name = ec->dev.bus_id; \
|
(ec)->resource[nr].name = dev_name(&ec->dev); \
|
||||||
(ec)->resource[nr].start = st; \
|
(ec)->resource[nr].start = st; \
|
||||||
(ec)->resource[nr].end = (st) + (sz) - 1; \
|
(ec)->resource[nr].end = (st) + (sz) - 1; \
|
||||||
(ec)->resource[nr].flags = IORESOURCE_MEM; \
|
(ec)->resource[nr].flags = IORESOURCE_MEM; \
|
||||||
|
@ -853,8 +853,7 @@ static struct expansion_card *__init ecard_alloc_card(int type, int slot)
|
||||||
for (i = 0; i < ECARD_NUM_RESOURCES; i++) {
|
for (i = 0; i < ECARD_NUM_RESOURCES; i++) {
|
||||||
if (ec->resource[i].flags &&
|
if (ec->resource[i].flags &&
|
||||||
request_resource(&iomem_resource, &ec->resource[i])) {
|
request_resource(&iomem_resource, &ec->resource[i])) {
|
||||||
printk(KERN_ERR "%s: resource(s) not available\n",
|
dev_err(&ec->dev, "resource(s) not available\n");
|
||||||
ec->dev.bus_id);
|
|
||||||
ec->resource[i].end -= ec->resource[i].start;
|
ec->resource[i].end -= ec->resource[i].start;
|
||||||
ec->resource[i].start = 0;
|
ec->resource[i].start = 0;
|
||||||
ec->resource[i].flags = 0;
|
ec->resource[i].flags = 0;
|
||||||
|
|
|
@ -130,7 +130,9 @@ static const struct leds_evt_name evt_names[] = {
|
||||||
{ "red", led_red_on, led_red_off },
|
{ "red", led_red_on, led_red_off },
|
||||||
};
|
};
|
||||||
|
|
||||||
static ssize_t leds_store(struct sys_device *dev, const char *buf, size_t size)
|
static ssize_t leds_store(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr,
|
||||||
|
const char *buf, size_t size)
|
||||||
{
|
{
|
||||||
int ret = -EINVAL, len = strcspn(buf, " ");
|
int ret = -EINVAL, len = strcspn(buf, " ");
|
||||||
|
|
||||||
|
|
|
@ -393,9 +393,7 @@ static int impd1_probe(struct lm_device *dev)
|
||||||
if (!d)
|
if (!d)
|
||||||
continue;
|
continue;
|
||||||
|
|
||||||
snprintf(d->dev.bus_id, sizeof(d->dev.bus_id),
|
dev_set_name(&d->dev, "lm%x:%5.5lx", dev->id, idev->offset >> 12);
|
||||||
"lm%x:%5.5lx", dev->id, idev->offset >> 12);
|
|
||||||
|
|
||||||
d->dev.parent = &dev->dev;
|
d->dev.parent = &dev->dev;
|
||||||
d->res.start = dev->resource.start + idev->offset;
|
d->res.start = dev->resource.start + idev->offset;
|
||||||
d->res.end = d->res.start + SZ_4K - 1;
|
d->res.end = d->res.start + SZ_4K - 1;
|
||||||
|
@ -407,8 +405,7 @@ static int impd1_probe(struct lm_device *dev)
|
||||||
|
|
||||||
ret = amba_device_register(d, &dev->resource);
|
ret = amba_device_register(d, &dev->resource);
|
||||||
if (ret) {
|
if (ret) {
|
||||||
printk("unable to register device %s: %d\n",
|
dev_err(&d->dev, "unable to register device: %d\n");
|
||||||
d->dev.bus_id, ret);
|
|
||||||
kfree(d);
|
kfree(d);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -81,8 +81,10 @@ int lm_device_register(struct lm_device *dev)
|
||||||
dev->dev.release = lm_device_release;
|
dev->dev.release = lm_device_release;
|
||||||
dev->dev.bus = &lm_bustype;
|
dev->dev.bus = &lm_bustype;
|
||||||
|
|
||||||
snprintf(dev->dev.bus_id, sizeof(dev->dev.bus_id), "lm%d", dev->id);
|
ret = dev_set_name(&dev->dev, "lm%d", dev->id);
|
||||||
dev->resource.name = dev->dev.bus_id;
|
if (ret)
|
||||||
|
return ret;
|
||||||
|
dev->resource.name = dev_name(&dev->dev);
|
||||||
|
|
||||||
ret = request_resource(&iomem_resource, &dev->resource);
|
ret = request_resource(&iomem_resource, &dev->resource);
|
||||||
if (ret == 0) {
|
if (ret == 0) {
|
||||||
|
|
|
@ -334,7 +334,7 @@ static int omap_mbox_init(struct omap_mbox *mbox)
|
||||||
}
|
}
|
||||||
|
|
||||||
mbox->dev.class = &omap_mbox_class;
|
mbox->dev.class = &omap_mbox_class;
|
||||||
strlcpy(mbox->dev.bus_id, mbox->name, KOBJ_NAME_LEN);
|
dev_set_name(&mbox->dev, "%s", mbox->name);
|
||||||
dev_set_drvdata(&mbox->dev, mbox);
|
dev_set_drvdata(&mbox->dev, mbox);
|
||||||
|
|
||||||
ret = device_register(&mbox->dev);
|
ret = device_register(&mbox->dev);
|
||||||
|
|
|
@ -26,14 +26,16 @@ static DEFINE_PER_CPU(struct cpu, cpu_devices);
|
||||||
* XXX: If/when a SMP-capable implementation of AVR32 will ever be
|
* XXX: If/when a SMP-capable implementation of AVR32 will ever be
|
||||||
* made, we must make sure that the code executes on the correct CPU.
|
* made, we must make sure that the code executes on the correct CPU.
|
||||||
*/
|
*/
|
||||||
static ssize_t show_pc0event(struct sys_device *dev, char *buf)
|
static ssize_t show_pc0event(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
unsigned long pccr;
|
unsigned long pccr;
|
||||||
|
|
||||||
pccr = sysreg_read(PCCR);
|
pccr = sysreg_read(PCCR);
|
||||||
return sprintf(buf, "0x%lx\n", (pccr >> 12) & 0x3f);
|
return sprintf(buf, "0x%lx\n", (pccr >> 12) & 0x3f);
|
||||||
}
|
}
|
||||||
static ssize_t store_pc0event(struct sys_device *dev, const char *buf,
|
static ssize_t store_pc0event(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr, const char *buf,
|
||||||
size_t count)
|
size_t count)
|
||||||
{
|
{
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
|
@ -46,15 +48,17 @@ static ssize_t store_pc0event(struct sys_device *dev, const char *buf,
|
||||||
sysreg_write(PCCR, val);
|
sysreg_write(PCCR, val);
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
static ssize_t show_pc0count(struct sys_device *dev, char *buf)
|
static ssize_t show_pc0count(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
unsigned long pcnt0;
|
unsigned long pcnt0;
|
||||||
|
|
||||||
pcnt0 = sysreg_read(PCNT0);
|
pcnt0 = sysreg_read(PCNT0);
|
||||||
return sprintf(buf, "%lu\n", pcnt0);
|
return sprintf(buf, "%lu\n", pcnt0);
|
||||||
}
|
}
|
||||||
static ssize_t store_pc0count(struct sys_device *dev, const char *buf,
|
static ssize_t store_pc0count(struct sys_device *dev,
|
||||||
size_t count)
|
struct sysdev_attribute *attr,
|
||||||
|
const char *buf, size_t count)
|
||||||
{
|
{
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
char *endp;
|
char *endp;
|
||||||
|
@ -67,14 +71,16 @@ static ssize_t store_pc0count(struct sys_device *dev, const char *buf,
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t show_pc1event(struct sys_device *dev, char *buf)
|
static ssize_t show_pc1event(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
unsigned long pccr;
|
unsigned long pccr;
|
||||||
|
|
||||||
pccr = sysreg_read(PCCR);
|
pccr = sysreg_read(PCCR);
|
||||||
return sprintf(buf, "0x%lx\n", (pccr >> 18) & 0x3f);
|
return sprintf(buf, "0x%lx\n", (pccr >> 18) & 0x3f);
|
||||||
}
|
}
|
||||||
static ssize_t store_pc1event(struct sys_device *dev, const char *buf,
|
static ssize_t store_pc1event(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr, const char *buf,
|
||||||
size_t count)
|
size_t count)
|
||||||
{
|
{
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
|
@ -87,14 +93,16 @@ static ssize_t store_pc1event(struct sys_device *dev, const char *buf,
|
||||||
sysreg_write(PCCR, val);
|
sysreg_write(PCCR, val);
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
static ssize_t show_pc1count(struct sys_device *dev, char *buf)
|
static ssize_t show_pc1count(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
unsigned long pcnt1;
|
unsigned long pcnt1;
|
||||||
|
|
||||||
pcnt1 = sysreg_read(PCNT1);
|
pcnt1 = sysreg_read(PCNT1);
|
||||||
return sprintf(buf, "%lu\n", pcnt1);
|
return sprintf(buf, "%lu\n", pcnt1);
|
||||||
}
|
}
|
||||||
static ssize_t store_pc1count(struct sys_device *dev, const char *buf,
|
static ssize_t store_pc1count(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr, const char *buf,
|
||||||
size_t count)
|
size_t count)
|
||||||
{
|
{
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
|
@ -108,14 +116,16 @@ static ssize_t store_pc1count(struct sys_device *dev, const char *buf,
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t show_pccycles(struct sys_device *dev, char *buf)
|
static ssize_t show_pccycles(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
unsigned long pccnt;
|
unsigned long pccnt;
|
||||||
|
|
||||||
pccnt = sysreg_read(PCCNT);
|
pccnt = sysreg_read(PCCNT);
|
||||||
return sprintf(buf, "%lu\n", pccnt);
|
return sprintf(buf, "%lu\n", pccnt);
|
||||||
}
|
}
|
||||||
static ssize_t store_pccycles(struct sys_device *dev, const char *buf,
|
static ssize_t store_pccycles(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr, const char *buf,
|
||||||
size_t count)
|
size_t count)
|
||||||
{
|
{
|
||||||
unsigned long val;
|
unsigned long val;
|
||||||
|
@ -129,14 +139,16 @@ static ssize_t store_pccycles(struct sys_device *dev, const char *buf,
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t show_pcenable(struct sys_device *dev, char *buf)
|
static ssize_t show_pcenable(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
unsigned long pccr;
|
unsigned long pccr;
|
||||||
|
|
||||||
pccr = sysreg_read(PCCR);
|
pccr = sysreg_read(PCCR);
|
||||||
return sprintf(buf, "%c\n", (pccr & 1)?'1':'0');
|
return sprintf(buf, "%c\n", (pccr & 1)?'1':'0');
|
||||||
}
|
}
|
||||||
static ssize_t store_pcenable(struct sys_device *dev, const char *buf,
|
static ssize_t store_pcenable(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr, const char *buf,
|
||||||
size_t count)
|
size_t count)
|
||||||
{
|
{
|
||||||
unsigned long pccr, val;
|
unsigned long pccr, val;
|
||||||
|
|
|
@ -873,8 +873,8 @@ config HOTPLUG
|
||||||
plugged into slots found on all modern laptop computers. Another
|
plugged into slots found on all modern laptop computers. Another
|
||||||
example, used on modern desktops as well as laptops, is USB.
|
example, used on modern desktops as well as laptops, is USB.
|
||||||
|
|
||||||
Enable HOTPLUG and KMOD, and build a modular kernel. Get agent
|
Enable HOTPLUG and build a modular kernel. Get agent software
|
||||||
software (at <http://linux-hotplug.sourceforge.net/>) and install it.
|
(from <http://linux-hotplug.sourceforge.net/>) and install it.
|
||||||
Then your kernel will automatically call out to a user mode "policy
|
Then your kernel will automatically call out to a user mode "policy
|
||||||
agent" (/sbin/hotplug) to load modules and set up software needed
|
agent" (/sbin/hotplug) to load modules and set up software needed
|
||||||
to use devices as you hotplug them.
|
to use devices as you hotplug them.
|
||||||
|
|
|
@ -540,8 +540,8 @@ config KEXEC
|
||||||
strongly in flux, so no good recommendation can be made.
|
strongly in flux, so no good recommendation can be made.
|
||||||
|
|
||||||
config CRASH_DUMP
|
config CRASH_DUMP
|
||||||
bool "kernel crash dumps (EXPERIMENTAL)"
|
bool "kernel crash dumps"
|
||||||
depends on EXPERIMENTAL && IA64_MCA_RECOVERY && !IA64_HP_SIM && (!SMP || HOTPLUG_CPU)
|
depends on IA64_MCA_RECOVERY && !IA64_HP_SIM && (!SMP || HOTPLUG_CPU)
|
||||||
help
|
help
|
||||||
Generate crash dump after being started by kexec.
|
Generate crash dump after being started by kexec.
|
||||||
|
|
||||||
|
|
|
@ -100,3 +100,9 @@ define archhelp
|
||||||
echo ' boot - Build vmlinux and bootloader for Ski simulator'
|
echo ' boot - Build vmlinux and bootloader for Ski simulator'
|
||||||
echo '* unwcheck - Check vmlinux for invalid unwind info'
|
echo '* unwcheck - Check vmlinux for invalid unwind info'
|
||||||
endef
|
endef
|
||||||
|
|
||||||
|
archprepare: make_nr_irqs_h FORCE
|
||||||
|
PHONY += make_nr_irqs_h FORCE
|
||||||
|
|
||||||
|
make_nr_irqs_h: FORCE
|
||||||
|
$(Q)$(MAKE) $(build)=arch/ia64/kernel include/asm-ia64/nr-irqs.h
|
||||||
|
|
|
@ -36,6 +36,8 @@ obj-$(CONFIG_PCI_MSI) += msi_ia64.o
|
||||||
mca_recovery-y += mca_drv.o mca_drv_asm.o
|
mca_recovery-y += mca_drv.o mca_drv_asm.o
|
||||||
obj-$(CONFIG_IA64_MC_ERR_INJECT)+= err_inject.o
|
obj-$(CONFIG_IA64_MC_ERR_INJECT)+= err_inject.o
|
||||||
|
|
||||||
|
obj-$(CONFIG_PARAVIRT) += paravirt.o paravirtentry.o
|
||||||
|
|
||||||
obj-$(CONFIG_IA64_ESI) += esi.o
|
obj-$(CONFIG_IA64_ESI) += esi.o
|
||||||
ifneq ($(CONFIG_IA64_ESI),)
|
ifneq ($(CONFIG_IA64_ESI),)
|
||||||
obj-y += esi_stub.o # must be in kernel proper
|
obj-y += esi_stub.o # must be in kernel proper
|
||||||
|
@ -70,3 +72,45 @@ $(obj)/gate-syms.o: $(obj)/gate.lds $(obj)/gate.o FORCE
|
||||||
# We must build gate.so before we can assemble it.
|
# We must build gate.so before we can assemble it.
|
||||||
# Note: kbuild does not track this dependency due to usage of .incbin
|
# Note: kbuild does not track this dependency due to usage of .incbin
|
||||||
$(obj)/gate-data.o: $(obj)/gate.so
|
$(obj)/gate-data.o: $(obj)/gate.so
|
||||||
|
|
||||||
|
# Calculate NR_IRQ = max(IA64_NATIVE_NR_IRQS, XEN_NR_IRQS, ...) based on config
|
||||||
|
define sed-y
|
||||||
|
"/^->/{s:^->\([^ ]*\) [\$$#]*\([^ ]*\) \(.*\):#define \1 \2 /* \3 */:; s:->::; p;}"
|
||||||
|
endef
|
||||||
|
quiet_cmd_nr_irqs = GEN $@
|
||||||
|
define cmd_nr_irqs
|
||||||
|
(set -e; \
|
||||||
|
echo "#ifndef __ASM_NR_IRQS_H__"; \
|
||||||
|
echo "#define __ASM_NR_IRQS_H__"; \
|
||||||
|
echo "/*"; \
|
||||||
|
echo " * DO NOT MODIFY."; \
|
||||||
|
echo " *"; \
|
||||||
|
echo " * This file was generated by Kbuild"; \
|
||||||
|
echo " *"; \
|
||||||
|
echo " */"; \
|
||||||
|
echo ""; \
|
||||||
|
sed -ne $(sed-y) $<; \
|
||||||
|
echo ""; \
|
||||||
|
echo "#endif" ) > $@
|
||||||
|
endef
|
||||||
|
|
||||||
|
# We use internal kbuild rules to avoid the "is up to date" message from make
|
||||||
|
arch/$(SRCARCH)/kernel/nr-irqs.s: $(srctree)/arch/$(SRCARCH)/kernel/nr-irqs.c \
|
||||||
|
$(wildcard $(srctree)/include/asm-ia64/*/irq.h)
|
||||||
|
$(Q)mkdir -p $(dir $@)
|
||||||
|
$(call if_changed_dep,cc_s_c)
|
||||||
|
|
||||||
|
include/asm-ia64/nr-irqs.h: arch/$(SRCARCH)/kernel/nr-irqs.s
|
||||||
|
$(Q)mkdir -p $(dir $@)
|
||||||
|
$(call cmd,nr_irqs)
|
||||||
|
|
||||||
|
clean-files += $(objtree)/include/asm-ia64/nr-irqs.h
|
||||||
|
|
||||||
|
#
|
||||||
|
# native ivt.S and entry.S
|
||||||
|
#
|
||||||
|
ASM_PARAVIRT_OBJS = ivt.o entry.o
|
||||||
|
define paravirtualized_native
|
||||||
|
AFLAGS_$(1) += -D__IA64_ASM_PARAVIRTUALIZED_NATIVE
|
||||||
|
endef
|
||||||
|
$(foreach obj,$(ASM_PARAVIRT_OBJS),$(eval $(call paravirtualized_native,$(obj))))
|
||||||
|
|
|
@ -774,7 +774,7 @@ int acpi_gsi_to_irq(u32 gsi, unsigned int *irq)
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
#ifdef CONFIG_ACPI_HOTPLUG_CPU
|
||||||
static
|
static
|
||||||
int acpi_map_cpu2node(acpi_handle handle, int cpu, long physid)
|
int acpi_map_cpu2node(acpi_handle handle, int cpu, int physid)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_ACPI_NUMA
|
#ifdef CONFIG_ACPI_NUMA
|
||||||
int pxm_id;
|
int pxm_id;
|
||||||
|
@ -854,8 +854,7 @@ int acpi_map_lsapic(acpi_handle handle, int *pcpu)
|
||||||
union acpi_object *obj;
|
union acpi_object *obj;
|
||||||
struct acpi_madt_local_sapic *lsapic;
|
struct acpi_madt_local_sapic *lsapic;
|
||||||
cpumask_t tmp_map;
|
cpumask_t tmp_map;
|
||||||
long physid;
|
int cpu, physid;
|
||||||
int cpu;
|
|
||||||
|
|
||||||
if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer)))
|
if (ACPI_FAILURE(acpi_evaluate_object(handle, "_MAT", NULL, &buffer)))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
|
@ -51,7 +51,7 @@ processor_set_pstate (
|
||||||
retval = ia64_pal_set_pstate((u64)value);
|
retval = ia64_pal_set_pstate((u64)value);
|
||||||
|
|
||||||
if (retval) {
|
if (retval) {
|
||||||
dprintk("Failed to set freq to 0x%x, with error 0x%x\n",
|
dprintk("Failed to set freq to 0x%x, with error 0x%lx\n",
|
||||||
value, retval);
|
value, retval);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
@ -74,7 +74,7 @@ processor_get_pstate (
|
||||||
|
|
||||||
if (retval)
|
if (retval)
|
||||||
dprintk("Failed to get current freq with "
|
dprintk("Failed to get current freq with "
|
||||||
"error 0x%x, idx 0x%x\n", retval, *value);
|
"error 0x%lx, idx 0x%x\n", retval, *value);
|
||||||
|
|
||||||
return (int)retval;
|
return (int)retval;
|
||||||
}
|
}
|
||||||
|
|
|
@ -22,6 +22,11 @@
|
||||||
* Patrick O'Rourke <orourke@missioncriticallinux.com>
|
* Patrick O'Rourke <orourke@missioncriticallinux.com>
|
||||||
* 11/07/2000
|
* 11/07/2000
|
||||||
*/
|
*/
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
|
||||||
|
* VA Linux Systems Japan K.K.
|
||||||
|
* pv_ops.
|
||||||
|
*/
|
||||||
/*
|
/*
|
||||||
* Global (preserved) predicate usage on syscall entry/exit path:
|
* Global (preserved) predicate usage on syscall entry/exit path:
|
||||||
*
|
*
|
||||||
|
@ -45,6 +50,7 @@
|
||||||
|
|
||||||
#include "minstate.h"
|
#include "minstate.h"
|
||||||
|
|
||||||
|
#ifdef __IA64_ASM_PARAVIRTUALIZED_NATIVE
|
||||||
/*
|
/*
|
||||||
* execve() is special because in case of success, we need to
|
* execve() is special because in case of success, we need to
|
||||||
* setup a null register window frame.
|
* setup a null register window frame.
|
||||||
|
@ -173,6 +179,7 @@ GLOBAL_ENTRY(sys_clone)
|
||||||
mov rp=loc0
|
mov rp=loc0
|
||||||
br.ret.sptk.many rp
|
br.ret.sptk.many rp
|
||||||
END(sys_clone)
|
END(sys_clone)
|
||||||
|
#endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* prev_task <- ia64_switch_to(struct task_struct *next)
|
* prev_task <- ia64_switch_to(struct task_struct *next)
|
||||||
|
@ -180,7 +187,7 @@ END(sys_clone)
|
||||||
* called. The code starting at .map relies on this. The rest of the code
|
* called. The code starting at .map relies on this. The rest of the code
|
||||||
* doesn't care about the interrupt masking status.
|
* doesn't care about the interrupt masking status.
|
||||||
*/
|
*/
|
||||||
GLOBAL_ENTRY(ia64_switch_to)
|
GLOBAL_ENTRY(__paravirt_switch_to)
|
||||||
.prologue
|
.prologue
|
||||||
alloc r16=ar.pfs,1,0,0,0
|
alloc r16=ar.pfs,1,0,0,0
|
||||||
DO_SAVE_SWITCH_STACK
|
DO_SAVE_SWITCH_STACK
|
||||||
|
@ -204,7 +211,7 @@ GLOBAL_ENTRY(ia64_switch_to)
|
||||||
;;
|
;;
|
||||||
.done:
|
.done:
|
||||||
ld8 sp=[r21] // load kernel stack pointer of new task
|
ld8 sp=[r21] // load kernel stack pointer of new task
|
||||||
mov IA64_KR(CURRENT)=in0 // update "current" application register
|
MOV_TO_KR(CURRENT, in0, r8, r9) // update "current" application register
|
||||||
mov r8=r13 // return pointer to previously running task
|
mov r8=r13 // return pointer to previously running task
|
||||||
mov r13=in0 // set "current" pointer
|
mov r13=in0 // set "current" pointer
|
||||||
;;
|
;;
|
||||||
|
@ -216,26 +223,25 @@ GLOBAL_ENTRY(ia64_switch_to)
|
||||||
br.ret.sptk.many rp // boogie on out in new context
|
br.ret.sptk.many rp // boogie on out in new context
|
||||||
|
|
||||||
.map:
|
.map:
|
||||||
rsm psr.ic // interrupts (psr.i) are already disabled here
|
RSM_PSR_IC(r25) // interrupts (psr.i) are already disabled here
|
||||||
movl r25=PAGE_KERNEL
|
movl r25=PAGE_KERNEL
|
||||||
;;
|
;;
|
||||||
srlz.d
|
srlz.d
|
||||||
or r23=r25,r20 // construct PA | page properties
|
or r23=r25,r20 // construct PA | page properties
|
||||||
mov r25=IA64_GRANULE_SHIFT<<2
|
mov r25=IA64_GRANULE_SHIFT<<2
|
||||||
;;
|
;;
|
||||||
mov cr.itir=r25
|
MOV_TO_ITIR(p0, r25, r8)
|
||||||
mov cr.ifa=in0 // VA of next task...
|
MOV_TO_IFA(in0, r8) // VA of next task...
|
||||||
;;
|
;;
|
||||||
mov r25=IA64_TR_CURRENT_STACK
|
mov r25=IA64_TR_CURRENT_STACK
|
||||||
mov IA64_KR(CURRENT_STACK)=r26 // remember last page we mapped...
|
MOV_TO_KR(CURRENT_STACK, r26, r8, r9) // remember last page we mapped...
|
||||||
;;
|
;;
|
||||||
itr.d dtr[r25]=r23 // wire in new mapping...
|
itr.d dtr[r25]=r23 // wire in new mapping...
|
||||||
ssm psr.ic // reenable the psr.ic bit
|
SSM_PSR_IC_AND_SRLZ_D(r8, r9) // reenable the psr.ic bit
|
||||||
;;
|
|
||||||
srlz.d
|
|
||||||
br.cond.sptk .done
|
br.cond.sptk .done
|
||||||
END(ia64_switch_to)
|
END(__paravirt_switch_to)
|
||||||
|
|
||||||
|
#ifdef __IA64_ASM_PARAVIRTUALIZED_NATIVE
|
||||||
/*
|
/*
|
||||||
* Note that interrupts are enabled during save_switch_stack and load_switch_stack. This
|
* Note that interrupts are enabled during save_switch_stack and load_switch_stack. This
|
||||||
* means that we may get an interrupt with "sp" pointing to the new kernel stack while
|
* means that we may get an interrupt with "sp" pointing to the new kernel stack while
|
||||||
|
@ -375,7 +381,7 @@ END(save_switch_stack)
|
||||||
* - b7 holds address to return to
|
* - b7 holds address to return to
|
||||||
* - must not touch r8-r11
|
* - must not touch r8-r11
|
||||||
*/
|
*/
|
||||||
ENTRY(load_switch_stack)
|
GLOBAL_ENTRY(load_switch_stack)
|
||||||
.prologue
|
.prologue
|
||||||
.altrp b7
|
.altrp b7
|
||||||
|
|
||||||
|
@ -571,7 +577,7 @@ GLOBAL_ENTRY(ia64_trace_syscall)
|
||||||
.ret3:
|
.ret3:
|
||||||
(pUStk) cmp.eq.unc p6,p0=r0,r0 // p6 <- pUStk
|
(pUStk) cmp.eq.unc p6,p0=r0,r0 // p6 <- pUStk
|
||||||
(pUStk) rsm psr.i // disable interrupts
|
(pUStk) rsm psr.i // disable interrupts
|
||||||
br.cond.sptk .work_pending_syscall_end
|
br.cond.sptk ia64_work_pending_syscall_end
|
||||||
|
|
||||||
strace_error:
|
strace_error:
|
||||||
ld8 r3=[r2] // load pt_regs.r8
|
ld8 r3=[r2] // load pt_regs.r8
|
||||||
|
@ -636,8 +642,17 @@ GLOBAL_ENTRY(ia64_ret_from_syscall)
|
||||||
adds r2=PT(R8)+16,sp // r2 = &pt_regs.r8
|
adds r2=PT(R8)+16,sp // r2 = &pt_regs.r8
|
||||||
mov r10=r0 // clear error indication in r10
|
mov r10=r0 // clear error indication in r10
|
||||||
(p7) br.cond.spnt handle_syscall_error // handle potential syscall failure
|
(p7) br.cond.spnt handle_syscall_error // handle potential syscall failure
|
||||||
|
#ifdef CONFIG_PARAVIRT
|
||||||
|
;;
|
||||||
|
br.cond.sptk.few ia64_leave_syscall
|
||||||
|
;;
|
||||||
|
#endif /* CONFIG_PARAVIRT */
|
||||||
END(ia64_ret_from_syscall)
|
END(ia64_ret_from_syscall)
|
||||||
|
#ifndef CONFIG_PARAVIRT
|
||||||
// fall through
|
// fall through
|
||||||
|
#endif
|
||||||
|
#endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ia64_leave_syscall(): Same as ia64_leave_kernel, except that it doesn't
|
* ia64_leave_syscall(): Same as ia64_leave_kernel, except that it doesn't
|
||||||
* need to switch to bank 0 and doesn't restore the scratch registers.
|
* need to switch to bank 0 and doesn't restore the scratch registers.
|
||||||
|
@ -682,7 +697,7 @@ END(ia64_ret_from_syscall)
|
||||||
* ar.csd: cleared
|
* ar.csd: cleared
|
||||||
* ar.ssd: cleared
|
* ar.ssd: cleared
|
||||||
*/
|
*/
|
||||||
ENTRY(ia64_leave_syscall)
|
GLOBAL_ENTRY(__paravirt_leave_syscall)
|
||||||
PT_REGS_UNWIND_INFO(0)
|
PT_REGS_UNWIND_INFO(0)
|
||||||
/*
|
/*
|
||||||
* work.need_resched etc. mustn't get changed by this CPU before it returns to
|
* work.need_resched etc. mustn't get changed by this CPU before it returns to
|
||||||
|
@ -692,11 +707,11 @@ ENTRY(ia64_leave_syscall)
|
||||||
* extra work. We always check for extra work when returning to user-level.
|
* extra work. We always check for extra work when returning to user-level.
|
||||||
* With CONFIG_PREEMPT, we also check for extra work when the preempt_count
|
* With CONFIG_PREEMPT, we also check for extra work when the preempt_count
|
||||||
* is 0. After extra work processing has been completed, execution
|
* is 0. After extra work processing has been completed, execution
|
||||||
* resumes at .work_processed_syscall with p6 set to 1 if the extra-work-check
|
* resumes at ia64_work_processed_syscall with p6 set to 1 if the extra-work-check
|
||||||
* needs to be redone.
|
* needs to be redone.
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_PREEMPT
|
#ifdef CONFIG_PREEMPT
|
||||||
rsm psr.i // disable interrupts
|
RSM_PSR_I(p0, r2, r18) // disable interrupts
|
||||||
cmp.eq pLvSys,p0=r0,r0 // pLvSys=1: leave from syscall
|
cmp.eq pLvSys,p0=r0,r0 // pLvSys=1: leave from syscall
|
||||||
(pKStk) adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
|
(pKStk) adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
|
||||||
;;
|
;;
|
||||||
|
@ -706,11 +721,12 @@ ENTRY(ia64_leave_syscall)
|
||||||
;;
|
;;
|
||||||
cmp.eq p6,p0=r21,r0 // p6 <- pUStk || (preempt_count == 0)
|
cmp.eq p6,p0=r21,r0 // p6 <- pUStk || (preempt_count == 0)
|
||||||
#else /* !CONFIG_PREEMPT */
|
#else /* !CONFIG_PREEMPT */
|
||||||
(pUStk) rsm psr.i
|
RSM_PSR_I(pUStk, r2, r18)
|
||||||
cmp.eq pLvSys,p0=r0,r0 // pLvSys=1: leave from syscall
|
cmp.eq pLvSys,p0=r0,r0 // pLvSys=1: leave from syscall
|
||||||
(pUStk) cmp.eq.unc p6,p0=r0,r0 // p6 <- pUStk
|
(pUStk) cmp.eq.unc p6,p0=r0,r0 // p6 <- pUStk
|
||||||
#endif
|
#endif
|
||||||
.work_processed_syscall:
|
.global __paravirt_work_processed_syscall;
|
||||||
|
__paravirt_work_processed_syscall:
|
||||||
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
|
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
|
||||||
adds r2=PT(LOADRS)+16,r12
|
adds r2=PT(LOADRS)+16,r12
|
||||||
(pUStk) mov.m r22=ar.itc // fetch time at leave
|
(pUStk) mov.m r22=ar.itc // fetch time at leave
|
||||||
|
@ -744,7 +760,7 @@ ENTRY(ia64_leave_syscall)
|
||||||
(pNonSys) break 0 // bug check: we shouldn't be here if pNonSys is TRUE!
|
(pNonSys) break 0 // bug check: we shouldn't be here if pNonSys is TRUE!
|
||||||
;;
|
;;
|
||||||
invala // M0|1 invalidate ALAT
|
invala // M0|1 invalidate ALAT
|
||||||
rsm psr.i | psr.ic // M2 turn off interrupts and interruption collection
|
RSM_PSR_I_IC(r28, r29, r30) // M2 turn off interrupts and interruption collection
|
||||||
cmp.eq p9,p0=r0,r0 // A set p9 to indicate that we should restore cr.ifs
|
cmp.eq p9,p0=r0,r0 // A set p9 to indicate that we should restore cr.ifs
|
||||||
|
|
||||||
ld8 r29=[r2],16 // M0|1 load cr.ipsr
|
ld8 r29=[r2],16 // M0|1 load cr.ipsr
|
||||||
|
@ -765,7 +781,7 @@ ENTRY(ia64_leave_syscall)
|
||||||
;;
|
;;
|
||||||
#endif
|
#endif
|
||||||
ld8 r26=[r2],PT(B0)-PT(AR_PFS) // M0|1 load ar.pfs
|
ld8 r26=[r2],PT(B0)-PT(AR_PFS) // M0|1 load ar.pfs
|
||||||
(pKStk) mov r22=psr // M2 read PSR now that interrupts are disabled
|
MOV_FROM_PSR(pKStk, r22, r21) // M2 read PSR now that interrupts are disabled
|
||||||
nop 0
|
nop 0
|
||||||
;;
|
;;
|
||||||
ld8 r21=[r2],PT(AR_RNAT)-PT(B0) // M0|1 load b0
|
ld8 r21=[r2],PT(AR_RNAT)-PT(B0) // M0|1 load b0
|
||||||
|
@ -798,7 +814,7 @@ ENTRY(ia64_leave_syscall)
|
||||||
|
|
||||||
srlz.d // M0 ensure interruption collection is off (for cover)
|
srlz.d // M0 ensure interruption collection is off (for cover)
|
||||||
shr.u r18=r19,16 // I0|1 get byte size of existing "dirty" partition
|
shr.u r18=r19,16 // I0|1 get byte size of existing "dirty" partition
|
||||||
cover // B add current frame into dirty partition & set cr.ifs
|
COVER // B add current frame into dirty partition & set cr.ifs
|
||||||
;;
|
;;
|
||||||
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
|
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
|
||||||
mov r19=ar.bsp // M2 get new backing store pointer
|
mov r19=ar.bsp // M2 get new backing store pointer
|
||||||
|
@ -823,8 +839,9 @@ ENTRY(ia64_leave_syscall)
|
||||||
mov.m ar.ssd=r0 // M2 clear ar.ssd
|
mov.m ar.ssd=r0 // M2 clear ar.ssd
|
||||||
mov f11=f0 // F clear f11
|
mov f11=f0 // F clear f11
|
||||||
br.cond.sptk.many rbs_switch // B
|
br.cond.sptk.many rbs_switch // B
|
||||||
END(ia64_leave_syscall)
|
END(__paravirt_leave_syscall)
|
||||||
|
|
||||||
|
#ifdef __IA64_ASM_PARAVIRTUALIZED_NATIVE
|
||||||
#ifdef CONFIG_IA32_SUPPORT
|
#ifdef CONFIG_IA32_SUPPORT
|
||||||
GLOBAL_ENTRY(ia64_ret_from_ia32_execve)
|
GLOBAL_ENTRY(ia64_ret_from_ia32_execve)
|
||||||
PT_REGS_UNWIND_INFO(0)
|
PT_REGS_UNWIND_INFO(0)
|
||||||
|
@ -835,10 +852,20 @@ GLOBAL_ENTRY(ia64_ret_from_ia32_execve)
|
||||||
st8.spill [r2]=r8 // store return value in slot for r8 and set unat bit
|
st8.spill [r2]=r8 // store return value in slot for r8 and set unat bit
|
||||||
.mem.offset 8,0
|
.mem.offset 8,0
|
||||||
st8.spill [r3]=r0 // clear error indication in slot for r10 and set unat bit
|
st8.spill [r3]=r0 // clear error indication in slot for r10 and set unat bit
|
||||||
|
#ifdef CONFIG_PARAVIRT
|
||||||
|
;;
|
||||||
|
// don't fall through, ia64_leave_kernel may be #define'd
|
||||||
|
br.cond.sptk.few ia64_leave_kernel
|
||||||
|
;;
|
||||||
|
#endif /* CONFIG_PARAVIRT */
|
||||||
END(ia64_ret_from_ia32_execve)
|
END(ia64_ret_from_ia32_execve)
|
||||||
|
#ifndef CONFIG_PARAVIRT
|
||||||
// fall through
|
// fall through
|
||||||
|
#endif
|
||||||
#endif /* CONFIG_IA32_SUPPORT */
|
#endif /* CONFIG_IA32_SUPPORT */
|
||||||
GLOBAL_ENTRY(ia64_leave_kernel)
|
#endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */
|
||||||
|
|
||||||
|
GLOBAL_ENTRY(__paravirt_leave_kernel)
|
||||||
PT_REGS_UNWIND_INFO(0)
|
PT_REGS_UNWIND_INFO(0)
|
||||||
/*
|
/*
|
||||||
* work.need_resched etc. mustn't get changed by this CPU before it returns to
|
* work.need_resched etc. mustn't get changed by this CPU before it returns to
|
||||||
|
@ -852,7 +879,7 @@ GLOBAL_ENTRY(ia64_leave_kernel)
|
||||||
* needs to be redone.
|
* needs to be redone.
|
||||||
*/
|
*/
|
||||||
#ifdef CONFIG_PREEMPT
|
#ifdef CONFIG_PREEMPT
|
||||||
rsm psr.i // disable interrupts
|
RSM_PSR_I(p0, r17, r31) // disable interrupts
|
||||||
cmp.eq p0,pLvSys=r0,r0 // pLvSys=0: leave from kernel
|
cmp.eq p0,pLvSys=r0,r0 // pLvSys=0: leave from kernel
|
||||||
(pKStk) adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
|
(pKStk) adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
|
||||||
;;
|
;;
|
||||||
|
@ -862,7 +889,7 @@ GLOBAL_ENTRY(ia64_leave_kernel)
|
||||||
;;
|
;;
|
||||||
cmp.eq p6,p0=r21,r0 // p6 <- pUStk || (preempt_count == 0)
|
cmp.eq p6,p0=r21,r0 // p6 <- pUStk || (preempt_count == 0)
|
||||||
#else
|
#else
|
||||||
(pUStk) rsm psr.i
|
RSM_PSR_I(pUStk, r17, r31)
|
||||||
cmp.eq p0,pLvSys=r0,r0 // pLvSys=0: leave from kernel
|
cmp.eq p0,pLvSys=r0,r0 // pLvSys=0: leave from kernel
|
||||||
(pUStk) cmp.eq.unc p6,p0=r0,r0 // p6 <- pUStk
|
(pUStk) cmp.eq.unc p6,p0=r0,r0 // p6 <- pUStk
|
||||||
#endif
|
#endif
|
||||||
|
@ -910,7 +937,7 @@ GLOBAL_ENTRY(ia64_leave_kernel)
|
||||||
mov ar.csd=r30
|
mov ar.csd=r30
|
||||||
mov ar.ssd=r31
|
mov ar.ssd=r31
|
||||||
;;
|
;;
|
||||||
rsm psr.i | psr.ic // initiate turning off of interrupt and interruption collection
|
RSM_PSR_I_IC(r23, r22, r25) // initiate turning off of interrupt and interruption collection
|
||||||
invala // invalidate ALAT
|
invala // invalidate ALAT
|
||||||
;;
|
;;
|
||||||
ld8.fill r22=[r2],24
|
ld8.fill r22=[r2],24
|
||||||
|
@ -942,7 +969,7 @@ GLOBAL_ENTRY(ia64_leave_kernel)
|
||||||
mov ar.ccv=r15
|
mov ar.ccv=r15
|
||||||
;;
|
;;
|
||||||
ldf.fill f11=[r2]
|
ldf.fill f11=[r2]
|
||||||
bsw.0 // switch back to bank 0 (no stop bit required beforehand...)
|
BSW_0(r2, r3, r15) // switch back to bank 0 (no stop bit required beforehand...)
|
||||||
;;
|
;;
|
||||||
(pUStk) mov r18=IA64_KR(CURRENT)// M2 (12 cycle read latency)
|
(pUStk) mov r18=IA64_KR(CURRENT)// M2 (12 cycle read latency)
|
||||||
adds r16=PT(CR_IPSR)+16,r12
|
adds r16=PT(CR_IPSR)+16,r12
|
||||||
|
@ -950,12 +977,12 @@ GLOBAL_ENTRY(ia64_leave_kernel)
|
||||||
|
|
||||||
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
|
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
|
||||||
.pred.rel.mutex pUStk,pKStk
|
.pred.rel.mutex pUStk,pKStk
|
||||||
(pKStk) mov r22=psr // M2 read PSR now that interrupts are disabled
|
MOV_FROM_PSR(pKStk, r22, r29) // M2 read PSR now that interrupts are disabled
|
||||||
(pUStk) mov.m r22=ar.itc // M fetch time at leave
|
(pUStk) mov.m r22=ar.itc // M fetch time at leave
|
||||||
nop.i 0
|
nop.i 0
|
||||||
;;
|
;;
|
||||||
#else
|
#else
|
||||||
(pKStk) mov r22=psr // M2 read PSR now that interrupts are disabled
|
MOV_FROM_PSR(pKStk, r22, r29) // M2 read PSR now that interrupts are disabled
|
||||||
nop.i 0
|
nop.i 0
|
||||||
nop.i 0
|
nop.i 0
|
||||||
;;
|
;;
|
||||||
|
@ -1027,7 +1054,7 @@ GLOBAL_ENTRY(ia64_leave_kernel)
|
||||||
* NOTE: alloc, loadrs, and cover can't be predicated.
|
* NOTE: alloc, loadrs, and cover can't be predicated.
|
||||||
*/
|
*/
|
||||||
(pNonSys) br.cond.dpnt dont_preserve_current_frame
|
(pNonSys) br.cond.dpnt dont_preserve_current_frame
|
||||||
cover // add current frame into dirty partition and set cr.ifs
|
COVER // add current frame into dirty partition and set cr.ifs
|
||||||
;;
|
;;
|
||||||
mov r19=ar.bsp // get new backing store pointer
|
mov r19=ar.bsp // get new backing store pointer
|
||||||
rbs_switch:
|
rbs_switch:
|
||||||
|
@ -1130,16 +1157,16 @@ skip_rbs_switch:
|
||||||
(pKStk) dep r29=r22,r29,21,1 // I0 update ipsr.pp with psr.pp
|
(pKStk) dep r29=r22,r29,21,1 // I0 update ipsr.pp with psr.pp
|
||||||
(pLvSys)mov r16=r0 // A clear r16 for leave_syscall, no-op otherwise
|
(pLvSys)mov r16=r0 // A clear r16 for leave_syscall, no-op otherwise
|
||||||
;;
|
;;
|
||||||
mov cr.ipsr=r29 // M2
|
MOV_TO_IPSR(p0, r29, r25) // M2
|
||||||
mov ar.pfs=r26 // I0
|
mov ar.pfs=r26 // I0
|
||||||
(pLvSys)mov r17=r0 // A clear r17 for leave_syscall, no-op otherwise
|
(pLvSys)mov r17=r0 // A clear r17 for leave_syscall, no-op otherwise
|
||||||
|
|
||||||
(p9) mov cr.ifs=r30 // M2
|
MOV_TO_IFS(p9, r30, r25)// M2
|
||||||
mov b0=r21 // I0
|
mov b0=r21 // I0
|
||||||
(pLvSys)mov r18=r0 // A clear r18 for leave_syscall, no-op otherwise
|
(pLvSys)mov r18=r0 // A clear r18 for leave_syscall, no-op otherwise
|
||||||
|
|
||||||
mov ar.fpsr=r20 // M2
|
mov ar.fpsr=r20 // M2
|
||||||
mov cr.iip=r28 // M2
|
MOV_TO_IIP(r28, r25) // M2
|
||||||
nop 0
|
nop 0
|
||||||
;;
|
;;
|
||||||
(pUStk) mov ar.rnat=r24 // M2 must happen with RSE in lazy mode
|
(pUStk) mov ar.rnat=r24 // M2 must happen with RSE in lazy mode
|
||||||
|
@ -1148,7 +1175,7 @@ skip_rbs_switch:
|
||||||
|
|
||||||
mov ar.rsc=r27 // M2
|
mov ar.rsc=r27 // M2
|
||||||
mov pr=r31,-1 // I0
|
mov pr=r31,-1 // I0
|
||||||
rfi // B
|
RFI // B
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* On entry:
|
* On entry:
|
||||||
|
@ -1174,35 +1201,36 @@ skip_rbs_switch:
|
||||||
;;
|
;;
|
||||||
(pKStk) st4 [r20]=r21
|
(pKStk) st4 [r20]=r21
|
||||||
#endif
|
#endif
|
||||||
ssm psr.i // enable interrupts
|
SSM_PSR_I(p0, p6, r2) // enable interrupts
|
||||||
br.call.spnt.many rp=schedule
|
br.call.spnt.many rp=schedule
|
||||||
.ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1 (re-check)
|
.ret9: cmp.eq p6,p0=r0,r0 // p6 <- 1 (re-check)
|
||||||
rsm psr.i // disable interrupts
|
RSM_PSR_I(p0, r2, r20) // disable interrupts
|
||||||
;;
|
;;
|
||||||
#ifdef CONFIG_PREEMPT
|
#ifdef CONFIG_PREEMPT
|
||||||
(pKStk) adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
|
(pKStk) adds r20=TI_PRE_COUNT+IA64_TASK_SIZE,r13
|
||||||
;;
|
;;
|
||||||
(pKStk) st4 [r20]=r0 // preempt_count() <- 0
|
(pKStk) st4 [r20]=r0 // preempt_count() <- 0
|
||||||
#endif
|
#endif
|
||||||
(pLvSys)br.cond.sptk.few .work_pending_syscall_end
|
(pLvSys)br.cond.sptk.few __paravirt_pending_syscall_end
|
||||||
br.cond.sptk.many .work_processed_kernel
|
br.cond.sptk.many .work_processed_kernel
|
||||||
|
|
||||||
.notify:
|
.notify:
|
||||||
(pUStk) br.call.spnt.many rp=notify_resume_user
|
(pUStk) br.call.spnt.many rp=notify_resume_user
|
||||||
.ret10: cmp.ne p6,p0=r0,r0 // p6 <- 0 (don't re-check)
|
.ret10: cmp.ne p6,p0=r0,r0 // p6 <- 0 (don't re-check)
|
||||||
(pLvSys)br.cond.sptk.few .work_pending_syscall_end
|
(pLvSys)br.cond.sptk.few __paravirt_pending_syscall_end
|
||||||
br.cond.sptk.many .work_processed_kernel
|
br.cond.sptk.many .work_processed_kernel
|
||||||
|
|
||||||
.work_pending_syscall_end:
|
.global __paravirt_pending_syscall_end;
|
||||||
|
__paravirt_pending_syscall_end:
|
||||||
adds r2=PT(R8)+16,r12
|
adds r2=PT(R8)+16,r12
|
||||||
adds r3=PT(R10)+16,r12
|
adds r3=PT(R10)+16,r12
|
||||||
;;
|
;;
|
||||||
ld8 r8=[r2]
|
ld8 r8=[r2]
|
||||||
ld8 r10=[r3]
|
ld8 r10=[r3]
|
||||||
br.cond.sptk.many .work_processed_syscall
|
br.cond.sptk.many __paravirt_work_processed_syscall_target
|
||||||
|
END(__paravirt_leave_kernel)
|
||||||
END(ia64_leave_kernel)
|
|
||||||
|
|
||||||
|
#ifdef __IA64_ASM_PARAVIRTUALIZED_NATIVE
|
||||||
ENTRY(handle_syscall_error)
|
ENTRY(handle_syscall_error)
|
||||||
/*
|
/*
|
||||||
* Some system calls (e.g., ptrace, mmap) can return arbitrary values which could
|
* Some system calls (e.g., ptrace, mmap) can return arbitrary values which could
|
||||||
|
@ -1244,7 +1272,7 @@ END(ia64_invoke_schedule_tail)
|
||||||
* We declare 8 input registers so the system call args get preserved,
|
* We declare 8 input registers so the system call args get preserved,
|
||||||
* in case we need to restart a system call.
|
* in case we need to restart a system call.
|
||||||
*/
|
*/
|
||||||
ENTRY(notify_resume_user)
|
GLOBAL_ENTRY(notify_resume_user)
|
||||||
.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
|
.prologue ASM_UNW_PRLG_RP|ASM_UNW_PRLG_PFS, ASM_UNW_PRLG_GRSAVE(8)
|
||||||
alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs in case of syscall restart!
|
alloc loc1=ar.pfs,8,2,3,0 // preserve all eight input regs in case of syscall restart!
|
||||||
mov r9=ar.unat
|
mov r9=ar.unat
|
||||||
|
@ -1306,7 +1334,7 @@ ENTRY(sys_rt_sigreturn)
|
||||||
adds sp=16,sp
|
adds sp=16,sp
|
||||||
;;
|
;;
|
||||||
ld8 r9=[sp] // load new ar.unat
|
ld8 r9=[sp] // load new ar.unat
|
||||||
mov.sptk b7=r8,ia64_leave_kernel
|
mov.sptk b7=r8,ia64_native_leave_kernel
|
||||||
;;
|
;;
|
||||||
mov ar.unat=r9
|
mov ar.unat=r9
|
||||||
br.many b7
|
br.many b7
|
||||||
|
@ -1665,3 +1693,4 @@ sys_call_table:
|
||||||
data8 sys_timerfd_gettime
|
data8 sys_timerfd_gettime
|
||||||
|
|
||||||
.org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls
|
.org sys_call_table + 8*NR_syscalls // guard against failures to increase NR_syscalls
|
||||||
|
#endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */
|
||||||
|
|
|
@ -55,7 +55,8 @@ static u64 resources[NR_CPUS];
|
||||||
|
|
||||||
#define show(name) \
|
#define show(name) \
|
||||||
static ssize_t \
|
static ssize_t \
|
||||||
show_##name(struct sys_device *dev, char *buf) \
|
show_##name(struct sys_device *dev, struct sysdev_attribute *attr, \
|
||||||
|
char *buf) \
|
||||||
{ \
|
{ \
|
||||||
u32 cpu=dev->id; \
|
u32 cpu=dev->id; \
|
||||||
return sprintf(buf, "%lx\n", name[cpu]); \
|
return sprintf(buf, "%lx\n", name[cpu]); \
|
||||||
|
@ -63,7 +64,8 @@ show_##name(struct sys_device *dev, char *buf) \
|
||||||
|
|
||||||
#define store(name) \
|
#define store(name) \
|
||||||
static ssize_t \
|
static ssize_t \
|
||||||
store_##name(struct sys_device *dev, const char *buf, size_t size) \
|
store_##name(struct sys_device *dev, struct sysdev_attribute *attr, \
|
||||||
|
const char *buf, size_t size) \
|
||||||
{ \
|
{ \
|
||||||
unsigned int cpu=dev->id; \
|
unsigned int cpu=dev->id; \
|
||||||
name[cpu] = simple_strtoull(buf, NULL, 16); \
|
name[cpu] = simple_strtoull(buf, NULL, 16); \
|
||||||
|
@ -76,7 +78,8 @@ show(call_start)
|
||||||
* processor. The cpu number in driver is only used for storing data.
|
* processor. The cpu number in driver is only used for storing data.
|
||||||
*/
|
*/
|
||||||
static ssize_t
|
static ssize_t
|
||||||
store_call_start(struct sys_device *dev, const char *buf, size_t size)
|
store_call_start(struct sys_device *dev, struct sysdev_attribute *attr,
|
||||||
|
const char *buf, size_t size)
|
||||||
{
|
{
|
||||||
unsigned int cpu=dev->id;
|
unsigned int cpu=dev->id;
|
||||||
unsigned long call_start = simple_strtoull(buf, NULL, 16);
|
unsigned long call_start = simple_strtoull(buf, NULL, 16);
|
||||||
|
@ -124,14 +127,16 @@ show(err_type_info)
|
||||||
store(err_type_info)
|
store(err_type_info)
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
show_virtual_to_phys(struct sys_device *dev, char *buf)
|
show_virtual_to_phys(struct sys_device *dev, struct sysdev_attribute *attr,
|
||||||
|
char *buf)
|
||||||
{
|
{
|
||||||
unsigned int cpu=dev->id;
|
unsigned int cpu=dev->id;
|
||||||
return sprintf(buf, "%lx\n", phys_addr[cpu]);
|
return sprintf(buf, "%lx\n", phys_addr[cpu]);
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
store_virtual_to_phys(struct sys_device *dev, const char *buf, size_t size)
|
store_virtual_to_phys(struct sys_device *dev, struct sysdev_attribute *attr,
|
||||||
|
const char *buf, size_t size)
|
||||||
{
|
{
|
||||||
unsigned int cpu=dev->id;
|
unsigned int cpu=dev->id;
|
||||||
u64 virt_addr=simple_strtoull(buf, NULL, 16);
|
u64 virt_addr=simple_strtoull(buf, NULL, 16);
|
||||||
|
@ -154,7 +159,8 @@ show(err_struct_info)
|
||||||
store(err_struct_info)
|
store(err_struct_info)
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
show_err_data_buffer(struct sys_device *dev, char *buf)
|
show_err_data_buffer(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr, char *buf)
|
||||||
{
|
{
|
||||||
unsigned int cpu=dev->id;
|
unsigned int cpu=dev->id;
|
||||||
|
|
||||||
|
@ -165,7 +171,9 @@ show_err_data_buffer(struct sys_device *dev, char *buf)
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t
|
static ssize_t
|
||||||
store_err_data_buffer(struct sys_device *dev, const char *buf, size_t size)
|
store_err_data_buffer(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr,
|
||||||
|
const char *buf, size_t size)
|
||||||
{
|
{
|
||||||
unsigned int cpu=dev->id;
|
unsigned int cpu=dev->id;
|
||||||
int ret;
|
int ret;
|
||||||
|
|
|
@ -26,11 +26,14 @@
|
||||||
#include <asm/mmu_context.h>
|
#include <asm/mmu_context.h>
|
||||||
#include <asm/asm-offsets.h>
|
#include <asm/asm-offsets.h>
|
||||||
#include <asm/pal.h>
|
#include <asm/pal.h>
|
||||||
|
#include <asm/paravirt.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/mca_asm.h>
|
#include <asm/mca_asm.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/linkage.h>
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
#define SAL_PSR_BITS_TO_SET \
|
#define SAL_PSR_BITS_TO_SET \
|
||||||
|
@ -367,6 +370,44 @@ start_ap:
|
||||||
;;
|
;;
|
||||||
(isBP) st8 [r2]=r28 // save the address of the boot param area passed by the bootloader
|
(isBP) st8 [r2]=r28 // save the address of the boot param area passed by the bootloader
|
||||||
|
|
||||||
|
#ifdef CONFIG_PARAVIRT
|
||||||
|
|
||||||
|
movl r14=hypervisor_setup_hooks
|
||||||
|
movl r15=hypervisor_type
|
||||||
|
mov r16=num_hypervisor_hooks
|
||||||
|
;;
|
||||||
|
ld8 r2=[r15]
|
||||||
|
;;
|
||||||
|
cmp.ltu p7,p0=r2,r16 // array size check
|
||||||
|
shladd r8=r2,3,r14
|
||||||
|
;;
|
||||||
|
(p7) ld8 r9=[r8]
|
||||||
|
;;
|
||||||
|
(p7) mov b1=r9
|
||||||
|
(p7) cmp.ne.unc p7,p0=r9,r0 // no actual branch to NULL
|
||||||
|
;;
|
||||||
|
(p7) br.call.sptk.many rp=b1
|
||||||
|
|
||||||
|
__INITDATA
|
||||||
|
|
||||||
|
default_setup_hook = 0 // Currently nothing needs to be done.
|
||||||
|
|
||||||
|
.weak xen_setup_hook
|
||||||
|
|
||||||
|
.global hypervisor_type
|
||||||
|
hypervisor_type:
|
||||||
|
data8 PARAVIRT_HYPERVISOR_TYPE_DEFAULT
|
||||||
|
|
||||||
|
// must have the same order with PARAVIRT_HYPERVISOR_TYPE_xxx
|
||||||
|
|
||||||
|
hypervisor_setup_hooks:
|
||||||
|
data8 default_setup_hook
|
||||||
|
data8 xen_setup_hook
|
||||||
|
num_hypervisor_hooks = (. - hypervisor_setup_hooks) / 8
|
||||||
|
.previous
|
||||||
|
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
(isAP) br.call.sptk.many rp=start_secondary
|
(isAP) br.call.sptk.many rp=start_secondary
|
||||||
.ret0:
|
.ret0:
|
||||||
|
|
|
@ -585,6 +585,15 @@ static inline int irq_is_shared (int irq)
|
||||||
return (iosapic_intr_info[irq].count > 1);
|
return (iosapic_intr_info[irq].count > 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
struct irq_chip*
|
||||||
|
ia64_native_iosapic_get_irq_chip(unsigned long trigger)
|
||||||
|
{
|
||||||
|
if (trigger == IOSAPIC_EDGE)
|
||||||
|
return &irq_type_iosapic_edge;
|
||||||
|
else
|
||||||
|
return &irq_type_iosapic_level;
|
||||||
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
register_intr (unsigned int gsi, int irq, unsigned char delivery,
|
register_intr (unsigned int gsi, int irq, unsigned char delivery,
|
||||||
unsigned long polarity, unsigned long trigger)
|
unsigned long polarity, unsigned long trigger)
|
||||||
|
@ -635,13 +644,10 @@ register_intr (unsigned int gsi, int irq, unsigned char delivery,
|
||||||
iosapic_intr_info[irq].dmode = delivery;
|
iosapic_intr_info[irq].dmode = delivery;
|
||||||
iosapic_intr_info[irq].trigger = trigger;
|
iosapic_intr_info[irq].trigger = trigger;
|
||||||
|
|
||||||
if (trigger == IOSAPIC_EDGE)
|
irq_type = iosapic_get_irq_chip(trigger);
|
||||||
irq_type = &irq_type_iosapic_edge;
|
|
||||||
else
|
|
||||||
irq_type = &irq_type_iosapic_level;
|
|
||||||
|
|
||||||
idesc = irq_desc + irq;
|
idesc = irq_desc + irq;
|
||||||
if (idesc->chip != irq_type) {
|
if (irq_type != NULL && idesc->chip != irq_type) {
|
||||||
if (idesc->chip != &no_irq_type)
|
if (idesc->chip != &no_irq_type)
|
||||||
printk(KERN_WARNING
|
printk(KERN_WARNING
|
||||||
"%s: changing vector %d from %s to %s\n",
|
"%s: changing vector %d from %s to %s\n",
|
||||||
|
@ -973,6 +979,22 @@ iosapic_override_isa_irq (unsigned int isa_irq, unsigned int gsi,
|
||||||
set_rte(gsi, irq, dest, 1);
|
set_rte(gsi, irq, dest, 1);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
void __init
|
||||||
|
ia64_native_iosapic_pcat_compat_init(void)
|
||||||
|
{
|
||||||
|
if (pcat_compat) {
|
||||||
|
/*
|
||||||
|
* Disable the compatibility mode interrupts (8259 style),
|
||||||
|
* needs IN/OUT support enabled.
|
||||||
|
*/
|
||||||
|
printk(KERN_INFO
|
||||||
|
"%s: Disabling PC-AT compatible 8259 interrupts\n",
|
||||||
|
__func__);
|
||||||
|
outb(0xff, 0xA1);
|
||||||
|
outb(0xff, 0x21);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
void __init
|
void __init
|
||||||
iosapic_system_init (int system_pcat_compat)
|
iosapic_system_init (int system_pcat_compat)
|
||||||
{
|
{
|
||||||
|
@ -987,17 +1009,8 @@ iosapic_system_init (int system_pcat_compat)
|
||||||
}
|
}
|
||||||
|
|
||||||
pcat_compat = system_pcat_compat;
|
pcat_compat = system_pcat_compat;
|
||||||
if (pcat_compat) {
|
if (pcat_compat)
|
||||||
/*
|
iosapic_pcat_compat_init();
|
||||||
* Disable the compatibility mode interrupts (8259 style),
|
|
||||||
* needs IN/OUT support enabled.
|
|
||||||
*/
|
|
||||||
printk(KERN_INFO
|
|
||||||
"%s: Disabling PC-AT compatible 8259 interrupts\n",
|
|
||||||
__func__);
|
|
||||||
outb(0xff, 0xA1);
|
|
||||||
outb(0xff, 0x21);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int
|
static inline int
|
||||||
|
|
|
@ -196,7 +196,7 @@ static void clear_irq_vector(int irq)
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
assign_irq_vector (int irq)
|
ia64_native_assign_irq_vector (int irq)
|
||||||
{
|
{
|
||||||
unsigned long flags;
|
unsigned long flags;
|
||||||
int vector, cpu;
|
int vector, cpu;
|
||||||
|
@ -222,7 +222,7 @@ assign_irq_vector (int irq)
|
||||||
}
|
}
|
||||||
|
|
||||||
void
|
void
|
||||||
free_irq_vector (int vector)
|
ia64_native_free_irq_vector (int vector)
|
||||||
{
|
{
|
||||||
if (vector < IA64_FIRST_DEVICE_VECTOR ||
|
if (vector < IA64_FIRST_DEVICE_VECTOR ||
|
||||||
vector > IA64_LAST_DEVICE_VECTOR)
|
vector > IA64_LAST_DEVICE_VECTOR)
|
||||||
|
@ -600,7 +600,6 @@ static irqreturn_t dummy_handler (int irq, void *dev_id)
|
||||||
{
|
{
|
||||||
BUG();
|
BUG();
|
||||||
}
|
}
|
||||||
extern irqreturn_t handle_IPI (int irq, void *dev_id);
|
|
||||||
|
|
||||||
static struct irqaction ipi_irqaction = {
|
static struct irqaction ipi_irqaction = {
|
||||||
.handler = handle_IPI,
|
.handler = handle_IPI,
|
||||||
|
@ -623,7 +622,7 @@ static struct irqaction tlb_irqaction = {
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
void
|
void
|
||||||
register_percpu_irq (ia64_vector vec, struct irqaction *action)
|
ia64_native_register_percpu_irq (ia64_vector vec, struct irqaction *action)
|
||||||
{
|
{
|
||||||
irq_desc_t *desc;
|
irq_desc_t *desc;
|
||||||
unsigned int irq;
|
unsigned int irq;
|
||||||
|
@ -638,13 +637,21 @@ register_percpu_irq (ia64_vector vec, struct irqaction *action)
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init
|
void __init
|
||||||
init_IRQ (void)
|
ia64_native_register_ipi(void)
|
||||||
{
|
{
|
||||||
register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
|
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);
|
register_percpu_irq(IA64_IPI_VECTOR, &ipi_irqaction);
|
||||||
register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction);
|
register_percpu_irq(IA64_IPI_RESCHEDULE, &resched_irqaction);
|
||||||
register_percpu_irq(IA64_IPI_LOCAL_TLB_FLUSH, &tlb_irqaction);
|
register_percpu_irq(IA64_IPI_LOCAL_TLB_FLUSH, &tlb_irqaction);
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
|
||||||
|
void __init
|
||||||
|
init_IRQ (void)
|
||||||
|
{
|
||||||
|
ia64_register_ipi();
|
||||||
|
register_percpu_irq(IA64_SPURIOUS_INT_VECTOR, NULL);
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_DIG)
|
#if defined(CONFIG_IA64_GENERIC) || defined(CONFIG_IA64_DIG)
|
||||||
if (vector_domain_type != VECTOR_DOMAIN_NONE) {
|
if (vector_domain_type != VECTOR_DOMAIN_NONE) {
|
||||||
BUG_ON(IA64_FIRST_DEVICE_VECTOR != IA64_IRQ_MOVE_VECTOR);
|
BUG_ON(IA64_FIRST_DEVICE_VECTOR != IA64_IRQ_MOVE_VECTOR);
|
||||||
|
|
|
@ -12,6 +12,14 @@
|
||||||
*
|
*
|
||||||
* 00/08/23 Asit Mallick <asit.k.mallick@intel.com> TLB handling for SMP
|
* 00/08/23 Asit Mallick <asit.k.mallick@intel.com> TLB handling for SMP
|
||||||
* 00/12/20 David Mosberger-Tang <davidm@hpl.hp.com> DTLB/ITLB handler now uses virtual PT.
|
* 00/12/20 David Mosberger-Tang <davidm@hpl.hp.com> DTLB/ITLB handler now uses virtual PT.
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005 Hewlett-Packard Co
|
||||||
|
* Dan Magenheimer <dan.magenheimer@hp.com>
|
||||||
|
* Xen paravirtualization
|
||||||
|
* Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
|
||||||
|
* VA Linux Systems Japan K.K.
|
||||||
|
* pv_ops.
|
||||||
|
* Yaozu (Eddie) Dong <eddie.dong@intel.com>
|
||||||
*/
|
*/
|
||||||
/*
|
/*
|
||||||
* This file defines the interruption vector table used by the CPU.
|
* This file defines the interruption vector table used by the CPU.
|
||||||
|
@ -102,13 +110,13 @@ ENTRY(vhpt_miss)
|
||||||
* - the faulting virtual address uses unimplemented address bits
|
* - the faulting virtual address uses unimplemented address bits
|
||||||
* - the faulting virtual address has no valid page table mapping
|
* - the faulting virtual address has no valid page table mapping
|
||||||
*/
|
*/
|
||||||
mov r16=cr.ifa // get address that caused the TLB miss
|
MOV_FROM_IFA(r16) // get address that caused the TLB miss
|
||||||
#ifdef CONFIG_HUGETLB_PAGE
|
#ifdef CONFIG_HUGETLB_PAGE
|
||||||
movl r18=PAGE_SHIFT
|
movl r18=PAGE_SHIFT
|
||||||
mov r25=cr.itir
|
MOV_FROM_ITIR(r25)
|
||||||
#endif
|
#endif
|
||||||
;;
|
;;
|
||||||
rsm psr.dt // use physical addressing for data
|
RSM_PSR_DT // use physical addressing for data
|
||||||
mov r31=pr // save the predicate registers
|
mov r31=pr // save the predicate registers
|
||||||
mov r19=IA64_KR(PT_BASE) // get page table base address
|
mov r19=IA64_KR(PT_BASE) // get page table base address
|
||||||
shl r21=r16,3 // shift bit 60 into sign bit
|
shl r21=r16,3 // shift bit 60 into sign bit
|
||||||
|
@ -168,21 +176,21 @@ ENTRY(vhpt_miss)
|
||||||
dep r21=r19,r20,3,(PAGE_SHIFT-3) // r21=pte_offset(pmd,addr)
|
dep r21=r19,r20,3,(PAGE_SHIFT-3) // r21=pte_offset(pmd,addr)
|
||||||
;;
|
;;
|
||||||
(p7) ld8 r18=[r21] // read *pte
|
(p7) ld8 r18=[r21] // read *pte
|
||||||
mov r19=cr.isr // cr.isr bit 32 tells us if this is an insn miss
|
MOV_FROM_ISR(r19) // cr.isr bit 32 tells us if this is an insn miss
|
||||||
;;
|
;;
|
||||||
(p7) tbit.z p6,p7=r18,_PAGE_P_BIT // page present bit cleared?
|
(p7) tbit.z p6,p7=r18,_PAGE_P_BIT // page present bit cleared?
|
||||||
mov r22=cr.iha // get the VHPT address that caused the TLB miss
|
MOV_FROM_IHA(r22) // get the VHPT address that caused the TLB miss
|
||||||
;; // avoid RAW on p7
|
;; // avoid RAW on p7
|
||||||
(p7) tbit.nz.unc p10,p11=r19,32 // is it an instruction TLB miss?
|
(p7) tbit.nz.unc p10,p11=r19,32 // is it an instruction TLB miss?
|
||||||
dep r23=0,r20,0,PAGE_SHIFT // clear low bits to get page address
|
dep r23=0,r20,0,PAGE_SHIFT // clear low bits to get page address
|
||||||
;;
|
;;
|
||||||
(p10) itc.i r18 // insert the instruction TLB entry
|
ITC_I_AND_D(p10, p11, r18, r24) // insert the instruction TLB entry and
|
||||||
(p11) itc.d r18 // insert the data TLB entry
|
// insert the data TLB entry
|
||||||
(p6) br.cond.spnt.many page_fault // handle bad address/page not present (page fault)
|
(p6) br.cond.spnt.many page_fault // handle bad address/page not present (page fault)
|
||||||
mov cr.ifa=r22
|
MOV_TO_IFA(r22, r24)
|
||||||
|
|
||||||
#ifdef CONFIG_HUGETLB_PAGE
|
#ifdef CONFIG_HUGETLB_PAGE
|
||||||
(p8) mov cr.itir=r25 // change to default page-size for VHPT
|
MOV_TO_ITIR(p8, r25, r24) // change to default page-size for VHPT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -192,7 +200,7 @@ ENTRY(vhpt_miss)
|
||||||
*/
|
*/
|
||||||
adds r24=__DIRTY_BITS_NO_ED|_PAGE_PL_0|_PAGE_AR_RW,r23
|
adds r24=__DIRTY_BITS_NO_ED|_PAGE_PL_0|_PAGE_AR_RW,r23
|
||||||
;;
|
;;
|
||||||
(p7) itc.d r24
|
ITC_D(p7, r24, r25)
|
||||||
;;
|
;;
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
/*
|
/*
|
||||||
|
@ -234,7 +242,7 @@ ENTRY(vhpt_miss)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
mov pr=r31,-1 // restore predicate registers
|
mov pr=r31,-1 // restore predicate registers
|
||||||
rfi
|
RFI
|
||||||
END(vhpt_miss)
|
END(vhpt_miss)
|
||||||
|
|
||||||
.org ia64_ivt+0x400
|
.org ia64_ivt+0x400
|
||||||
|
@ -248,11 +256,11 @@ ENTRY(itlb_miss)
|
||||||
* mode, walk the page table, and then re-execute the PTE read and
|
* mode, walk the page table, and then re-execute the PTE read and
|
||||||
* go on normally after that.
|
* go on normally after that.
|
||||||
*/
|
*/
|
||||||
mov r16=cr.ifa // get virtual address
|
MOV_FROM_IFA(r16) // get virtual address
|
||||||
mov r29=b0 // save b0
|
mov r29=b0 // save b0
|
||||||
mov r31=pr // save predicates
|
mov r31=pr // save predicates
|
||||||
.itlb_fault:
|
.itlb_fault:
|
||||||
mov r17=cr.iha // get virtual address of PTE
|
MOV_FROM_IHA(r17) // get virtual address of PTE
|
||||||
movl r30=1f // load nested fault continuation point
|
movl r30=1f // load nested fault continuation point
|
||||||
;;
|
;;
|
||||||
1: ld8 r18=[r17] // read *pte
|
1: ld8 r18=[r17] // read *pte
|
||||||
|
@ -261,7 +269,7 @@ ENTRY(itlb_miss)
|
||||||
tbit.z p6,p0=r18,_PAGE_P_BIT // page present bit cleared?
|
tbit.z p6,p0=r18,_PAGE_P_BIT // page present bit cleared?
|
||||||
(p6) br.cond.spnt page_fault
|
(p6) br.cond.spnt page_fault
|
||||||
;;
|
;;
|
||||||
itc.i r18
|
ITC_I(p0, r18, r19)
|
||||||
;;
|
;;
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
/*
|
/*
|
||||||
|
@ -278,7 +286,7 @@ ENTRY(itlb_miss)
|
||||||
(p7) ptc.l r16,r20
|
(p7) ptc.l r16,r20
|
||||||
#endif
|
#endif
|
||||||
mov pr=r31,-1
|
mov pr=r31,-1
|
||||||
rfi
|
RFI
|
||||||
END(itlb_miss)
|
END(itlb_miss)
|
||||||
|
|
||||||
.org ia64_ivt+0x0800
|
.org ia64_ivt+0x0800
|
||||||
|
@ -292,11 +300,11 @@ ENTRY(dtlb_miss)
|
||||||
* mode, walk the page table, and then re-execute the PTE read and
|
* mode, walk the page table, and then re-execute the PTE read and
|
||||||
* go on normally after that.
|
* go on normally after that.
|
||||||
*/
|
*/
|
||||||
mov r16=cr.ifa // get virtual address
|
MOV_FROM_IFA(r16) // get virtual address
|
||||||
mov r29=b0 // save b0
|
mov r29=b0 // save b0
|
||||||
mov r31=pr // save predicates
|
mov r31=pr // save predicates
|
||||||
dtlb_fault:
|
dtlb_fault:
|
||||||
mov r17=cr.iha // get virtual address of PTE
|
MOV_FROM_IHA(r17) // get virtual address of PTE
|
||||||
movl r30=1f // load nested fault continuation point
|
movl r30=1f // load nested fault continuation point
|
||||||
;;
|
;;
|
||||||
1: ld8 r18=[r17] // read *pte
|
1: ld8 r18=[r17] // read *pte
|
||||||
|
@ -305,7 +313,7 @@ dtlb_fault:
|
||||||
tbit.z p6,p0=r18,_PAGE_P_BIT // page present bit cleared?
|
tbit.z p6,p0=r18,_PAGE_P_BIT // page present bit cleared?
|
||||||
(p6) br.cond.spnt page_fault
|
(p6) br.cond.spnt page_fault
|
||||||
;;
|
;;
|
||||||
itc.d r18
|
ITC_D(p0, r18, r19)
|
||||||
;;
|
;;
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
/*
|
/*
|
||||||
|
@ -322,7 +330,7 @@ dtlb_fault:
|
||||||
(p7) ptc.l r16,r20
|
(p7) ptc.l r16,r20
|
||||||
#endif
|
#endif
|
||||||
mov pr=r31,-1
|
mov pr=r31,-1
|
||||||
rfi
|
RFI
|
||||||
END(dtlb_miss)
|
END(dtlb_miss)
|
||||||
|
|
||||||
.org ia64_ivt+0x0c00
|
.org ia64_ivt+0x0c00
|
||||||
|
@ -330,9 +338,9 @@ END(dtlb_miss)
|
||||||
// 0x0c00 Entry 3 (size 64 bundles) Alt ITLB (19)
|
// 0x0c00 Entry 3 (size 64 bundles) Alt ITLB (19)
|
||||||
ENTRY(alt_itlb_miss)
|
ENTRY(alt_itlb_miss)
|
||||||
DBG_FAULT(3)
|
DBG_FAULT(3)
|
||||||
mov r16=cr.ifa // get address that caused the TLB miss
|
MOV_FROM_IFA(r16) // get address that caused the TLB miss
|
||||||
movl r17=PAGE_KERNEL
|
movl r17=PAGE_KERNEL
|
||||||
mov r21=cr.ipsr
|
MOV_FROM_IPSR(p0, r21)
|
||||||
movl r19=(((1 << IA64_MAX_PHYS_BITS) - 1) & ~0xfff)
|
movl r19=(((1 << IA64_MAX_PHYS_BITS) - 1) & ~0xfff)
|
||||||
mov r31=pr
|
mov r31=pr
|
||||||
;;
|
;;
|
||||||
|
@ -341,9 +349,9 @@ ENTRY(alt_itlb_miss)
|
||||||
;;
|
;;
|
||||||
cmp.gt p8,p0=6,r22 // user mode
|
cmp.gt p8,p0=6,r22 // user mode
|
||||||
;;
|
;;
|
||||||
(p8) thash r17=r16
|
THASH(p8, r17, r16, r23)
|
||||||
;;
|
;;
|
||||||
(p8) mov cr.iha=r17
|
MOV_TO_IHA(p8, r17, r23)
|
||||||
(p8) mov r29=b0 // save b0
|
(p8) mov r29=b0 // save b0
|
||||||
(p8) br.cond.dptk .itlb_fault
|
(p8) br.cond.dptk .itlb_fault
|
||||||
#endif
|
#endif
|
||||||
|
@ -358,9 +366,9 @@ ENTRY(alt_itlb_miss)
|
||||||
or r19=r19,r18 // set bit 4 (uncached) if the access was to region 6
|
or r19=r19,r18 // set bit 4 (uncached) if the access was to region 6
|
||||||
(p8) br.cond.spnt page_fault
|
(p8) br.cond.spnt page_fault
|
||||||
;;
|
;;
|
||||||
itc.i r19 // insert the TLB entry
|
ITC_I(p0, r19, r18) // insert the TLB entry
|
||||||
mov pr=r31,-1
|
mov pr=r31,-1
|
||||||
rfi
|
RFI
|
||||||
END(alt_itlb_miss)
|
END(alt_itlb_miss)
|
||||||
|
|
||||||
.org ia64_ivt+0x1000
|
.org ia64_ivt+0x1000
|
||||||
|
@ -368,11 +376,11 @@ END(alt_itlb_miss)
|
||||||
// 0x1000 Entry 4 (size 64 bundles) Alt DTLB (7,46)
|
// 0x1000 Entry 4 (size 64 bundles) Alt DTLB (7,46)
|
||||||
ENTRY(alt_dtlb_miss)
|
ENTRY(alt_dtlb_miss)
|
||||||
DBG_FAULT(4)
|
DBG_FAULT(4)
|
||||||
mov r16=cr.ifa // get address that caused the TLB miss
|
MOV_FROM_IFA(r16) // get address that caused the TLB miss
|
||||||
movl r17=PAGE_KERNEL
|
movl r17=PAGE_KERNEL
|
||||||
mov r20=cr.isr
|
MOV_FROM_ISR(r20)
|
||||||
movl r19=(((1 << IA64_MAX_PHYS_BITS) - 1) & ~0xfff)
|
movl r19=(((1 << IA64_MAX_PHYS_BITS) - 1) & ~0xfff)
|
||||||
mov r21=cr.ipsr
|
MOV_FROM_IPSR(p0, r21)
|
||||||
mov r31=pr
|
mov r31=pr
|
||||||
mov r24=PERCPU_ADDR
|
mov r24=PERCPU_ADDR
|
||||||
;;
|
;;
|
||||||
|
@ -381,9 +389,9 @@ ENTRY(alt_dtlb_miss)
|
||||||
;;
|
;;
|
||||||
cmp.gt p8,p0=6,r22 // access to region 0-5
|
cmp.gt p8,p0=6,r22 // access to region 0-5
|
||||||
;;
|
;;
|
||||||
(p8) thash r17=r16
|
THASH(p8, r17, r16, r25)
|
||||||
;;
|
;;
|
||||||
(p8) mov cr.iha=r17
|
MOV_TO_IHA(p8, r17, r25)
|
||||||
(p8) mov r29=b0 // save b0
|
(p8) mov r29=b0 // save b0
|
||||||
(p8) br.cond.dptk dtlb_fault
|
(p8) br.cond.dptk dtlb_fault
|
||||||
#endif
|
#endif
|
||||||
|
@ -402,7 +410,7 @@ ENTRY(alt_dtlb_miss)
|
||||||
tbit.nz p9,p0=r20,IA64_ISR_NA_BIT // is non-access bit on?
|
tbit.nz p9,p0=r20,IA64_ISR_NA_BIT // is non-access bit on?
|
||||||
;;
|
;;
|
||||||
(p10) sub r19=r19,r26
|
(p10) sub r19=r19,r26
|
||||||
(p10) mov cr.itir=r25
|
MOV_TO_ITIR(p10, r25, r24)
|
||||||
cmp.ne p8,p0=r0,r23
|
cmp.ne p8,p0=r0,r23
|
||||||
(p9) cmp.eq.or.andcm p6,p7=IA64_ISR_CODE_LFETCH,r22 // check isr.code field
|
(p9) cmp.eq.or.andcm p6,p7=IA64_ISR_CODE_LFETCH,r22 // check isr.code field
|
||||||
(p12) dep r17=-1,r17,4,1 // set ma=UC for region 6 addr
|
(p12) dep r17=-1,r17,4,1 // set ma=UC for region 6 addr
|
||||||
|
@ -411,11 +419,11 @@ ENTRY(alt_dtlb_miss)
|
||||||
dep r21=-1,r21,IA64_PSR_ED_BIT,1
|
dep r21=-1,r21,IA64_PSR_ED_BIT,1
|
||||||
;;
|
;;
|
||||||
or r19=r19,r17 // insert PTE control bits into r19
|
or r19=r19,r17 // insert PTE control bits into r19
|
||||||
(p6) mov cr.ipsr=r21
|
MOV_TO_IPSR(p6, r21, r24)
|
||||||
;;
|
;;
|
||||||
(p7) itc.d r19 // insert the TLB entry
|
ITC_D(p7, r19, r18) // insert the TLB entry
|
||||||
mov pr=r31,-1
|
mov pr=r31,-1
|
||||||
rfi
|
RFI
|
||||||
END(alt_dtlb_miss)
|
END(alt_dtlb_miss)
|
||||||
|
|
||||||
.org ia64_ivt+0x1400
|
.org ia64_ivt+0x1400
|
||||||
|
@ -444,10 +452,10 @@ ENTRY(nested_dtlb_miss)
|
||||||
*
|
*
|
||||||
* Clobbered: b0, r18, r19, r21, r22, psr.dt (cleared)
|
* Clobbered: b0, r18, r19, r21, r22, psr.dt (cleared)
|
||||||
*/
|
*/
|
||||||
rsm psr.dt // switch to using physical data addressing
|
RSM_PSR_DT // switch to using physical data addressing
|
||||||
mov r19=IA64_KR(PT_BASE) // get the page table base address
|
mov r19=IA64_KR(PT_BASE) // get the page table base address
|
||||||
shl r21=r16,3 // shift bit 60 into sign bit
|
shl r21=r16,3 // shift bit 60 into sign bit
|
||||||
mov r18=cr.itir
|
MOV_FROM_ITIR(r18)
|
||||||
;;
|
;;
|
||||||
shr.u r17=r16,61 // get the region number into r17
|
shr.u r17=r16,61 // get the region number into r17
|
||||||
extr.u r18=r18,2,6 // get the faulting page size
|
extr.u r18=r18,2,6 // get the faulting page size
|
||||||
|
@ -507,33 +515,6 @@ ENTRY(ikey_miss)
|
||||||
FAULT(6)
|
FAULT(6)
|
||||||
END(ikey_miss)
|
END(ikey_miss)
|
||||||
|
|
||||||
//-----------------------------------------------------------------------------------
|
|
||||||
// call do_page_fault (predicates are in r31, psr.dt may be off, r16 is faulting address)
|
|
||||||
ENTRY(page_fault)
|
|
||||||
ssm psr.dt
|
|
||||||
;;
|
|
||||||
srlz.i
|
|
||||||
;;
|
|
||||||
SAVE_MIN_WITH_COVER
|
|
||||||
alloc r15=ar.pfs,0,0,3,0
|
|
||||||
mov out0=cr.ifa
|
|
||||||
mov out1=cr.isr
|
|
||||||
adds r3=8,r2 // set up second base pointer
|
|
||||||
;;
|
|
||||||
ssm psr.ic | PSR_DEFAULT_BITS
|
|
||||||
;;
|
|
||||||
srlz.i // guarantee that interruption collectin is on
|
|
||||||
;;
|
|
||||||
(p15) ssm psr.i // restore psr.i
|
|
||||||
movl r14=ia64_leave_kernel
|
|
||||||
;;
|
|
||||||
SAVE_REST
|
|
||||||
mov rp=r14
|
|
||||||
;;
|
|
||||||
adds out2=16,r12 // out2 = pointer to pt_regs
|
|
||||||
br.call.sptk.many b6=ia64_do_page_fault // ignore return address
|
|
||||||
END(page_fault)
|
|
||||||
|
|
||||||
.org ia64_ivt+0x1c00
|
.org ia64_ivt+0x1c00
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// 0x1c00 Entry 7 (size 64 bundles) Data Key Miss (12,51)
|
// 0x1c00 Entry 7 (size 64 bundles) Data Key Miss (12,51)
|
||||||
|
@ -556,10 +537,10 @@ ENTRY(dirty_bit)
|
||||||
* page table TLB entry isn't present, we take a nested TLB miss hit where we look
|
* page table TLB entry isn't present, we take a nested TLB miss hit where we look
|
||||||
* up the physical address of the L3 PTE and then continue at label 1 below.
|
* up the physical address of the L3 PTE and then continue at label 1 below.
|
||||||
*/
|
*/
|
||||||
mov r16=cr.ifa // get the address that caused the fault
|
MOV_FROM_IFA(r16) // get the address that caused the fault
|
||||||
movl r30=1f // load continuation point in case of nested fault
|
movl r30=1f // load continuation point in case of nested fault
|
||||||
;;
|
;;
|
||||||
thash r17=r16 // compute virtual address of L3 PTE
|
THASH(p0, r17, r16, r18) // compute virtual address of L3 PTE
|
||||||
mov r29=b0 // save b0 in case of nested fault
|
mov r29=b0 // save b0 in case of nested fault
|
||||||
mov r31=pr // save pr
|
mov r31=pr // save pr
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
@ -576,7 +557,7 @@ ENTRY(dirty_bit)
|
||||||
;;
|
;;
|
||||||
(p6) cmp.eq p6,p7=r26,r18 // Only compare if page is present
|
(p6) cmp.eq p6,p7=r26,r18 // Only compare if page is present
|
||||||
;;
|
;;
|
||||||
(p6) itc.d r25 // install updated PTE
|
ITC_D(p6, r25, r18) // install updated PTE
|
||||||
;;
|
;;
|
||||||
/*
|
/*
|
||||||
* Tell the assemblers dependency-violation checker that the above "itc" instructions
|
* Tell the assemblers dependency-violation checker that the above "itc" instructions
|
||||||
|
@ -602,7 +583,7 @@ ENTRY(dirty_bit)
|
||||||
itc.d r18 // install updated PTE
|
itc.d r18 // install updated PTE
|
||||||
#endif
|
#endif
|
||||||
mov pr=r31,-1 // restore pr
|
mov pr=r31,-1 // restore pr
|
||||||
rfi
|
RFI
|
||||||
END(dirty_bit)
|
END(dirty_bit)
|
||||||
|
|
||||||
.org ia64_ivt+0x2400
|
.org ia64_ivt+0x2400
|
||||||
|
@ -611,22 +592,22 @@ END(dirty_bit)
|
||||||
ENTRY(iaccess_bit)
|
ENTRY(iaccess_bit)
|
||||||
DBG_FAULT(9)
|
DBG_FAULT(9)
|
||||||
// Like Entry 8, except for instruction access
|
// Like Entry 8, except for instruction access
|
||||||
mov r16=cr.ifa // get the address that caused the fault
|
MOV_FROM_IFA(r16) // get the address that caused the fault
|
||||||
movl r30=1f // load continuation point in case of nested fault
|
movl r30=1f // load continuation point in case of nested fault
|
||||||
mov r31=pr // save predicates
|
mov r31=pr // save predicates
|
||||||
#ifdef CONFIG_ITANIUM
|
#ifdef CONFIG_ITANIUM
|
||||||
/*
|
/*
|
||||||
* Erratum 10 (IFA may contain incorrect address) has "NoFix" status.
|
* Erratum 10 (IFA may contain incorrect address) has "NoFix" status.
|
||||||
*/
|
*/
|
||||||
mov r17=cr.ipsr
|
MOV_FROM_IPSR(p0, r17)
|
||||||
;;
|
;;
|
||||||
mov r18=cr.iip
|
MOV_FROM_IIP(r18)
|
||||||
tbit.z p6,p0=r17,IA64_PSR_IS_BIT // IA64 instruction set?
|
tbit.z p6,p0=r17,IA64_PSR_IS_BIT // IA64 instruction set?
|
||||||
;;
|
;;
|
||||||
(p6) mov r16=r18 // if so, use cr.iip instead of cr.ifa
|
(p6) mov r16=r18 // if so, use cr.iip instead of cr.ifa
|
||||||
#endif /* CONFIG_ITANIUM */
|
#endif /* CONFIG_ITANIUM */
|
||||||
;;
|
;;
|
||||||
thash r17=r16 // compute virtual address of L3 PTE
|
THASH(p0, r17, r16, r18) // compute virtual address of L3 PTE
|
||||||
mov r29=b0 // save b0 in case of nested fault)
|
mov r29=b0 // save b0 in case of nested fault)
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
mov r28=ar.ccv // save ar.ccv
|
mov r28=ar.ccv // save ar.ccv
|
||||||
|
@ -642,7 +623,7 @@ ENTRY(iaccess_bit)
|
||||||
;;
|
;;
|
||||||
(p6) cmp.eq p6,p7=r26,r18 // Only if page present
|
(p6) cmp.eq p6,p7=r26,r18 // Only if page present
|
||||||
;;
|
;;
|
||||||
(p6) itc.i r25 // install updated PTE
|
ITC_I(p6, r25, r26) // install updated PTE
|
||||||
;;
|
;;
|
||||||
/*
|
/*
|
||||||
* Tell the assemblers dependency-violation checker that the above "itc" instructions
|
* Tell the assemblers dependency-violation checker that the above "itc" instructions
|
||||||
|
@ -668,7 +649,7 @@ ENTRY(iaccess_bit)
|
||||||
itc.i r18 // install updated PTE
|
itc.i r18 // install updated PTE
|
||||||
#endif /* !CONFIG_SMP */
|
#endif /* !CONFIG_SMP */
|
||||||
mov pr=r31,-1
|
mov pr=r31,-1
|
||||||
rfi
|
RFI
|
||||||
END(iaccess_bit)
|
END(iaccess_bit)
|
||||||
|
|
||||||
.org ia64_ivt+0x2800
|
.org ia64_ivt+0x2800
|
||||||
|
@ -677,10 +658,10 @@ END(iaccess_bit)
|
||||||
ENTRY(daccess_bit)
|
ENTRY(daccess_bit)
|
||||||
DBG_FAULT(10)
|
DBG_FAULT(10)
|
||||||
// Like Entry 8, except for data access
|
// Like Entry 8, except for data access
|
||||||
mov r16=cr.ifa // get the address that caused the fault
|
MOV_FROM_IFA(r16) // get the address that caused the fault
|
||||||
movl r30=1f // load continuation point in case of nested fault
|
movl r30=1f // load continuation point in case of nested fault
|
||||||
;;
|
;;
|
||||||
thash r17=r16 // compute virtual address of L3 PTE
|
THASH(p0, r17, r16, r18) // compute virtual address of L3 PTE
|
||||||
mov r31=pr
|
mov r31=pr
|
||||||
mov r29=b0 // save b0 in case of nested fault)
|
mov r29=b0 // save b0 in case of nested fault)
|
||||||
#ifdef CONFIG_SMP
|
#ifdef CONFIG_SMP
|
||||||
|
@ -697,7 +678,7 @@ ENTRY(daccess_bit)
|
||||||
;;
|
;;
|
||||||
(p6) cmp.eq p6,p7=r26,r18 // Only if page is present
|
(p6) cmp.eq p6,p7=r26,r18 // Only if page is present
|
||||||
;;
|
;;
|
||||||
(p6) itc.d r25 // install updated PTE
|
ITC_D(p6, r25, r26) // install updated PTE
|
||||||
/*
|
/*
|
||||||
* Tell the assemblers dependency-violation checker that the above "itc" instructions
|
* Tell the assemblers dependency-violation checker that the above "itc" instructions
|
||||||
* cannot possibly affect the following loads:
|
* cannot possibly affect the following loads:
|
||||||
|
@ -721,7 +702,7 @@ ENTRY(daccess_bit)
|
||||||
#endif
|
#endif
|
||||||
mov b0=r29 // restore b0
|
mov b0=r29 // restore b0
|
||||||
mov pr=r31,-1
|
mov pr=r31,-1
|
||||||
rfi
|
RFI
|
||||||
END(daccess_bit)
|
END(daccess_bit)
|
||||||
|
|
||||||
.org ia64_ivt+0x2c00
|
.org ia64_ivt+0x2c00
|
||||||
|
@ -745,10 +726,10 @@ ENTRY(break_fault)
|
||||||
*/
|
*/
|
||||||
DBG_FAULT(11)
|
DBG_FAULT(11)
|
||||||
mov.m r16=IA64_KR(CURRENT) // M2 r16 <- current task (12 cyc)
|
mov.m r16=IA64_KR(CURRENT) // M2 r16 <- current task (12 cyc)
|
||||||
mov r29=cr.ipsr // M2 (12 cyc)
|
MOV_FROM_IPSR(p0, r29) // M2 (12 cyc)
|
||||||
mov r31=pr // I0 (2 cyc)
|
mov r31=pr // I0 (2 cyc)
|
||||||
|
|
||||||
mov r17=cr.iim // M2 (2 cyc)
|
MOV_FROM_IIM(r17) // M2 (2 cyc)
|
||||||
mov.m r27=ar.rsc // M2 (12 cyc)
|
mov.m r27=ar.rsc // M2 (12 cyc)
|
||||||
mov r18=__IA64_BREAK_SYSCALL // A
|
mov r18=__IA64_BREAK_SYSCALL // A
|
||||||
|
|
||||||
|
@ -767,7 +748,7 @@ ENTRY(break_fault)
|
||||||
nop.m 0
|
nop.m 0
|
||||||
movl r30=sys_call_table // X
|
movl r30=sys_call_table // X
|
||||||
|
|
||||||
mov r28=cr.iip // M2 (2 cyc)
|
MOV_FROM_IIP(r28) // M2 (2 cyc)
|
||||||
cmp.eq p0,p7=r18,r17 // I0 is this a system call?
|
cmp.eq p0,p7=r18,r17 // I0 is this a system call?
|
||||||
(p7) br.cond.spnt non_syscall // B no ->
|
(p7) br.cond.spnt non_syscall // B no ->
|
||||||
//
|
//
|
||||||
|
@ -864,18 +845,17 @@ ENTRY(break_fault)
|
||||||
#endif
|
#endif
|
||||||
mov ar.rsc=0x3 // M2 set eager mode, pl 0, LE, loadrs=0
|
mov ar.rsc=0x3 // M2 set eager mode, pl 0, LE, loadrs=0
|
||||||
nop 0
|
nop 0
|
||||||
bsw.1 // B (6 cyc) regs are saved, switch to bank 1
|
BSW_1(r2, r14) // B (6 cyc) regs are saved, switch to bank 1
|
||||||
;;
|
;;
|
||||||
|
|
||||||
ssm psr.ic | PSR_DEFAULT_BITS // M2 now it's safe to re-enable intr.-collection
|
SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(r3, r16) // M2 now it's safe to re-enable intr.-collection
|
||||||
|
// M0 ensure interruption collection is on
|
||||||
movl r3=ia64_ret_from_syscall // X
|
movl r3=ia64_ret_from_syscall // X
|
||||||
;;
|
;;
|
||||||
|
|
||||||
srlz.i // M0 ensure interruption collection is on
|
|
||||||
mov rp=r3 // I0 set the real return addr
|
mov rp=r3 // I0 set the real return addr
|
||||||
(p10) br.cond.spnt.many ia64_ret_from_syscall // B return if bad call-frame or r15 is a NaT
|
(p10) br.cond.spnt.many ia64_ret_from_syscall // B return if bad call-frame or r15 is a NaT
|
||||||
|
|
||||||
(p15) ssm psr.i // M2 restore psr.i
|
SSM_PSR_I(p15, p15, r16) // M2 restore psr.i
|
||||||
(p14) br.call.sptk.many b6=b6 // B invoke syscall-handker (ignore return addr)
|
(p14) br.call.sptk.many b6=b6 // B invoke syscall-handker (ignore return addr)
|
||||||
br.cond.spnt.many ia64_trace_syscall // B do syscall-tracing thingamagic
|
br.cond.spnt.many ia64_trace_syscall // B do syscall-tracing thingamagic
|
||||||
// NOT REACHED
|
// NOT REACHED
|
||||||
|
@ -895,27 +875,8 @@ END(break_fault)
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// 0x3000 Entry 12 (size 64 bundles) External Interrupt (4)
|
// 0x3000 Entry 12 (size 64 bundles) External Interrupt (4)
|
||||||
ENTRY(interrupt)
|
ENTRY(interrupt)
|
||||||
DBG_FAULT(12)
|
/* interrupt handler has become too big to fit this area. */
|
||||||
mov r31=pr // prepare to save predicates
|
br.sptk.many __interrupt
|
||||||
;;
|
|
||||||
SAVE_MIN_WITH_COVER // uses r31; defines r2 and r3
|
|
||||||
ssm psr.ic | PSR_DEFAULT_BITS
|
|
||||||
;;
|
|
||||||
adds r3=8,r2 // set up second base pointer for SAVE_REST
|
|
||||||
srlz.i // ensure everybody knows psr.ic is back on
|
|
||||||
;;
|
|
||||||
SAVE_REST
|
|
||||||
;;
|
|
||||||
MCA_RECOVER_RANGE(interrupt)
|
|
||||||
alloc r14=ar.pfs,0,0,2,0 // must be first in an insn group
|
|
||||||
mov out0=cr.ivr // pass cr.ivr as first arg
|
|
||||||
add out1=16,sp // pass pointer to pt_regs as second arg
|
|
||||||
;;
|
|
||||||
srlz.d // make sure we see the effect of cr.ivr
|
|
||||||
movl r14=ia64_leave_kernel
|
|
||||||
;;
|
|
||||||
mov rp=r14
|
|
||||||
br.call.sptk.many b6=ia64_handle_irq
|
|
||||||
END(interrupt)
|
END(interrupt)
|
||||||
|
|
||||||
.org ia64_ivt+0x3400
|
.org ia64_ivt+0x3400
|
||||||
|
@ -978,6 +939,7 @@ END(interrupt)
|
||||||
* - ar.fpsr: set to kernel settings
|
* - ar.fpsr: set to kernel settings
|
||||||
* - b6: preserved (same as on entry)
|
* - b6: preserved (same as on entry)
|
||||||
*/
|
*/
|
||||||
|
#ifdef __IA64_ASM_PARAVIRTUALIZED_NATIVE
|
||||||
GLOBAL_ENTRY(ia64_syscall_setup)
|
GLOBAL_ENTRY(ia64_syscall_setup)
|
||||||
#if PT(B6) != 0
|
#if PT(B6) != 0
|
||||||
# error This code assumes that b6 is the first field in pt_regs.
|
# error This code assumes that b6 is the first field in pt_regs.
|
||||||
|
@ -1069,6 +1031,7 @@ GLOBAL_ENTRY(ia64_syscall_setup)
|
||||||
(p10) mov r8=-EINVAL
|
(p10) mov r8=-EINVAL
|
||||||
br.ret.sptk.many b7
|
br.ret.sptk.many b7
|
||||||
END(ia64_syscall_setup)
|
END(ia64_syscall_setup)
|
||||||
|
#endif /* __IA64_ASM_PARAVIRTUALIZED_NATIVE */
|
||||||
|
|
||||||
.org ia64_ivt+0x3c00
|
.org ia64_ivt+0x3c00
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
|
@ -1082,7 +1045,7 @@ END(ia64_syscall_setup)
|
||||||
DBG_FAULT(16)
|
DBG_FAULT(16)
|
||||||
FAULT(16)
|
FAULT(16)
|
||||||
|
|
||||||
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
|
#if defined(CONFIG_VIRT_CPU_ACCOUNTING) && defined(__IA64_ASM_PARAVIRTUALIZED_NATIVE)
|
||||||
/*
|
/*
|
||||||
* There is no particular reason for this code to be here, other than
|
* There is no particular reason for this code to be here, other than
|
||||||
* that there happens to be space here that would go unused otherwise.
|
* that there happens to be space here that would go unused otherwise.
|
||||||
|
@ -1092,7 +1055,7 @@ END(ia64_syscall_setup)
|
||||||
* account_sys_enter is called from SAVE_MIN* macros if accounting is
|
* account_sys_enter is called from SAVE_MIN* macros if accounting is
|
||||||
* enabled and if the macro is entered from user mode.
|
* enabled and if the macro is entered from user mode.
|
||||||
*/
|
*/
|
||||||
ENTRY(account_sys_enter)
|
GLOBAL_ENTRY(account_sys_enter)
|
||||||
// mov.m r20=ar.itc is called in advance, and r13 is current
|
// mov.m r20=ar.itc is called in advance, and r13 is current
|
||||||
add r16=TI_AC_STAMP+IA64_TASK_SIZE,r13
|
add r16=TI_AC_STAMP+IA64_TASK_SIZE,r13
|
||||||
add r17=TI_AC_LEAVE+IA64_TASK_SIZE,r13
|
add r17=TI_AC_LEAVE+IA64_TASK_SIZE,r13
|
||||||
|
@ -1123,110 +1086,18 @@ END(account_sys_enter)
|
||||||
DBG_FAULT(17)
|
DBG_FAULT(17)
|
||||||
FAULT(17)
|
FAULT(17)
|
||||||
|
|
||||||
ENTRY(non_syscall)
|
|
||||||
mov ar.rsc=r27 // restore ar.rsc before SAVE_MIN_WITH_COVER
|
|
||||||
;;
|
|
||||||
SAVE_MIN_WITH_COVER
|
|
||||||
|
|
||||||
// There is no particular reason for this code to be here, other than that
|
|
||||||
// there happens to be space here that would go unused otherwise. If this
|
|
||||||
// fault ever gets "unreserved", simply moved the following code to a more
|
|
||||||
// suitable spot...
|
|
||||||
|
|
||||||
alloc r14=ar.pfs,0,0,2,0
|
|
||||||
mov out0=cr.iim
|
|
||||||
add out1=16,sp
|
|
||||||
adds r3=8,r2 // set up second base pointer for SAVE_REST
|
|
||||||
|
|
||||||
ssm psr.ic | PSR_DEFAULT_BITS
|
|
||||||
;;
|
|
||||||
srlz.i // guarantee that interruption collection is on
|
|
||||||
;;
|
|
||||||
(p15) ssm psr.i // restore psr.i
|
|
||||||
movl r15=ia64_leave_kernel
|
|
||||||
;;
|
|
||||||
SAVE_REST
|
|
||||||
mov rp=r15
|
|
||||||
;;
|
|
||||||
br.call.sptk.many b6=ia64_bad_break // avoid WAW on CFM and ignore return addr
|
|
||||||
END(non_syscall)
|
|
||||||
|
|
||||||
.org ia64_ivt+0x4800
|
.org ia64_ivt+0x4800
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// 0x4800 Entry 18 (size 64 bundles) Reserved
|
// 0x4800 Entry 18 (size 64 bundles) Reserved
|
||||||
DBG_FAULT(18)
|
DBG_FAULT(18)
|
||||||
FAULT(18)
|
FAULT(18)
|
||||||
|
|
||||||
/*
|
|
||||||
* There is no particular reason for this code to be here, other than that
|
|
||||||
* there happens to be space here that would go unused otherwise. If this
|
|
||||||
* fault ever gets "unreserved", simply moved the following code to a more
|
|
||||||
* suitable spot...
|
|
||||||
*/
|
|
||||||
|
|
||||||
ENTRY(dispatch_unaligned_handler)
|
|
||||||
SAVE_MIN_WITH_COVER
|
|
||||||
;;
|
|
||||||
alloc r14=ar.pfs,0,0,2,0 // now it's safe (must be first in insn group!)
|
|
||||||
mov out0=cr.ifa
|
|
||||||
adds out1=16,sp
|
|
||||||
|
|
||||||
ssm psr.ic | PSR_DEFAULT_BITS
|
|
||||||
;;
|
|
||||||
srlz.i // guarantee that interruption collection is on
|
|
||||||
;;
|
|
||||||
(p15) ssm psr.i // restore psr.i
|
|
||||||
adds r3=8,r2 // set up second base pointer
|
|
||||||
;;
|
|
||||||
SAVE_REST
|
|
||||||
movl r14=ia64_leave_kernel
|
|
||||||
;;
|
|
||||||
mov rp=r14
|
|
||||||
br.sptk.many ia64_prepare_handle_unaligned
|
|
||||||
END(dispatch_unaligned_handler)
|
|
||||||
|
|
||||||
.org ia64_ivt+0x4c00
|
.org ia64_ivt+0x4c00
|
||||||
/////////////////////////////////////////////////////////////////////////////////////////
|
/////////////////////////////////////////////////////////////////////////////////////////
|
||||||
// 0x4c00 Entry 19 (size 64 bundles) Reserved
|
// 0x4c00 Entry 19 (size 64 bundles) Reserved
|
||||||
DBG_FAULT(19)
|
DBG_FAULT(19)
|
||||||
FAULT(19)
|
FAULT(19)
|
||||||
|
|
||||||
/*
|
|
||||||
* There is no particular reason for this code to be here, other than that
|
|
||||||
* there happens to be space here that would go unused otherwise. If this
|
|
||||||
* fault ever gets "unreserved", simply moved the following code to a more
|
|
||||||
* suitable spot...
|
|
||||||
*/
|
|
||||||
|
|
||||||
ENTRY(dispatch_to_fault_handler)
|
|
||||||
/*
|
|
||||||
* Input:
|
|
||||||
* psr.ic: off
|
|
||||||
* r19: fault vector number (e.g., 24 for General Exception)
|
|
||||||
* r31: contains saved predicates (pr)
|
|
||||||
*/
|
|
||||||
SAVE_MIN_WITH_COVER_R19
|
|
||||||
alloc r14=ar.pfs,0,0,5,0
|
|
||||||
mov out0=r15
|
|
||||||
mov out1=cr.isr
|
|
||||||
mov out2=cr.ifa
|
|
||||||
mov out3=cr.iim
|
|
||||||
mov out4=cr.itir
|
|
||||||
;;
|
|
||||||
ssm psr.ic | PSR_DEFAULT_BITS
|
|
||||||
;;
|
|
||||||
srlz.i // guarantee that interruption collection is on
|
|
||||||
;;
|
|
||||||
(p15) ssm psr.i // restore psr.i
|
|
||||||
adds r3=8,r2 // set up second base pointer for SAVE_REST
|
|
||||||
;;
|
|
||||||
SAVE_REST
|
|
||||||
movl r14=ia64_leave_kernel
|
|
||||||
;;
|
|
||||||
mov rp=r14
|
|
||||||
br.call.sptk.many b6=ia64_fault
|
|
||||||
END(dispatch_to_fault_handler)
|
|
||||||
|
|
||||||
//
|
//
|
||||||
// --- End of long entries, Beginning of short entries
|
// --- End of long entries, Beginning of short entries
|
||||||
//
|
//
|
||||||
|
@ -1236,8 +1107,8 @@ END(dispatch_to_fault_handler)
|
||||||
// 0x5000 Entry 20 (size 16 bundles) Page Not Present (10,22,49)
|
// 0x5000 Entry 20 (size 16 bundles) Page Not Present (10,22,49)
|
||||||
ENTRY(page_not_present)
|
ENTRY(page_not_present)
|
||||||
DBG_FAULT(20)
|
DBG_FAULT(20)
|
||||||
mov r16=cr.ifa
|
MOV_FROM_IFA(r16)
|
||||||
rsm psr.dt
|
RSM_PSR_DT
|
||||||
/*
|
/*
|
||||||
* The Linux page fault handler doesn't expect non-present pages to be in
|
* The Linux page fault handler doesn't expect non-present pages to be in
|
||||||
* the TLB. Flush the existing entry now, so we meet that expectation.
|
* the TLB. Flush the existing entry now, so we meet that expectation.
|
||||||
|
@ -1256,8 +1127,8 @@ END(page_not_present)
|
||||||
// 0x5100 Entry 21 (size 16 bundles) Key Permission (13,25,52)
|
// 0x5100 Entry 21 (size 16 bundles) Key Permission (13,25,52)
|
||||||
ENTRY(key_permission)
|
ENTRY(key_permission)
|
||||||
DBG_FAULT(21)
|
DBG_FAULT(21)
|
||||||
mov r16=cr.ifa
|
MOV_FROM_IFA(r16)
|
||||||
rsm psr.dt
|
RSM_PSR_DT
|
||||||
mov r31=pr
|
mov r31=pr
|
||||||
;;
|
;;
|
||||||
srlz.d
|
srlz.d
|
||||||
|
@ -1269,8 +1140,8 @@ END(key_permission)
|
||||||
// 0x5200 Entry 22 (size 16 bundles) Instruction Access Rights (26)
|
// 0x5200 Entry 22 (size 16 bundles) Instruction Access Rights (26)
|
||||||
ENTRY(iaccess_rights)
|
ENTRY(iaccess_rights)
|
||||||
DBG_FAULT(22)
|
DBG_FAULT(22)
|
||||||
mov r16=cr.ifa
|
MOV_FROM_IFA(r16)
|
||||||
rsm psr.dt
|
RSM_PSR_DT
|
||||||
mov r31=pr
|
mov r31=pr
|
||||||
;;
|
;;
|
||||||
srlz.d
|
srlz.d
|
||||||
|
@ -1282,8 +1153,8 @@ END(iaccess_rights)
|
||||||
// 0x5300 Entry 23 (size 16 bundles) Data Access Rights (14,53)
|
// 0x5300 Entry 23 (size 16 bundles) Data Access Rights (14,53)
|
||||||
ENTRY(daccess_rights)
|
ENTRY(daccess_rights)
|
||||||
DBG_FAULT(23)
|
DBG_FAULT(23)
|
||||||
mov r16=cr.ifa
|
MOV_FROM_IFA(r16)
|
||||||
rsm psr.dt
|
RSM_PSR_DT
|
||||||
mov r31=pr
|
mov r31=pr
|
||||||
;;
|
;;
|
||||||
srlz.d
|
srlz.d
|
||||||
|
@ -1295,7 +1166,7 @@ END(daccess_rights)
|
||||||
// 0x5400 Entry 24 (size 16 bundles) General Exception (5,32,34,36,38,39)
|
// 0x5400 Entry 24 (size 16 bundles) General Exception (5,32,34,36,38,39)
|
||||||
ENTRY(general_exception)
|
ENTRY(general_exception)
|
||||||
DBG_FAULT(24)
|
DBG_FAULT(24)
|
||||||
mov r16=cr.isr
|
MOV_FROM_ISR(r16)
|
||||||
mov r31=pr
|
mov r31=pr
|
||||||
;;
|
;;
|
||||||
cmp4.eq p6,p0=0,r16
|
cmp4.eq p6,p0=0,r16
|
||||||
|
@ -1324,8 +1195,8 @@ END(disabled_fp_reg)
|
||||||
ENTRY(nat_consumption)
|
ENTRY(nat_consumption)
|
||||||
DBG_FAULT(26)
|
DBG_FAULT(26)
|
||||||
|
|
||||||
mov r16=cr.ipsr
|
MOV_FROM_IPSR(p0, r16)
|
||||||
mov r17=cr.isr
|
MOV_FROM_ISR(r17)
|
||||||
mov r31=pr // save PR
|
mov r31=pr // save PR
|
||||||
;;
|
;;
|
||||||
and r18=0xf,r17 // r18 = cr.ipsr.code{3:0}
|
and r18=0xf,r17 // r18 = cr.ipsr.code{3:0}
|
||||||
|
@ -1335,10 +1206,10 @@ ENTRY(nat_consumption)
|
||||||
dep r16=-1,r16,IA64_PSR_ED_BIT,1
|
dep r16=-1,r16,IA64_PSR_ED_BIT,1
|
||||||
(p6) br.cond.spnt 1f // branch if (cr.ispr.na == 0 || cr.ipsr.code{3:0} != LFETCH)
|
(p6) br.cond.spnt 1f // branch if (cr.ispr.na == 0 || cr.ipsr.code{3:0} != LFETCH)
|
||||||
;;
|
;;
|
||||||
mov cr.ipsr=r16 // set cr.ipsr.na
|
MOV_TO_IPSR(p0, r16, r18)
|
||||||
mov pr=r31,-1
|
mov pr=r31,-1
|
||||||
;;
|
;;
|
||||||
rfi
|
RFI
|
||||||
|
|
||||||
1: mov pr=r31,-1
|
1: mov pr=r31,-1
|
||||||
;;
|
;;
|
||||||
|
@ -1360,26 +1231,26 @@ ENTRY(speculation_vector)
|
||||||
*
|
*
|
||||||
* cr.imm contains zero_ext(imm21)
|
* cr.imm contains zero_ext(imm21)
|
||||||
*/
|
*/
|
||||||
mov r18=cr.iim
|
MOV_FROM_IIM(r18)
|
||||||
;;
|
;;
|
||||||
mov r17=cr.iip
|
MOV_FROM_IIP(r17)
|
||||||
shl r18=r18,43 // put sign bit in position (43=64-21)
|
shl r18=r18,43 // put sign bit in position (43=64-21)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
mov r16=cr.ipsr
|
MOV_FROM_IPSR(p0, r16)
|
||||||
shr r18=r18,39 // sign extend (39=43-4)
|
shr r18=r18,39 // sign extend (39=43-4)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
add r17=r17,r18 // now add the offset
|
add r17=r17,r18 // now add the offset
|
||||||
;;
|
;;
|
||||||
mov cr.iip=r17
|
MOV_FROM_IIP(r17)
|
||||||
dep r16=0,r16,41,2 // clear EI
|
dep r16=0,r16,41,2 // clear EI
|
||||||
;;
|
;;
|
||||||
|
|
||||||
mov cr.ipsr=r16
|
MOV_FROM_IPSR(p0, r16)
|
||||||
;;
|
;;
|
||||||
|
|
||||||
rfi // and go back
|
RFI
|
||||||
END(speculation_vector)
|
END(speculation_vector)
|
||||||
|
|
||||||
.org ia64_ivt+0x5800
|
.org ia64_ivt+0x5800
|
||||||
|
@ -1517,11 +1388,11 @@ ENTRY(ia32_intercept)
|
||||||
DBG_FAULT(46)
|
DBG_FAULT(46)
|
||||||
#ifdef CONFIG_IA32_SUPPORT
|
#ifdef CONFIG_IA32_SUPPORT
|
||||||
mov r31=pr
|
mov r31=pr
|
||||||
mov r16=cr.isr
|
MOV_FROM_ISR(r16)
|
||||||
;;
|
;;
|
||||||
extr.u r17=r16,16,8 // get ISR.code
|
extr.u r17=r16,16,8 // get ISR.code
|
||||||
mov r18=ar.eflag
|
mov r18=ar.eflag
|
||||||
mov r19=cr.iim // old eflag value
|
MOV_FROM_IIM(r19) // old eflag value
|
||||||
;;
|
;;
|
||||||
cmp.ne p6,p0=2,r17
|
cmp.ne p6,p0=2,r17
|
||||||
(p6) br.cond.spnt 1f // not a system flag fault
|
(p6) br.cond.spnt 1f // not a system flag fault
|
||||||
|
@ -1533,7 +1404,7 @@ ENTRY(ia32_intercept)
|
||||||
(p6) br.cond.spnt 1f // eflags.ac bit didn't change
|
(p6) br.cond.spnt 1f // eflags.ac bit didn't change
|
||||||
;;
|
;;
|
||||||
mov pr=r31,-1 // restore predicate registers
|
mov pr=r31,-1 // restore predicate registers
|
||||||
rfi
|
RFI
|
||||||
|
|
||||||
1:
|
1:
|
||||||
#endif // CONFIG_IA32_SUPPORT
|
#endif // CONFIG_IA32_SUPPORT
|
||||||
|
@ -1673,6 +1544,137 @@ END(ia32_interrupt)
|
||||||
DBG_FAULT(67)
|
DBG_FAULT(67)
|
||||||
FAULT(67)
|
FAULT(67)
|
||||||
|
|
||||||
|
//-----------------------------------------------------------------------------------
|
||||||
|
// call do_page_fault (predicates are in r31, psr.dt may be off, r16 is faulting address)
|
||||||
|
ENTRY(page_fault)
|
||||||
|
SSM_PSR_DT_AND_SRLZ_I
|
||||||
|
;;
|
||||||
|
SAVE_MIN_WITH_COVER
|
||||||
|
alloc r15=ar.pfs,0,0,3,0
|
||||||
|
MOV_FROM_IFA(out0)
|
||||||
|
MOV_FROM_ISR(out1)
|
||||||
|
SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(r14, r3)
|
||||||
|
adds r3=8,r2 // set up second base pointer
|
||||||
|
SSM_PSR_I(p15, p15, r14) // restore psr.i
|
||||||
|
movl r14=ia64_leave_kernel
|
||||||
|
;;
|
||||||
|
SAVE_REST
|
||||||
|
mov rp=r14
|
||||||
|
;;
|
||||||
|
adds out2=16,r12 // out2 = pointer to pt_regs
|
||||||
|
br.call.sptk.many b6=ia64_do_page_fault // ignore return address
|
||||||
|
END(page_fault)
|
||||||
|
|
||||||
|
ENTRY(non_syscall)
|
||||||
|
mov ar.rsc=r27 // restore ar.rsc before SAVE_MIN_WITH_COVER
|
||||||
|
;;
|
||||||
|
SAVE_MIN_WITH_COVER
|
||||||
|
|
||||||
|
// There is no particular reason for this code to be here, other than that
|
||||||
|
// there happens to be space here that would go unused otherwise. If this
|
||||||
|
// fault ever gets "unreserved", simply moved the following code to a more
|
||||||
|
// suitable spot...
|
||||||
|
|
||||||
|
alloc r14=ar.pfs,0,0,2,0
|
||||||
|
MOV_FROM_IIM(out0)
|
||||||
|
add out1=16,sp
|
||||||
|
adds r3=8,r2 // set up second base pointer for SAVE_REST
|
||||||
|
|
||||||
|
SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(r15, r24)
|
||||||
|
// guarantee that interruption collection is on
|
||||||
|
SSM_PSR_I(p15, p15, r15) // restore psr.i
|
||||||
|
movl r15=ia64_leave_kernel
|
||||||
|
;;
|
||||||
|
SAVE_REST
|
||||||
|
mov rp=r15
|
||||||
|
;;
|
||||||
|
br.call.sptk.many b6=ia64_bad_break // avoid WAW on CFM and ignore return addr
|
||||||
|
END(non_syscall)
|
||||||
|
|
||||||
|
ENTRY(__interrupt)
|
||||||
|
DBG_FAULT(12)
|
||||||
|
mov r31=pr // prepare to save predicates
|
||||||
|
;;
|
||||||
|
SAVE_MIN_WITH_COVER // uses r31; defines r2 and r3
|
||||||
|
SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(r3, r14)
|
||||||
|
// ensure everybody knows psr.ic is back on
|
||||||
|
adds r3=8,r2 // set up second base pointer for SAVE_REST
|
||||||
|
;;
|
||||||
|
SAVE_REST
|
||||||
|
;;
|
||||||
|
MCA_RECOVER_RANGE(interrupt)
|
||||||
|
alloc r14=ar.pfs,0,0,2,0 // must be first in an insn group
|
||||||
|
MOV_FROM_IVR(out0, r8) // pass cr.ivr as first arg
|
||||||
|
add out1=16,sp // pass pointer to pt_regs as second arg
|
||||||
|
;;
|
||||||
|
srlz.d // make sure we see the effect of cr.ivr
|
||||||
|
movl r14=ia64_leave_kernel
|
||||||
|
;;
|
||||||
|
mov rp=r14
|
||||||
|
br.call.sptk.many b6=ia64_handle_irq
|
||||||
|
END(__interrupt)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* There is no particular reason for this code to be here, other than that
|
||||||
|
* there happens to be space here that would go unused otherwise. If this
|
||||||
|
* fault ever gets "unreserved", simply moved the following code to a more
|
||||||
|
* suitable spot...
|
||||||
|
*/
|
||||||
|
|
||||||
|
ENTRY(dispatch_unaligned_handler)
|
||||||
|
SAVE_MIN_WITH_COVER
|
||||||
|
;;
|
||||||
|
alloc r14=ar.pfs,0,0,2,0 // now it's safe (must be first in insn group!)
|
||||||
|
MOV_FROM_IFA(out0)
|
||||||
|
adds out1=16,sp
|
||||||
|
|
||||||
|
SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(r3, r24)
|
||||||
|
// guarantee that interruption collection is on
|
||||||
|
SSM_PSR_I(p15, p15, r3) // restore psr.i
|
||||||
|
adds r3=8,r2 // set up second base pointer
|
||||||
|
;;
|
||||||
|
SAVE_REST
|
||||||
|
movl r14=ia64_leave_kernel
|
||||||
|
;;
|
||||||
|
mov rp=r14
|
||||||
|
br.sptk.many ia64_prepare_handle_unaligned
|
||||||
|
END(dispatch_unaligned_handler)
|
||||||
|
|
||||||
|
/*
|
||||||
|
* There is no particular reason for this code to be here, other than that
|
||||||
|
* there happens to be space here that would go unused otherwise. If this
|
||||||
|
* fault ever gets "unreserved", simply moved the following code to a more
|
||||||
|
* suitable spot...
|
||||||
|
*/
|
||||||
|
|
||||||
|
ENTRY(dispatch_to_fault_handler)
|
||||||
|
/*
|
||||||
|
* Input:
|
||||||
|
* psr.ic: off
|
||||||
|
* r19: fault vector number (e.g., 24 for General Exception)
|
||||||
|
* r31: contains saved predicates (pr)
|
||||||
|
*/
|
||||||
|
SAVE_MIN_WITH_COVER_R19
|
||||||
|
alloc r14=ar.pfs,0,0,5,0
|
||||||
|
MOV_FROM_ISR(out1)
|
||||||
|
MOV_FROM_IFA(out2)
|
||||||
|
MOV_FROM_IIM(out3)
|
||||||
|
MOV_FROM_ITIR(out4)
|
||||||
|
;;
|
||||||
|
SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(r3, out0)
|
||||||
|
// guarantee that interruption collection is on
|
||||||
|
mov out0=r15
|
||||||
|
;;
|
||||||
|
SSM_PSR_I(p15, p15, r3) // restore psr.i
|
||||||
|
adds r3=8,r2 // set up second base pointer for SAVE_REST
|
||||||
|
;;
|
||||||
|
SAVE_REST
|
||||||
|
movl r14=ia64_leave_kernel
|
||||||
|
;;
|
||||||
|
mov rp=r14
|
||||||
|
br.call.sptk.many b6=ia64_fault
|
||||||
|
END(dispatch_to_fault_handler)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Squatting in this space ...
|
* Squatting in this space ...
|
||||||
*
|
*
|
||||||
|
@ -1686,11 +1688,10 @@ ENTRY(dispatch_illegal_op_fault)
|
||||||
.prologue
|
.prologue
|
||||||
.body
|
.body
|
||||||
SAVE_MIN_WITH_COVER
|
SAVE_MIN_WITH_COVER
|
||||||
ssm psr.ic | PSR_DEFAULT_BITS
|
SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(r3, r24)
|
||||||
|
// guarantee that interruption collection is on
|
||||||
;;
|
;;
|
||||||
srlz.i // guarantee that interruption collection is on
|
SSM_PSR_I(p15, p15, r3) // restore psr.i
|
||||||
;;
|
|
||||||
(p15) ssm psr.i // restore psr.i
|
|
||||||
adds r3=8,r2 // set up second base pointer for SAVE_REST
|
adds r3=8,r2 // set up second base pointer for SAVE_REST
|
||||||
;;
|
;;
|
||||||
alloc r14=ar.pfs,0,0,1,0 // must be first in insn group
|
alloc r14=ar.pfs,0,0,1,0 // must be first in insn group
|
||||||
|
@ -1729,12 +1730,11 @@ END(dispatch_illegal_op_fault)
|
||||||
ENTRY(dispatch_to_ia32_handler)
|
ENTRY(dispatch_to_ia32_handler)
|
||||||
SAVE_MIN
|
SAVE_MIN
|
||||||
;;
|
;;
|
||||||
mov r14=cr.isr
|
MOV_FROM_ISR(r14)
|
||||||
ssm psr.ic | PSR_DEFAULT_BITS
|
SSM_PSR_IC_AND_DEFAULT_BITS_AND_SRLZ_I(r3, r24)
|
||||||
|
// guarantee that interruption collection is on
|
||||||
;;
|
;;
|
||||||
srlz.i // guarantee that interruption collection is on
|
SSM_PSR_I(p15, p15, r3)
|
||||||
;;
|
|
||||||
(p15) ssm psr.i
|
|
||||||
adds r3=8,r2 // Base pointer for SAVE_REST
|
adds r3=8,r2 // Base pointer for SAVE_REST
|
||||||
;;
|
;;
|
||||||
SAVE_REST
|
SAVE_REST
|
||||||
|
|
|
@ -2,6 +2,7 @@
|
||||||
#include <asm/cache.h>
|
#include <asm/cache.h>
|
||||||
|
|
||||||
#include "entry.h"
|
#include "entry.h"
|
||||||
|
#include "paravirt_inst.h"
|
||||||
|
|
||||||
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
|
#ifdef CONFIG_VIRT_CPU_ACCOUNTING
|
||||||
/* read ar.itc in advance, and use it before leaving bank 0 */
|
/* read ar.itc in advance, and use it before leaving bank 0 */
|
||||||
|
@ -43,16 +44,16 @@
|
||||||
* Note that psr.ic is NOT turned on by this macro. This is so that
|
* Note that psr.ic is NOT turned on by this macro. This is so that
|
||||||
* we can pass interruption state as arguments to a handler.
|
* we can pass interruption state as arguments to a handler.
|
||||||
*/
|
*/
|
||||||
#define DO_SAVE_MIN(COVER,SAVE_IFS,EXTRA,WORKAROUND) \
|
#define IA64_NATIVE_DO_SAVE_MIN(__COVER,SAVE_IFS,EXTRA,WORKAROUND) \
|
||||||
mov r16=IA64_KR(CURRENT); /* M */ \
|
mov r16=IA64_KR(CURRENT); /* M */ \
|
||||||
mov r27=ar.rsc; /* M */ \
|
mov r27=ar.rsc; /* M */ \
|
||||||
mov r20=r1; /* A */ \
|
mov r20=r1; /* A */ \
|
||||||
mov r25=ar.unat; /* M */ \
|
mov r25=ar.unat; /* M */ \
|
||||||
mov r29=cr.ipsr; /* M */ \
|
MOV_FROM_IPSR(p0,r29); /* M */ \
|
||||||
mov r26=ar.pfs; /* I */ \
|
mov r26=ar.pfs; /* I */ \
|
||||||
mov r28=cr.iip; /* M */ \
|
MOV_FROM_IIP(r28); /* M */ \
|
||||||
mov r21=ar.fpsr; /* M */ \
|
mov r21=ar.fpsr; /* M */ \
|
||||||
COVER; /* B;; (or nothing) */ \
|
__COVER; /* B;; (or nothing) */ \
|
||||||
;; \
|
;; \
|
||||||
adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16; \
|
adds r16=IA64_TASK_THREAD_ON_USTACK_OFFSET,r16; \
|
||||||
;; \
|
;; \
|
||||||
|
@ -244,6 +245,6 @@
|
||||||
1: \
|
1: \
|
||||||
.pred.rel "mutex", pKStk, pUStk
|
.pred.rel "mutex", pKStk, pUStk
|
||||||
|
|
||||||
#define SAVE_MIN_WITH_COVER DO_SAVE_MIN(cover, mov r30=cr.ifs, , RSE_WORKAROUND)
|
#define SAVE_MIN_WITH_COVER DO_SAVE_MIN(COVER, mov r30=cr.ifs, , RSE_WORKAROUND)
|
||||||
#define SAVE_MIN_WITH_COVER_R19 DO_SAVE_MIN(cover, mov r30=cr.ifs, mov r15=r19, RSE_WORKAROUND)
|
#define SAVE_MIN_WITH_COVER_R19 DO_SAVE_MIN(COVER, mov r30=cr.ifs, mov r15=r19, RSE_WORKAROUND)
|
||||||
#define SAVE_MIN DO_SAVE_MIN( , mov r30=r0, , )
|
#define SAVE_MIN DO_SAVE_MIN( , mov r30=r0, , )
|
||||||
|
|
|
@ -321,7 +321,8 @@ module_alloc (unsigned long size)
|
||||||
void
|
void
|
||||||
module_free (struct module *mod, void *module_region)
|
module_free (struct module *mod, void *module_region)
|
||||||
{
|
{
|
||||||
if (mod->arch.init_unw_table && module_region == mod->module_init) {
|
if (mod && mod->arch.init_unw_table &&
|
||||||
|
module_region == mod->module_init) {
|
||||||
unw_remove_unwind_table(mod->arch.init_unw_table);
|
unw_remove_unwind_table(mod->arch.init_unw_table);
|
||||||
mod->arch.init_unw_table = NULL;
|
mod->arch.init_unw_table = NULL;
|
||||||
}
|
}
|
||||||
|
|
|
@ -0,0 +1,24 @@
|
||||||
|
/*
|
||||||
|
* calculate
|
||||||
|
* NR_IRQS = max(IA64_NATIVE_NR_IRQS, XEN_NR_IRQS, FOO_NR_IRQS...)
|
||||||
|
* depending on config.
|
||||||
|
* This must be calculated before processing asm-offset.c.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define ASM_OFFSETS_C 1
|
||||||
|
|
||||||
|
#include <linux/kbuild.h>
|
||||||
|
#include <linux/threads.h>
|
||||||
|
#include <asm-ia64/native/irq.h>
|
||||||
|
|
||||||
|
void foo(void)
|
||||||
|
{
|
||||||
|
union paravirt_nr_irqs_max {
|
||||||
|
char ia64_native_nr_irqs[IA64_NATIVE_NR_IRQS];
|
||||||
|
#ifdef CONFIG_XEN
|
||||||
|
char xen_nr_irqs[XEN_NR_IRQS];
|
||||||
|
#endif
|
||||||
|
};
|
||||||
|
|
||||||
|
DEFINE(NR_IRQS, sizeof (union paravirt_nr_irqs_max));
|
||||||
|
}
|
|
@ -0,0 +1,369 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* arch/ia64/kernel/paravirt.c
|
||||||
|
*
|
||||||
|
* Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
|
||||||
|
* VA Linux Systems Japan K.K.
|
||||||
|
* Yaozu (Eddie) Dong <eddie.dong@intel.com>
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/init.h>
|
||||||
|
|
||||||
|
#include <linux/compiler.h>
|
||||||
|
#include <linux/io.h>
|
||||||
|
#include <linux/irq.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
|
#include <asm/iosapic.h>
|
||||||
|
#include <asm/paravirt.h>
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* general info
|
||||||
|
*/
|
||||||
|
struct pv_info pv_info = {
|
||||||
|
.kernel_rpl = 0,
|
||||||
|
.paravirt_enabled = 0,
|
||||||
|
.name = "bare hardware"
|
||||||
|
};
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* pv_init_ops
|
||||||
|
* initialization hooks.
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct pv_init_ops pv_init_ops;
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* pv_cpu_ops
|
||||||
|
* intrinsics hooks.
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* ia64_native_xxx are macros so that we have to make them real functions */
|
||||||
|
|
||||||
|
#define DEFINE_VOID_FUNC1(name) \
|
||||||
|
static void \
|
||||||
|
ia64_native_ ## name ## _func(unsigned long arg) \
|
||||||
|
{ \
|
||||||
|
ia64_native_ ## name(arg); \
|
||||||
|
} \
|
||||||
|
|
||||||
|
#define DEFINE_VOID_FUNC2(name) \
|
||||||
|
static void \
|
||||||
|
ia64_native_ ## name ## _func(unsigned long arg0, \
|
||||||
|
unsigned long arg1) \
|
||||||
|
{ \
|
||||||
|
ia64_native_ ## name(arg0, arg1); \
|
||||||
|
} \
|
||||||
|
|
||||||
|
#define DEFINE_FUNC0(name) \
|
||||||
|
static unsigned long \
|
||||||
|
ia64_native_ ## name ## _func(void) \
|
||||||
|
{ \
|
||||||
|
return ia64_native_ ## name(); \
|
||||||
|
}
|
||||||
|
|
||||||
|
#define DEFINE_FUNC1(name, type) \
|
||||||
|
static unsigned long \
|
||||||
|
ia64_native_ ## name ## _func(type arg) \
|
||||||
|
{ \
|
||||||
|
return ia64_native_ ## name(arg); \
|
||||||
|
} \
|
||||||
|
|
||||||
|
DEFINE_VOID_FUNC1(fc);
|
||||||
|
DEFINE_VOID_FUNC1(intrin_local_irq_restore);
|
||||||
|
|
||||||
|
DEFINE_VOID_FUNC2(ptcga);
|
||||||
|
DEFINE_VOID_FUNC2(set_rr);
|
||||||
|
|
||||||
|
DEFINE_FUNC0(get_psr_i);
|
||||||
|
|
||||||
|
DEFINE_FUNC1(thash, unsigned long);
|
||||||
|
DEFINE_FUNC1(get_cpuid, int);
|
||||||
|
DEFINE_FUNC1(get_pmd, int);
|
||||||
|
DEFINE_FUNC1(get_rr, unsigned long);
|
||||||
|
|
||||||
|
static void
|
||||||
|
ia64_native_ssm_i_func(void)
|
||||||
|
{
|
||||||
|
ia64_native_ssm(IA64_PSR_I);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ia64_native_rsm_i_func(void)
|
||||||
|
{
|
||||||
|
ia64_native_rsm(IA64_PSR_I);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ia64_native_set_rr0_to_rr4_func(unsigned long val0, unsigned long val1,
|
||||||
|
unsigned long val2, unsigned long val3,
|
||||||
|
unsigned long val4)
|
||||||
|
{
|
||||||
|
ia64_native_set_rr0_to_rr4(val0, val1, val2, val3, val4);
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CASE_GET_REG(id) \
|
||||||
|
case _IA64_REG_ ## id: \
|
||||||
|
res = ia64_native_getreg(_IA64_REG_ ## id); \
|
||||||
|
break;
|
||||||
|
#define CASE_GET_AR(id) CASE_GET_REG(AR_ ## id)
|
||||||
|
#define CASE_GET_CR(id) CASE_GET_REG(CR_ ## id)
|
||||||
|
|
||||||
|
unsigned long
|
||||||
|
ia64_native_getreg_func(int regnum)
|
||||||
|
{
|
||||||
|
unsigned long res = -1;
|
||||||
|
switch (regnum) {
|
||||||
|
CASE_GET_REG(GP);
|
||||||
|
CASE_GET_REG(IP);
|
||||||
|
CASE_GET_REG(PSR);
|
||||||
|
CASE_GET_REG(TP);
|
||||||
|
CASE_GET_REG(SP);
|
||||||
|
|
||||||
|
CASE_GET_AR(KR0);
|
||||||
|
CASE_GET_AR(KR1);
|
||||||
|
CASE_GET_AR(KR2);
|
||||||
|
CASE_GET_AR(KR3);
|
||||||
|
CASE_GET_AR(KR4);
|
||||||
|
CASE_GET_AR(KR5);
|
||||||
|
CASE_GET_AR(KR6);
|
||||||
|
CASE_GET_AR(KR7);
|
||||||
|
CASE_GET_AR(RSC);
|
||||||
|
CASE_GET_AR(BSP);
|
||||||
|
CASE_GET_AR(BSPSTORE);
|
||||||
|
CASE_GET_AR(RNAT);
|
||||||
|
CASE_GET_AR(FCR);
|
||||||
|
CASE_GET_AR(EFLAG);
|
||||||
|
CASE_GET_AR(CSD);
|
||||||
|
CASE_GET_AR(SSD);
|
||||||
|
CASE_GET_AR(CFLAG);
|
||||||
|
CASE_GET_AR(FSR);
|
||||||
|
CASE_GET_AR(FIR);
|
||||||
|
CASE_GET_AR(FDR);
|
||||||
|
CASE_GET_AR(CCV);
|
||||||
|
CASE_GET_AR(UNAT);
|
||||||
|
CASE_GET_AR(FPSR);
|
||||||
|
CASE_GET_AR(ITC);
|
||||||
|
CASE_GET_AR(PFS);
|
||||||
|
CASE_GET_AR(LC);
|
||||||
|
CASE_GET_AR(EC);
|
||||||
|
|
||||||
|
CASE_GET_CR(DCR);
|
||||||
|
CASE_GET_CR(ITM);
|
||||||
|
CASE_GET_CR(IVA);
|
||||||
|
CASE_GET_CR(PTA);
|
||||||
|
CASE_GET_CR(IPSR);
|
||||||
|
CASE_GET_CR(ISR);
|
||||||
|
CASE_GET_CR(IIP);
|
||||||
|
CASE_GET_CR(IFA);
|
||||||
|
CASE_GET_CR(ITIR);
|
||||||
|
CASE_GET_CR(IIPA);
|
||||||
|
CASE_GET_CR(IFS);
|
||||||
|
CASE_GET_CR(IIM);
|
||||||
|
CASE_GET_CR(IHA);
|
||||||
|
CASE_GET_CR(LID);
|
||||||
|
CASE_GET_CR(IVR);
|
||||||
|
CASE_GET_CR(TPR);
|
||||||
|
CASE_GET_CR(EOI);
|
||||||
|
CASE_GET_CR(IRR0);
|
||||||
|
CASE_GET_CR(IRR1);
|
||||||
|
CASE_GET_CR(IRR2);
|
||||||
|
CASE_GET_CR(IRR3);
|
||||||
|
CASE_GET_CR(ITV);
|
||||||
|
CASE_GET_CR(PMV);
|
||||||
|
CASE_GET_CR(CMCV);
|
||||||
|
CASE_GET_CR(LRR0);
|
||||||
|
CASE_GET_CR(LRR1);
|
||||||
|
|
||||||
|
default:
|
||||||
|
printk(KERN_CRIT "wrong_getreg %d\n", regnum);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
return res;
|
||||||
|
}
|
||||||
|
|
||||||
|
#define CASE_SET_REG(id) \
|
||||||
|
case _IA64_REG_ ## id: \
|
||||||
|
ia64_native_setreg(_IA64_REG_ ## id, val); \
|
||||||
|
break;
|
||||||
|
#define CASE_SET_AR(id) CASE_SET_REG(AR_ ## id)
|
||||||
|
#define CASE_SET_CR(id) CASE_SET_REG(CR_ ## id)
|
||||||
|
|
||||||
|
void
|
||||||
|
ia64_native_setreg_func(int regnum, unsigned long val)
|
||||||
|
{
|
||||||
|
switch (regnum) {
|
||||||
|
case _IA64_REG_PSR_L:
|
||||||
|
ia64_native_setreg(_IA64_REG_PSR_L, val);
|
||||||
|
ia64_dv_serialize_data();
|
||||||
|
break;
|
||||||
|
CASE_SET_REG(SP);
|
||||||
|
CASE_SET_REG(GP);
|
||||||
|
|
||||||
|
CASE_SET_AR(KR0);
|
||||||
|
CASE_SET_AR(KR1);
|
||||||
|
CASE_SET_AR(KR2);
|
||||||
|
CASE_SET_AR(KR3);
|
||||||
|
CASE_SET_AR(KR4);
|
||||||
|
CASE_SET_AR(KR5);
|
||||||
|
CASE_SET_AR(KR6);
|
||||||
|
CASE_SET_AR(KR7);
|
||||||
|
CASE_SET_AR(RSC);
|
||||||
|
CASE_SET_AR(BSP);
|
||||||
|
CASE_SET_AR(BSPSTORE);
|
||||||
|
CASE_SET_AR(RNAT);
|
||||||
|
CASE_SET_AR(FCR);
|
||||||
|
CASE_SET_AR(EFLAG);
|
||||||
|
CASE_SET_AR(CSD);
|
||||||
|
CASE_SET_AR(SSD);
|
||||||
|
CASE_SET_AR(CFLAG);
|
||||||
|
CASE_SET_AR(FSR);
|
||||||
|
CASE_SET_AR(FIR);
|
||||||
|
CASE_SET_AR(FDR);
|
||||||
|
CASE_SET_AR(CCV);
|
||||||
|
CASE_SET_AR(UNAT);
|
||||||
|
CASE_SET_AR(FPSR);
|
||||||
|
CASE_SET_AR(ITC);
|
||||||
|
CASE_SET_AR(PFS);
|
||||||
|
CASE_SET_AR(LC);
|
||||||
|
CASE_SET_AR(EC);
|
||||||
|
|
||||||
|
CASE_SET_CR(DCR);
|
||||||
|
CASE_SET_CR(ITM);
|
||||||
|
CASE_SET_CR(IVA);
|
||||||
|
CASE_SET_CR(PTA);
|
||||||
|
CASE_SET_CR(IPSR);
|
||||||
|
CASE_SET_CR(ISR);
|
||||||
|
CASE_SET_CR(IIP);
|
||||||
|
CASE_SET_CR(IFA);
|
||||||
|
CASE_SET_CR(ITIR);
|
||||||
|
CASE_SET_CR(IIPA);
|
||||||
|
CASE_SET_CR(IFS);
|
||||||
|
CASE_SET_CR(IIM);
|
||||||
|
CASE_SET_CR(IHA);
|
||||||
|
CASE_SET_CR(LID);
|
||||||
|
CASE_SET_CR(IVR);
|
||||||
|
CASE_SET_CR(TPR);
|
||||||
|
CASE_SET_CR(EOI);
|
||||||
|
CASE_SET_CR(IRR0);
|
||||||
|
CASE_SET_CR(IRR1);
|
||||||
|
CASE_SET_CR(IRR2);
|
||||||
|
CASE_SET_CR(IRR3);
|
||||||
|
CASE_SET_CR(ITV);
|
||||||
|
CASE_SET_CR(PMV);
|
||||||
|
CASE_SET_CR(CMCV);
|
||||||
|
CASE_SET_CR(LRR0);
|
||||||
|
CASE_SET_CR(LRR1);
|
||||||
|
default:
|
||||||
|
printk(KERN_CRIT "wrong setreg %d\n", regnum);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
struct pv_cpu_ops pv_cpu_ops = {
|
||||||
|
.fc = ia64_native_fc_func,
|
||||||
|
.thash = ia64_native_thash_func,
|
||||||
|
.get_cpuid = ia64_native_get_cpuid_func,
|
||||||
|
.get_pmd = ia64_native_get_pmd_func,
|
||||||
|
.ptcga = ia64_native_ptcga_func,
|
||||||
|
.get_rr = ia64_native_get_rr_func,
|
||||||
|
.set_rr = ia64_native_set_rr_func,
|
||||||
|
.set_rr0_to_rr4 = ia64_native_set_rr0_to_rr4_func,
|
||||||
|
.ssm_i = ia64_native_ssm_i_func,
|
||||||
|
.getreg = ia64_native_getreg_func,
|
||||||
|
.setreg = ia64_native_setreg_func,
|
||||||
|
.rsm_i = ia64_native_rsm_i_func,
|
||||||
|
.get_psr_i = ia64_native_get_psr_i_func,
|
||||||
|
.intrin_local_irq_restore
|
||||||
|
= ia64_native_intrin_local_irq_restore_func,
|
||||||
|
};
|
||||||
|
EXPORT_SYMBOL(pv_cpu_ops);
|
||||||
|
|
||||||
|
/******************************************************************************
|
||||||
|
* replacement of hand written assembly codes.
|
||||||
|
*/
|
||||||
|
|
||||||
|
void
|
||||||
|
paravirt_cpu_asm_init(const struct pv_cpu_asm_switch *cpu_asm_switch)
|
||||||
|
{
|
||||||
|
extern unsigned long paravirt_switch_to_targ;
|
||||||
|
extern unsigned long paravirt_leave_syscall_targ;
|
||||||
|
extern unsigned long paravirt_work_processed_syscall_targ;
|
||||||
|
extern unsigned long paravirt_leave_kernel_targ;
|
||||||
|
|
||||||
|
paravirt_switch_to_targ = cpu_asm_switch->switch_to;
|
||||||
|
paravirt_leave_syscall_targ = cpu_asm_switch->leave_syscall;
|
||||||
|
paravirt_work_processed_syscall_targ =
|
||||||
|
cpu_asm_switch->work_processed_syscall;
|
||||||
|
paravirt_leave_kernel_targ = cpu_asm_switch->leave_kernel;
|
||||||
|
}
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* pv_iosapic_ops
|
||||||
|
* iosapic read/write hooks.
|
||||||
|
*/
|
||||||
|
|
||||||
|
static unsigned int
|
||||||
|
ia64_native_iosapic_read(char __iomem *iosapic, unsigned int reg)
|
||||||
|
{
|
||||||
|
return __ia64_native_iosapic_read(iosapic, reg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static void
|
||||||
|
ia64_native_iosapic_write(char __iomem *iosapic, unsigned int reg, u32 val)
|
||||||
|
{
|
||||||
|
__ia64_native_iosapic_write(iosapic, reg, val);
|
||||||
|
}
|
||||||
|
|
||||||
|
struct pv_iosapic_ops pv_iosapic_ops = {
|
||||||
|
.pcat_compat_init = ia64_native_iosapic_pcat_compat_init,
|
||||||
|
.get_irq_chip = ia64_native_iosapic_get_irq_chip,
|
||||||
|
|
||||||
|
.__read = ia64_native_iosapic_read,
|
||||||
|
.__write = ia64_native_iosapic_write,
|
||||||
|
};
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* pv_irq_ops
|
||||||
|
* irq operations
|
||||||
|
*/
|
||||||
|
|
||||||
|
struct pv_irq_ops pv_irq_ops = {
|
||||||
|
.register_ipi = ia64_native_register_ipi,
|
||||||
|
|
||||||
|
.assign_irq_vector = ia64_native_assign_irq_vector,
|
||||||
|
.free_irq_vector = ia64_native_free_irq_vector,
|
||||||
|
.register_percpu_irq = ia64_native_register_percpu_irq,
|
||||||
|
|
||||||
|
.resend_irq = ia64_native_resend_irq,
|
||||||
|
};
|
||||||
|
|
||||||
|
/***************************************************************************
|
||||||
|
* pv_time_ops
|
||||||
|
* time operations
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int
|
||||||
|
ia64_native_do_steal_accounting(unsigned long *new_itm)
|
||||||
|
{
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
struct pv_time_ops pv_time_ops = {
|
||||||
|
.do_steal_accounting = ia64_native_do_steal_accounting,
|
||||||
|
};
|
|
@ -0,0 +1,29 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* linux/arch/ia64/xen/paravirt_inst.h
|
||||||
|
*
|
||||||
|
* Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
|
||||||
|
* VA Linux Systems Japan K.K.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifdef __IA64_ASM_PARAVIRTUALIZED_XEN
|
||||||
|
#include <asm/xen/inst.h>
|
||||||
|
#include <asm/xen/minstate.h>
|
||||||
|
#else
|
||||||
|
#include <asm/native/inst.h>
|
||||||
|
#endif
|
||||||
|
|
|
@ -0,0 +1,60 @@
|
||||||
|
/******************************************************************************
|
||||||
|
* linux/arch/ia64/xen/paravirtentry.S
|
||||||
|
*
|
||||||
|
* Copyright (c) 2008 Isaku Yamahata <yamahata at valinux co jp>
|
||||||
|
* VA Linux Systems Japan K.K.
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
* the Free Software Foundation; either version 2 of the License, or
|
||||||
|
* (at your option) any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful,
|
||||||
|
* but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
|
||||||
|
* GNU General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <asm/asmmacro.h>
|
||||||
|
#include <asm/asm-offsets.h>
|
||||||
|
#include "entry.h"
|
||||||
|
|
||||||
|
#define DATA8(sym, init_value) \
|
||||||
|
.pushsection .data.read_mostly ; \
|
||||||
|
.align 8 ; \
|
||||||
|
.global sym ; \
|
||||||
|
sym: ; \
|
||||||
|
data8 init_value ; \
|
||||||
|
.popsection
|
||||||
|
|
||||||
|
#define BRANCH(targ, reg, breg) \
|
||||||
|
movl reg=targ ; \
|
||||||
|
;; \
|
||||||
|
ld8 reg=[reg] ; \
|
||||||
|
;; \
|
||||||
|
mov breg=reg ; \
|
||||||
|
br.cond.sptk.many breg
|
||||||
|
|
||||||
|
#define BRANCH_PROC(sym, reg, breg) \
|
||||||
|
DATA8(paravirt_ ## sym ## _targ, ia64_native_ ## sym) ; \
|
||||||
|
GLOBAL_ENTRY(paravirt_ ## sym) ; \
|
||||||
|
BRANCH(paravirt_ ## sym ## _targ, reg, breg) ; \
|
||||||
|
END(paravirt_ ## sym)
|
||||||
|
|
||||||
|
#define BRANCH_PROC_UNWINFO(sym, reg, breg) \
|
||||||
|
DATA8(paravirt_ ## sym ## _targ, ia64_native_ ## sym) ; \
|
||||||
|
GLOBAL_ENTRY(paravirt_ ## sym) ; \
|
||||||
|
PT_REGS_UNWIND_INFO(0) ; \
|
||||||
|
BRANCH(paravirt_ ## sym ## _targ, reg, breg) ; \
|
||||||
|
END(paravirt_ ## sym)
|
||||||
|
|
||||||
|
|
||||||
|
BRANCH_PROC(switch_to, r22, b7)
|
||||||
|
BRANCH_PROC_UNWINFO(leave_syscall, r22, b7)
|
||||||
|
BRANCH_PROC(work_processed_syscall, r2, b7)
|
||||||
|
BRANCH_PROC_UNWINFO(leave_kernel, r22, b7)
|
|
@ -51,6 +51,7 @@
|
||||||
#include <asm/mca.h>
|
#include <asm/mca.h>
|
||||||
#include <asm/meminit.h>
|
#include <asm/meminit.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
#include <asm/paravirt.h>
|
||||||
#include <asm/patch.h>
|
#include <asm/patch.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
@ -341,6 +342,8 @@ reserve_memory (void)
|
||||||
rsvd_region[n].end = (unsigned long) ia64_imva(_end);
|
rsvd_region[n].end = (unsigned long) ia64_imva(_end);
|
||||||
n++;
|
n++;
|
||||||
|
|
||||||
|
n += paravirt_reserve_memory(&rsvd_region[n]);
|
||||||
|
|
||||||
#ifdef CONFIG_BLK_DEV_INITRD
|
#ifdef CONFIG_BLK_DEV_INITRD
|
||||||
if (ia64_boot_param->initrd_start) {
|
if (ia64_boot_param->initrd_start) {
|
||||||
rsvd_region[n].start = (unsigned long)__va(ia64_boot_param->initrd_start);
|
rsvd_region[n].start = (unsigned long)__va(ia64_boot_param->initrd_start);
|
||||||
|
@ -519,6 +522,8 @@ setup_arch (char **cmdline_p)
|
||||||
{
|
{
|
||||||
unw_init();
|
unw_init();
|
||||||
|
|
||||||
|
paravirt_arch_setup_early();
|
||||||
|
|
||||||
ia64_patch_vtop((u64) __start___vtop_patchlist, (u64) __end___vtop_patchlist);
|
ia64_patch_vtop((u64) __start___vtop_patchlist, (u64) __end___vtop_patchlist);
|
||||||
|
|
||||||
*cmdline_p = __va(ia64_boot_param->command_line);
|
*cmdline_p = __va(ia64_boot_param->command_line);
|
||||||
|
@ -583,6 +588,9 @@ setup_arch (char **cmdline_p)
|
||||||
acpi_boot_init();
|
acpi_boot_init();
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
paravirt_banner();
|
||||||
|
paravirt_arch_setup_console(cmdline_p);
|
||||||
|
|
||||||
#ifdef CONFIG_VT
|
#ifdef CONFIG_VT
|
||||||
if (!conswitchp) {
|
if (!conswitchp) {
|
||||||
# if defined(CONFIG_DUMMY_CONSOLE)
|
# if defined(CONFIG_DUMMY_CONSOLE)
|
||||||
|
@ -602,6 +610,8 @@ setup_arch (char **cmdline_p)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* enable IA-64 Machine Check Abort Handling unless disabled */
|
/* enable IA-64 Machine Check Abort Handling unless disabled */
|
||||||
|
if (paravirt_arch_setup_nomca())
|
||||||
|
nomca = 1;
|
||||||
if (!nomca)
|
if (!nomca)
|
||||||
ia64_mca_init();
|
ia64_mca_init();
|
||||||
|
|
||||||
|
|
|
@ -50,6 +50,7 @@
|
||||||
#include <asm/machvec.h>
|
#include <asm/machvec.h>
|
||||||
#include <asm/mca.h>
|
#include <asm/mca.h>
|
||||||
#include <asm/page.h>
|
#include <asm/page.h>
|
||||||
|
#include <asm/paravirt.h>
|
||||||
#include <asm/pgalloc.h>
|
#include <asm/pgalloc.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
#include <asm/processor.h>
|
#include <asm/processor.h>
|
||||||
|
@ -642,6 +643,7 @@ void __devinit smp_prepare_boot_cpu(void)
|
||||||
cpu_set(smp_processor_id(), cpu_online_map);
|
cpu_set(smp_processor_id(), cpu_online_map);
|
||||||
cpu_set(smp_processor_id(), cpu_callin_map);
|
cpu_set(smp_processor_id(), cpu_callin_map);
|
||||||
per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
|
per_cpu(cpu_state, smp_processor_id()) = CPU_ONLINE;
|
||||||
|
paravirt_post_smp_prepare_boot_cpu();
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
|
|
|
@ -24,6 +24,7 @@
|
||||||
#include <asm/machvec.h>
|
#include <asm/machvec.h>
|
||||||
#include <asm/delay.h>
|
#include <asm/delay.h>
|
||||||
#include <asm/hw_irq.h>
|
#include <asm/hw_irq.h>
|
||||||
|
#include <asm/paravirt.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/sal.h>
|
#include <asm/sal.h>
|
||||||
#include <asm/sections.h>
|
#include <asm/sections.h>
|
||||||
|
@ -48,6 +49,15 @@ EXPORT_SYMBOL(last_cli_ip);
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_PARAVIRT
|
||||||
|
static void
|
||||||
|
paravirt_clocksource_resume(void)
|
||||||
|
{
|
||||||
|
if (pv_time_ops.clocksource_resume)
|
||||||
|
pv_time_ops.clocksource_resume();
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
static struct clocksource clocksource_itc = {
|
static struct clocksource clocksource_itc = {
|
||||||
.name = "itc",
|
.name = "itc",
|
||||||
.rating = 350,
|
.rating = 350,
|
||||||
|
@ -56,6 +66,9 @@ static struct clocksource clocksource_itc = {
|
||||||
.mult = 0, /*to be calculated*/
|
.mult = 0, /*to be calculated*/
|
||||||
.shift = 16,
|
.shift = 16,
|
||||||
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
.flags = CLOCK_SOURCE_IS_CONTINUOUS,
|
||||||
|
#ifdef CONFIG_PARAVIRT
|
||||||
|
.resume = paravirt_clocksource_resume,
|
||||||
|
#endif
|
||||||
};
|
};
|
||||||
static struct clocksource *itc_clocksource;
|
static struct clocksource *itc_clocksource;
|
||||||
|
|
||||||
|
@ -157,6 +170,9 @@ timer_interrupt (int irq, void *dev_id)
|
||||||
|
|
||||||
profile_tick(CPU_PROFILING);
|
profile_tick(CPU_PROFILING);
|
||||||
|
|
||||||
|
if (paravirt_do_steal_accounting(&new_itm))
|
||||||
|
goto skip_process_time_accounting;
|
||||||
|
|
||||||
while (1) {
|
while (1) {
|
||||||
update_process_times(user_mode(get_irq_regs()));
|
update_process_times(user_mode(get_irq_regs()));
|
||||||
|
|
||||||
|
@ -186,6 +202,8 @@ timer_interrupt (int irq, void *dev_id)
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
skip_process_time_accounting:
|
||||||
|
|
||||||
do {
|
do {
|
||||||
/*
|
/*
|
||||||
* If we're too close to the next clock tick for
|
* If we're too close to the next clock tick for
|
||||||
|
@ -335,6 +353,11 @@ ia64_init_itm (void)
|
||||||
*/
|
*/
|
||||||
clocksource_itc.rating = 50;
|
clocksource_itc.rating = 50;
|
||||||
|
|
||||||
|
paravirt_init_missing_ticks_accounting(smp_processor_id());
|
||||||
|
|
||||||
|
/* avoid softlock up message when cpu is unplug and plugged again. */
|
||||||
|
touch_softlockup_watchdog();
|
||||||
|
|
||||||
/* Setup the CPU local timer tick */
|
/* Setup the CPU local timer tick */
|
||||||
ia64_cpu_local_tick();
|
ia64_cpu_local_tick();
|
||||||
|
|
||||||
|
|
|
@ -4,7 +4,6 @@
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
#include <asm/pgtable.h>
|
#include <asm/pgtable.h>
|
||||||
|
|
||||||
#define LOAD_OFFSET (KERNEL_START - KERNEL_TR_PAGE_SIZE)
|
|
||||||
#include <asm-generic/vmlinux.lds.h>
|
#include <asm-generic/vmlinux.lds.h>
|
||||||
|
|
||||||
#define IVT_TEXT \
|
#define IVT_TEXT \
|
||||||
|
|
|
@ -522,8 +522,8 @@ static int __init rtlx_module_init(void)
|
||||||
atomic_set(&channel_wqs[i].in_open, 0);
|
atomic_set(&channel_wqs[i].in_open, 0);
|
||||||
mutex_init(&channel_wqs[i].mutex);
|
mutex_init(&channel_wqs[i].mutex);
|
||||||
|
|
||||||
dev = device_create(mt_class, NULL, MKDEV(major, i),
|
dev = device_create_drvdata(mt_class, NULL, MKDEV(major, i),
|
||||||
"%s%d", module_name, i);
|
NULL, "%s%d", module_name, i);
|
||||||
if (IS_ERR(dev)) {
|
if (IS_ERR(dev)) {
|
||||||
err = PTR_ERR(dev);
|
err = PTR_ERR(dev);
|
||||||
goto out_chrdev;
|
goto out_chrdev;
|
||||||
|
|
|
@ -576,7 +576,8 @@ static int __init sbprof_tb_init(void)
|
||||||
|
|
||||||
tb_class = tbc;
|
tb_class = tbc;
|
||||||
|
|
||||||
dev = device_create(tbc, NULL, MKDEV(SBPROF_TB_MAJOR, 0), "tb");
|
dev = device_create_drvdata(tbc, NULL, MKDEV(SBPROF_TB_MAJOR, 0),
|
||||||
|
NULL, "tb");
|
||||||
if (IS_ERR(dev)) {
|
if (IS_ERR(dev)) {
|
||||||
err = PTR_ERR(dev);
|
err = PTR_ERR(dev);
|
||||||
goto out_class;
|
goto out_class;
|
||||||
|
|
|
@ -199,7 +199,7 @@ config ARCH_HIBERNATION_POSSIBLE
|
||||||
|
|
||||||
config ARCH_SUSPEND_POSSIBLE
|
config ARCH_SUSPEND_POSSIBLE
|
||||||
def_bool y
|
def_bool y
|
||||||
depends on ADB_PMU || PPC_EFIKA || PPC_LITE5200
|
depends on ADB_PMU || PPC_EFIKA || PPC_LITE5200 || PPC_83xx
|
||||||
|
|
||||||
config PPC_DCR_NATIVE
|
config PPC_DCR_NATIVE
|
||||||
bool
|
bool
|
||||||
|
@ -568,11 +568,15 @@ config FSL_GTM
|
||||||
config MCA
|
config MCA
|
||||||
bool
|
bool
|
||||||
|
|
||||||
|
# Platforms that what PCI turned unconditionally just do select PCI
|
||||||
|
# in their config node. Platforms that want to choose at config
|
||||||
|
# time should select PPC_PCI_CHOICE
|
||||||
|
config PPC_PCI_CHOICE
|
||||||
|
bool
|
||||||
|
|
||||||
config PCI
|
config PCI
|
||||||
bool "PCI support" if 40x || CPM2 || PPC_83xx || PPC_85xx || PPC_86xx \
|
bool "PCI support" if PPC_PCI_CHOICE
|
||||||
|| PPC_MPC52xx || (EMBEDDED && (PPC_PSERIES || PPC_ISERIES)) \
|
default y if !40x && !CPM2 && !8xx && !PPC_83xx \
|
||||||
|| PPC_PS3 || 44x
|
|
||||||
default y if !40x && !CPM2 && !8xx && !PPC_MPC512x && !PPC_83xx \
|
|
||||||
&& !PPC_85xx && !PPC_86xx
|
&& !PPC_85xx && !PPC_86xx
|
||||||
default PCI_PERMEDIA if !4xx && !CPM2 && !8xx
|
default PCI_PERMEDIA if !4xx && !CPM2 && !8xx
|
||||||
default PCI_QSPAN if !4xx && !CPM2 && 8xx
|
default PCI_QSPAN if !4xx && !CPM2 && 8xx
|
||||||
|
|
|
@ -163,12 +163,12 @@ quiet_cmd_flex = FLEX $@
|
||||||
cmd_flex = $(FLEX) -o$@ $<; cp $@ $@_shipped
|
cmd_flex = $(FLEX) -o$@ $<; cp $@ $@_shipped
|
||||||
|
|
||||||
$(obj)/dtc-src/dtc-parser.tab.c: $(src)/dtc-src/dtc-parser.y FORCE
|
$(obj)/dtc-src/dtc-parser.tab.c: $(src)/dtc-src/dtc-parser.y FORCE
|
||||||
$(call if_changed,bison)
|
$(call if_changed,bison)
|
||||||
|
|
||||||
$(obj)/dtc-src/dtc-parser.tab.h: $(obj)/dtc-src/dtc-parser.tab.c
|
$(obj)/dtc-src/dtc-parser.tab.h: $(obj)/dtc-src/dtc-parser.tab.c
|
||||||
|
|
||||||
$(obj)/dtc-src/dtc-lexer.lex.c: $(src)/dtc-src/dtc-lexer.l FORCE
|
$(obj)/dtc-src/dtc-lexer.lex.c: $(src)/dtc-src/dtc-lexer.l FORCE
|
||||||
$(call if_changed,flex)
|
$(call if_changed,flex)
|
||||||
endif
|
endif
|
||||||
|
|
||||||
#############
|
#############
|
||||||
|
|
|
@ -18,6 +18,16 @@ / {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <1>;
|
#size-cells = <1>;
|
||||||
|
|
||||||
|
aliases {
|
||||||
|
ethernet0 = &enet0;
|
||||||
|
ethernet1 = &enet1;
|
||||||
|
|
||||||
|
serial0 = &serial0;
|
||||||
|
serial1 = &serial1;
|
||||||
|
|
||||||
|
pci0 = &pci0;
|
||||||
|
};
|
||||||
|
|
||||||
cpus {
|
cpus {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells =<0>;
|
#size-cells =<0>;
|
||||||
|
@ -78,7 +88,7 @@ phy9: ethernet-phy@9 {
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
||||||
ethernet@6200 {
|
enet0: ethernet@6200 {
|
||||||
linux,network-index = <0>;
|
linux,network-index = <0>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
device_type = "network";
|
device_type = "network";
|
||||||
|
@ -91,7 +101,7 @@ ethernet@6200 {
|
||||||
phy-handle = <&phy8>;
|
phy-handle = <&phy8>;
|
||||||
};
|
};
|
||||||
|
|
||||||
ethernet@6600 {
|
enet1: ethernet@6600 {
|
||||||
linux,network-index = <1>;
|
linux,network-index = <1>;
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <0>;
|
||||||
|
@ -105,7 +115,7 @@ ethernet@6600 {
|
||||||
phy-handle = <&phy9>;
|
phy-handle = <&phy9>;
|
||||||
};
|
};
|
||||||
|
|
||||||
serial@7808 {
|
serial0: serial@7808 {
|
||||||
device_type = "serial";
|
device_type = "serial";
|
||||||
compatible = "ns16550";
|
compatible = "ns16550";
|
||||||
reg = <0x7808 0x200>;
|
reg = <0x7808 0x200>;
|
||||||
|
@ -114,7 +124,7 @@ serial@7808 {
|
||||||
interrupt-parent = <&mpic>;
|
interrupt-parent = <&mpic>;
|
||||||
};
|
};
|
||||||
|
|
||||||
serial@7c08 {
|
serial1: serial@7c08 {
|
||||||
device_type = "serial";
|
device_type = "serial";
|
||||||
compatible = "ns16550";
|
compatible = "ns16550";
|
||||||
reg = <0x7c08 0x200>;
|
reg = <0x7c08 0x200>;
|
||||||
|
@ -131,7 +141,7 @@ mpic: pic@7400 {
|
||||||
compatible = "chrp,open-pic";
|
compatible = "chrp,open-pic";
|
||||||
device_type = "open-pic";
|
device_type = "open-pic";
|
||||||
};
|
};
|
||||||
pci@1000 {
|
pci0: pci@1000 {
|
||||||
compatible = "tsi108-pci";
|
compatible = "tsi108-pci";
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
|
@ -184,8 +194,4 @@ RT0: router@1180 {
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
chosen {
|
|
||||||
linux,stdout-path = "/tsi108@c0000000/serial@7808";
|
|
||||||
};
|
|
||||||
|
|
||||||
};
|
};
|
||||||
|
|
|
@ -109,18 +109,38 @@ wdt@200 {
|
||||||
reg = <0x200 0x100>;
|
reg = <0x200 0x100>;
|
||||||
};
|
};
|
||||||
|
|
||||||
i2c@3000 {
|
sleep-nexus {
|
||||||
#address-cells = <1>;
|
#address-cells = <1>;
|
||||||
#size-cells = <0>;
|
#size-cells = <1>;
|
||||||
cell-index = <0>;
|
compatible = "simple-bus";
|
||||||
compatible = "fsl-i2c";
|
sleep = <&pmc 0x03000000>;
|
||||||
reg = <0x3000 0x100>;
|
ranges;
|
||||||
interrupts = <14 0x8>;
|
|
||||||
interrupt-parent = <&ipic>;
|
i2c@3000 {
|
||||||
dfsrr;
|
#address-cells = <1>;
|
||||||
rtc@68 {
|
#size-cells = <0>;
|
||||||
compatible = "dallas,ds1339";
|
cell-index = <0>;
|
||||||
reg = <0x68>;
|
compatible = "fsl-i2c";
|
||||||
|
reg = <0x3000 0x100>;
|
||||||
|
interrupts = <14 0x8>;
|
||||||
|
interrupt-parent = <&ipic>;
|
||||||
|
dfsrr;
|
||||||
|
rtc@68 {
|
||||||
|
compatible = "dallas,ds1339";
|
||||||
|
reg = <0x68>;
|
||||||
|
};
|
||||||
|
};
|
||||||
|
|
||||||
|
crypto@30000 {
|
||||||
|
compatible = "fsl,sec2.2", "fsl,sec2.1",
|
||||||
|
"fsl,sec2.0";
|
||||||
|
reg = <0x30000 0x10000>;
|
||||||
|
interrupts = <11 0x8>;
|
||||||
|
interrupt-parent = <&ipic>;
|
||||||
|
fsl,num-channels = <1>;
|
||||||
|
fsl,channel-fifo-len = <24>;
|
||||||
|
fsl,exec-units-mask = <0x4c>;
|
||||||
|
fsl,descriptor-types-mask = <0x0122003f>;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
|
@ -188,37 +208,44 @@ usb@23000 {
|
||||||
interrupt-parent = <&ipic>;
|
interrupt-parent = <&ipic>;
|
||||||
interrupts = <38 0x8>;
|
interrupts = <38 0x8>;
|
||||||
phy_type = "utmi_wide";
|
phy_type = "utmi_wide";
|
||||||
};
|
sleep = <&pmc 0x00300000>;
|
||||||
|
|
||||||
mdio@24520 {
|
|
||||||
#address-cells = <1>;
|
|
||||||
#size-cells = <0>;
|
|
||||||
compatible = "fsl,gianfar-mdio";
|
|
||||||
reg = <0x24520 0x20>;
|
|
||||||
phy1: ethernet-phy@1 {
|
|
||||||
interrupt-parent = <&ipic>;
|
|
||||||
interrupts = <19 0x8>;
|
|
||||||
reg = <0x1>;
|
|
||||||
device_type = "ethernet-phy";
|
|
||||||
};
|
|
||||||
phy4: ethernet-phy@4 {
|
|
||||||
interrupt-parent = <&ipic>;
|
|
||||||
interrupts = <20 0x8>;
|
|
||||||
reg = <0x4>;
|
|
||||||
device_type = "ethernet-phy";
|
|
||||||
};
|
|
||||||
};
|
};
|
||||||
|
|
||||||
enet0: ethernet@24000 {
|
enet0: ethernet@24000 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
sleep = <&pmc 0x20000000>;
|
||||||
|
ranges;
|
||||||
|
|
||||||
cell-index = <0>;
|
cell-index = <0>;
|
||||||
device_type = "network";
|
device_type = "network";
|
||||||
model = "eTSEC";
|
model = "eTSEC";
|
||||||
compatible = "gianfar";
|
compatible = "gianfar", "simple-bus";
|
||||||
reg = <0x24000 0x1000>;
|
reg = <0x24000 0x1000>;
|
||||||
local-mac-address = [ 00 00 00 00 00 00 ];
|
local-mac-address = [ 00 00 00 00 00 00 ];
|
||||||
interrupts = <37 0x8 36 0x8 35 0x8>;
|
interrupts = <37 0x8 36 0x8 35 0x8>;
|
||||||
interrupt-parent = <&ipic>;
|
interrupt-parent = <&ipic>;
|
||||||
phy-handle = < &phy1 >;
|
phy-handle = < &phy1 >;
|
||||||
|
fsl,magic-packet;
|
||||||
|
|
||||||
|
mdio@24520 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <0>;
|
||||||
|
compatible = "fsl,gianfar-mdio";
|
||||||
|
reg = <0x24520 0x20>;
|
||||||
|
phy1: ethernet-phy@1 {
|
||||||
|
interrupt-parent = <&ipic>;
|
||||||
|
interrupts = <19 0x8>;
|
||||||
|
reg = <0x1>;
|
||||||
|
device_type = "ethernet-phy";
|
||||||
|
};
|
||||||
|
phy4: ethernet-phy@4 {
|
||||||
|
interrupt-parent = <&ipic>;
|
||||||
|
interrupts = <20 0x8>;
|
||||||
|
reg = <0x4>;
|
||||||
|
device_type = "ethernet-phy";
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
enet1: ethernet@25000 {
|
enet1: ethernet@25000 {
|
||||||
|
@ -231,6 +258,8 @@ enet1: ethernet@25000 {
|
||||||
interrupts = <34 0x8 33 0x8 32 0x8>;
|
interrupts = <34 0x8 33 0x8 32 0x8>;
|
||||||
interrupt-parent = <&ipic>;
|
interrupt-parent = <&ipic>;
|
||||||
phy-handle = < &phy4 >;
|
phy-handle = < &phy4 >;
|
||||||
|
sleep = <&pmc 0x10000000>;
|
||||||
|
fsl,magic-packet;
|
||||||
};
|
};
|
||||||
|
|
||||||
serial0: serial@4500 {
|
serial0: serial@4500 {
|
||||||
|
@ -253,17 +282,6 @@ serial1: serial@4600 {
|
||||||
interrupt-parent = <&ipic>;
|
interrupt-parent = <&ipic>;
|
||||||
};
|
};
|
||||||
|
|
||||||
crypto@30000 {
|
|
||||||
compatible = "fsl,sec2.2", "fsl,sec2.1", "fsl,sec2.0";
|
|
||||||
reg = <0x30000 0x10000>;
|
|
||||||
interrupts = <11 0x8>;
|
|
||||||
interrupt-parent = <&ipic>;
|
|
||||||
fsl,num-channels = <1>;
|
|
||||||
fsl,channel-fifo-len = <24>;
|
|
||||||
fsl,exec-units-mask = <0x4c>;
|
|
||||||
fsl,descriptor-types-mask = <0x0122003f>;
|
|
||||||
};
|
|
||||||
|
|
||||||
/* IPIC
|
/* IPIC
|
||||||
* interrupts cell = <intr #, sense>
|
* interrupts cell = <intr #, sense>
|
||||||
* sense values match linux IORESOURCE_IRQ_* defines:
|
* sense values match linux IORESOURCE_IRQ_* defines:
|
||||||
|
@ -277,36 +295,119 @@ ipic: pic@700 {
|
||||||
reg = <0x700 0x100>;
|
reg = <0x700 0x100>;
|
||||||
device_type = "ipic";
|
device_type = "ipic";
|
||||||
};
|
};
|
||||||
|
|
||||||
|
pmc: power@b00 {
|
||||||
|
compatible = "fsl,mpc8313-pmc", "fsl,mpc8349-pmc";
|
||||||
|
reg = <0xb00 0x100 0xa00 0x100>;
|
||||||
|
interrupts = <80 8>;
|
||||||
|
interrupt-parent = <&ipic>;
|
||||||
|
fsl,mpc8313-wakeup-timer = <>m1>;
|
||||||
|
|
||||||
|
/* Remove this (or change to "okay") if you have
|
||||||
|
* a REVA3 or later board, if you apply one of the
|
||||||
|
* workarounds listed in section 8.5 of the board
|
||||||
|
* manual, or if you are adapting this device tree
|
||||||
|
* to a different board.
|
||||||
|
*/
|
||||||
|
status = "fail";
|
||||||
|
};
|
||||||
|
|
||||||
|
gtm1: timer@500 {
|
||||||
|
compatible = "fsl,mpc8313-gtm", "fsl,gtm";
|
||||||
|
reg = <0x500 0x100>;
|
||||||
|
interrupts = <90 8 78 8 84 8 72 8>;
|
||||||
|
interrupt-parent = <&ipic>;
|
||||||
|
};
|
||||||
|
|
||||||
|
timer@600 {
|
||||||
|
compatible = "fsl,mpc8313-gtm", "fsl,gtm";
|
||||||
|
reg = <0x600 0x100>;
|
||||||
|
interrupts = <91 8 79 8 85 8 73 8>;
|
||||||
|
interrupt-parent = <&ipic>;
|
||||||
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
pci0: pci@e0008500 {
|
sleep-nexus {
|
||||||
cell-index = <1>;
|
#address-cells = <1>;
|
||||||
interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
|
#size-cells = <1>;
|
||||||
interrupt-map = <
|
compatible = "simple-bus";
|
||||||
|
sleep = <&pmc 0x00010000>;
|
||||||
|
ranges;
|
||||||
|
|
||||||
/* IDSEL 0x0E -mini PCI */
|
pci0: pci@e0008500 {
|
||||||
0x7000 0x0 0x0 0x1 &ipic 18 0x8
|
cell-index = <1>;
|
||||||
0x7000 0x0 0x0 0x2 &ipic 18 0x8
|
interrupt-map-mask = <0xf800 0x0 0x0 0x7>;
|
||||||
0x7000 0x0 0x0 0x3 &ipic 18 0x8
|
interrupt-map = <
|
||||||
0x7000 0x0 0x0 0x4 &ipic 18 0x8
|
/* IDSEL 0x0E -mini PCI */
|
||||||
|
0x7000 0x0 0x0 0x1 &ipic 18 0x8
|
||||||
|
0x7000 0x0 0x0 0x2 &ipic 18 0x8
|
||||||
|
0x7000 0x0 0x0 0x3 &ipic 18 0x8
|
||||||
|
0x7000 0x0 0x0 0x4 &ipic 18 0x8
|
||||||
|
|
||||||
/* IDSEL 0x0F - PCI slot */
|
/* IDSEL 0x0F - PCI slot */
|
||||||
0x7800 0x0 0x0 0x1 &ipic 17 0x8
|
0x7800 0x0 0x0 0x1 &ipic 17 0x8
|
||||||
0x7800 0x0 0x0 0x2 &ipic 18 0x8
|
0x7800 0x0 0x0 0x2 &ipic 18 0x8
|
||||||
0x7800 0x0 0x0 0x3 &ipic 17 0x8
|
0x7800 0x0 0x0 0x3 &ipic 17 0x8
|
||||||
0x7800 0x0 0x0 0x4 &ipic 18 0x8>;
|
0x7800 0x0 0x0 0x4 &ipic 18 0x8>;
|
||||||
interrupt-parent = <&ipic>;
|
interrupt-parent = <&ipic>;
|
||||||
interrupts = <66 0x8>;
|
interrupts = <66 0x8>;
|
||||||
bus-range = <0x0 0x0>;
|
bus-range = <0x0 0x0>;
|
||||||
ranges = <0x02000000 0x0 0x90000000 0x90000000 0x0 0x10000000
|
ranges = <0x02000000 0x0 0x90000000 0x90000000 0x0 0x10000000
|
||||||
0x42000000 0x0 0x80000000 0x80000000 0x0 0x10000000
|
0x42000000 0x0 0x80000000 0x80000000 0x0 0x10000000
|
||||||
0x01000000 0x0 0x00000000 0xe2000000 0x0 0x00100000>;
|
0x01000000 0x0 0x00000000 0xe2000000 0x0 0x00100000>;
|
||||||
clock-frequency = <66666666>;
|
clock-frequency = <66666666>;
|
||||||
#interrupt-cells = <1>;
|
#interrupt-cells = <1>;
|
||||||
#size-cells = <2>;
|
#size-cells = <2>;
|
||||||
#address-cells = <3>;
|
#address-cells = <3>;
|
||||||
reg = <0xe0008500 0x100>;
|
reg = <0xe0008500 0x100>;
|
||||||
compatible = "fsl,mpc8349-pci";
|
compatible = "fsl,mpc8349-pci";
|
||||||
device_type = "pci";
|
device_type = "pci";
|
||||||
|
};
|
||||||
|
|
||||||
|
dma@82a8 {
|
||||||
|
#address-cells = <1>;
|
||||||
|
#size-cells = <1>;
|
||||||
|
compatible = "fsl,mpc8313-dma", "fsl,elo-dma";
|
||||||
|
reg = <0xe00082a8 4>;
|
||||||
|
ranges = <0 0xe0008100 0x1a8>;
|
||||||
|
interrupt-parent = <&ipic>;
|
||||||
|
interrupts = <71 8>;
|
||||||
|
|
||||||
|
dma-channel@0 {
|
||||||
|
compatible = "fsl,mpc8313-dma-channel",
|
||||||
|
"fsl,elo-dma-channel";
|
||||||
|
reg = <0 0x28>;
|
||||||
|
interrupt-parent = <&ipic>;
|
||||||
|
interrupts = <71 8>;
|
||||||
|
cell-index = <0>;
|
||||||
|
};
|
||||||
|
|
||||||
|
dma-channel@80 {
|
||||||
|
compatible = "fsl,mpc8313-dma-channel",
|
||||||
|
"fsl,elo-dma-channel";
|
||||||
|
reg = <0x80 0x28>;
|
||||||
|
interrupt-parent = <&ipic>;
|
||||||
|
interrupts = <71 8>;
|
||||||
|
cell-index = <1>;
|
||||||
|
};
|
||||||
|
|
||||||
|
dma-channel@100 {
|
||||||
|
compatible = "fsl,mpc8313-dma-channel",
|
||||||
|
"fsl,elo-dma-channel";
|
||||||
|
reg = <0x100 0x28>;
|
||||||
|
interrupt-parent = <&ipic>;
|
||||||
|
interrupts = <71 8>;
|
||||||
|
cell-index = <2>;
|
||||||
|
};
|
||||||
|
|
||||||
|
dma-channel@180 {
|
||||||
|
compatible = "fsl,mpc8313-dma-channel",
|
||||||
|
"fsl,elo-dma-channel";
|
||||||
|
reg = <0x180 0x28>;
|
||||||
|
interrupt-parent = <&ipic>;
|
||||||
|
interrupts = <71 8>;
|
||||||
|
cell-index = <3>;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -388,6 +388,20 @@ uli1575@0 {
|
||||||
0x01000000 0x0 0x00000000
|
0x01000000 0x0 0x00000000
|
||||||
0x01000000 0x0 0x00000000
|
0x01000000 0x0 0x00000000
|
||||||
0x0 0x00100000>;
|
0x0 0x00100000>;
|
||||||
|
|
||||||
|
isa@1e {
|
||||||
|
device_type = "isa";
|
||||||
|
#size-cells = <1>;
|
||||||
|
#address-cells = <2>;
|
||||||
|
reg = <0xf000 0 0 0 0>;
|
||||||
|
ranges = <1 0 0x01000000 0 0
|
||||||
|
0x00001000>;
|
||||||
|
|
||||||
|
rtc@70 {
|
||||||
|
compatible = "pnpPNP,b00";
|
||||||
|
reg = <1 0x70 2>;
|
||||||
|
};
|
||||||
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
|
@ -997,10 +997,12 @@ CONFIG_SND=y
|
||||||
CONFIG_SND_TIMER=y
|
CONFIG_SND_TIMER=y
|
||||||
CONFIG_SND_PCM=y
|
CONFIG_SND_PCM=y
|
||||||
# CONFIG_SND_SEQUENCER is not set
|
# CONFIG_SND_SEQUENCER is not set
|
||||||
# CONFIG_SND_MIXER_OSS is not set
|
CONFIG_SND_OSSEMUL=y
|
||||||
# CONFIG_SND_PCM_OSS is not set
|
CONFIG_SND_MIXER_OSS=y
|
||||||
|
CONFIG_SND_PCM_OSS=y
|
||||||
|
CONFIG_SND_PCM_OSS_PLUGINS=y
|
||||||
# CONFIG_SND_DYNAMIC_MINORS is not set
|
# CONFIG_SND_DYNAMIC_MINORS is not set
|
||||||
CONFIG_SND_SUPPORT_OLD_API=y
|
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||||
CONFIG_SND_VERBOSE_PROCFS=y
|
CONFIG_SND_VERBOSE_PROCFS=y
|
||||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||||
# CONFIG_SND_DEBUG is not set
|
# CONFIG_SND_DEBUG is not set
|
||||||
|
|
|
@ -997,10 +997,12 @@ CONFIG_SND=y
|
||||||
CONFIG_SND_TIMER=y
|
CONFIG_SND_TIMER=y
|
||||||
CONFIG_SND_PCM=y
|
CONFIG_SND_PCM=y
|
||||||
# CONFIG_SND_SEQUENCER is not set
|
# CONFIG_SND_SEQUENCER is not set
|
||||||
# CONFIG_SND_MIXER_OSS is not set
|
CONFIG_SND_OSSEMUL=y
|
||||||
# CONFIG_SND_PCM_OSS is not set
|
CONFIG_SND_MIXER_OSS=y
|
||||||
|
CONFIG_SND_PCM_OSS=y
|
||||||
|
CONFIG_SND_PCM_OSS_PLUGINS=y
|
||||||
# CONFIG_SND_DYNAMIC_MINORS is not set
|
# CONFIG_SND_DYNAMIC_MINORS is not set
|
||||||
CONFIG_SND_SUPPORT_OLD_API=y
|
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||||
CONFIG_SND_VERBOSE_PROCFS=y
|
CONFIG_SND_VERBOSE_PROCFS=y
|
||||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||||
# CONFIG_SND_DEBUG is not set
|
# CONFIG_SND_DEBUG is not set
|
||||||
|
|
|
@ -1005,10 +1005,12 @@ CONFIG_SND=y
|
||||||
CONFIG_SND_TIMER=y
|
CONFIG_SND_TIMER=y
|
||||||
CONFIG_SND_PCM=y
|
CONFIG_SND_PCM=y
|
||||||
# CONFIG_SND_SEQUENCER is not set
|
# CONFIG_SND_SEQUENCER is not set
|
||||||
# CONFIG_SND_MIXER_OSS is not set
|
CONFIG_SND_OSSEMUL=y
|
||||||
# CONFIG_SND_PCM_OSS is not set
|
CONFIG_SND_MIXER_OSS=y
|
||||||
|
CONFIG_SND_PCM_OSS=y
|
||||||
|
CONFIG_SND_PCM_OSS_PLUGINS=y
|
||||||
# CONFIG_SND_DYNAMIC_MINORS is not set
|
# CONFIG_SND_DYNAMIC_MINORS is not set
|
||||||
CONFIG_SND_SUPPORT_OLD_API=y
|
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||||
CONFIG_SND_VERBOSE_PROCFS=y
|
CONFIG_SND_VERBOSE_PROCFS=y
|
||||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||||
# CONFIG_SND_DEBUG is not set
|
# CONFIG_SND_DEBUG is not set
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.26-rc5
|
# Linux kernel version: 2.6.26
|
||||||
# Mon Jun 9 08:50:24 2008
|
# Tue Jul 15 08:31:01 2008
|
||||||
#
|
#
|
||||||
# CONFIG_PPC64 is not set
|
# CONFIG_PPC64 is not set
|
||||||
|
|
||||||
|
@ -51,6 +51,8 @@ CONFIG_PPC_UDBG_16550=y
|
||||||
CONFIG_AUDIT_ARCH=y
|
CONFIG_AUDIT_ARCH=y
|
||||||
CONFIG_GENERIC_BUG=y
|
CONFIG_GENERIC_BUG=y
|
||||||
CONFIG_DEFAULT_UIMAGE=y
|
CONFIG_DEFAULT_UIMAGE=y
|
||||||
|
CONFIG_HIBERNATE_32=y
|
||||||
|
CONFIG_ARCH_HIBERNATION_POSSIBLE=y
|
||||||
# CONFIG_PPC_DCR_NATIVE is not set
|
# CONFIG_PPC_DCR_NATIVE is not set
|
||||||
# CONFIG_PPC_DCR_MMIO is not set
|
# CONFIG_PPC_DCR_MMIO is not set
|
||||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||||
|
@ -97,6 +99,7 @@ CONFIG_HOTPLUG=y
|
||||||
CONFIG_PRINTK=y
|
CONFIG_PRINTK=y
|
||||||
CONFIG_BUG=y
|
CONFIG_BUG=y
|
||||||
# CONFIG_ELF_CORE is not set
|
# CONFIG_ELF_CORE is not set
|
||||||
|
CONFIG_PCSPKR_PLATFORM=y
|
||||||
CONFIG_COMPAT_BRK=y
|
CONFIG_COMPAT_BRK=y
|
||||||
CONFIG_BASE_FULL=y
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
|
@ -117,7 +120,7 @@ CONFIG_HAVE_OPROFILE=y
|
||||||
# CONFIG_KPROBES is not set
|
# CONFIG_KPROBES is not set
|
||||||
CONFIG_HAVE_KPROBES=y
|
CONFIG_HAVE_KPROBES=y
|
||||||
CONFIG_HAVE_KRETPROBES=y
|
CONFIG_HAVE_KRETPROBES=y
|
||||||
# CONFIG_HAVE_DMA_ATTRS is not set
|
CONFIG_HAVE_DMA_ATTRS=y
|
||||||
CONFIG_PROC_PAGE_MONITOR=y
|
CONFIG_PROC_PAGE_MONITOR=y
|
||||||
CONFIG_SLABINFO=y
|
CONFIG_SLABINFO=y
|
||||||
CONFIG_RT_MUTEXES=y
|
CONFIG_RT_MUTEXES=y
|
||||||
|
@ -153,31 +156,43 @@ CONFIG_CLASSIC_RCU=y
|
||||||
#
|
#
|
||||||
# Platform support
|
# Platform support
|
||||||
#
|
#
|
||||||
# CONFIG_PPC_MULTIPLATFORM is not set
|
CONFIG_PPC_MULTIPLATFORM=y
|
||||||
# CONFIG_PPC_82xx is not set
|
CONFIG_CLASSIC32=y
|
||||||
# CONFIG_PPC_83xx is not set
|
CONFIG_PPC_CHRP=y
|
||||||
CONFIG_PPC_86xx=y
|
|
||||||
# CONFIG_PPC_MPC512x is not set
|
# CONFIG_PPC_MPC512x is not set
|
||||||
# CONFIG_PPC_MPC5121 is not set
|
# CONFIG_PPC_MPC5121 is not set
|
||||||
|
# CONFIG_MPC5121_ADS is not set
|
||||||
|
# CONFIG_PPC_MPC52xx is not set
|
||||||
|
CONFIG_PPC_PMAC=y
|
||||||
# CONFIG_PPC_CELL is not set
|
# CONFIG_PPC_CELL is not set
|
||||||
# CONFIG_PPC_CELL_NATIVE is not set
|
# CONFIG_PPC_CELL_NATIVE is not set
|
||||||
|
# CONFIG_PPC_82xx is not set
|
||||||
# CONFIG_PQ2ADS is not set
|
# CONFIG_PQ2ADS is not set
|
||||||
|
# CONFIG_PPC_83xx is not set
|
||||||
|
CONFIG_PPC_86xx=y
|
||||||
# CONFIG_MPC8641_HPCN is not set
|
# CONFIG_MPC8641_HPCN is not set
|
||||||
# CONFIG_SBC8641D is not set
|
# CONFIG_SBC8641D is not set
|
||||||
CONFIG_MPC8610_HPCD=y
|
CONFIG_MPC8610_HPCD=y
|
||||||
CONFIG_MPC8610=y
|
CONFIG_MPC8610=y
|
||||||
|
# CONFIG_EMBEDDED6xx is not set
|
||||||
|
CONFIG_PPC_NATIVE=y
|
||||||
|
# CONFIG_UDBG_RTAS_CONSOLE is not set
|
||||||
# CONFIG_IPIC is not set
|
# CONFIG_IPIC is not set
|
||||||
CONFIG_MPIC=y
|
CONFIG_MPIC=y
|
||||||
# CONFIG_MPIC_WEIRD is not set
|
# CONFIG_MPIC_WEIRD is not set
|
||||||
# CONFIG_PPC_I8259 is not set
|
CONFIG_PPC_I8259=y
|
||||||
# CONFIG_PPC_RTAS is not set
|
CONFIG_PPC_RTAS=y
|
||||||
|
# CONFIG_RTAS_ERROR_LOGGING is not set
|
||||||
|
CONFIG_RTAS_PROC=y
|
||||||
# CONFIG_MMIO_NVRAM is not set
|
# CONFIG_MMIO_NVRAM is not set
|
||||||
# CONFIG_PPC_MPC106 is not set
|
CONFIG_PPC_MPC106=y
|
||||||
# CONFIG_PPC_970_NAP is not set
|
# CONFIG_PPC_970_NAP is not set
|
||||||
# CONFIG_PPC_INDIRECT_IO is not set
|
# CONFIG_PPC_INDIRECT_IO is not set
|
||||||
# CONFIG_GENERIC_IOMAP is not set
|
# CONFIG_GENERIC_IOMAP is not set
|
||||||
# CONFIG_CPU_FREQ is not set
|
# CONFIG_CPU_FREQ is not set
|
||||||
# CONFIG_FSL_ULI1575 is not set
|
# CONFIG_PPC601_SYNC_FIX is not set
|
||||||
|
# CONFIG_TAU is not set
|
||||||
|
CONFIG_FSL_ULI1575=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Kernel options
|
# Kernel options
|
||||||
|
@ -202,6 +217,7 @@ CONFIG_BINFMT_ELF=y
|
||||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||||
CONFIG_ARCH_HAS_WALK_MEMORY=y
|
CONFIG_ARCH_HAS_WALK_MEMORY=y
|
||||||
CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
|
CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
|
||||||
|
# CONFIG_KEXEC is not set
|
||||||
CONFIG_ARCH_FLATMEM_ENABLE=y
|
CONFIG_ARCH_FLATMEM_ENABLE=y
|
||||||
CONFIG_ARCH_POPULATES_NODE_MAP=y
|
CONFIG_ARCH_POPULATES_NODE_MAP=y
|
||||||
CONFIG_SELECT_MEMORY_MODEL=y
|
CONFIG_SELECT_MEMORY_MODEL=y
|
||||||
|
@ -228,11 +244,13 @@ CONFIG_ISA_DMA_API=y
|
||||||
#
|
#
|
||||||
# Bus options
|
# Bus options
|
||||||
#
|
#
|
||||||
|
# CONFIG_ISA is not set
|
||||||
CONFIG_ZONE_DMA=y
|
CONFIG_ZONE_DMA=y
|
||||||
CONFIG_GENERIC_ISA_DMA=y
|
CONFIG_GENERIC_ISA_DMA=y
|
||||||
CONFIG_PPC_INDIRECT_PCI=y
|
CONFIG_PPC_INDIRECT_PCI=y
|
||||||
CONFIG_FSL_SOC=y
|
CONFIG_FSL_SOC=y
|
||||||
CONFIG_FSL_PCI=y
|
CONFIG_FSL_PCI=y
|
||||||
|
CONFIG_PPC_PCI_CHOICE=y
|
||||||
CONFIG_PCI=y
|
CONFIG_PCI=y
|
||||||
CONFIG_PCI_DOMAINS=y
|
CONFIG_PCI_DOMAINS=y
|
||||||
CONFIG_PCI_SYSCALL=y
|
CONFIG_PCI_SYSCALL=y
|
||||||
|
@ -469,6 +487,7 @@ CONFIG_OF_I2C=y
|
||||||
# CONFIG_PARPORT is not set
|
# CONFIG_PARPORT is not set
|
||||||
CONFIG_BLK_DEV=y
|
CONFIG_BLK_DEV=y
|
||||||
# CONFIG_BLK_DEV_FD is not set
|
# CONFIG_BLK_DEV_FD is not set
|
||||||
|
# CONFIG_MAC_FLOPPY is not set
|
||||||
# CONFIG_BLK_CPQ_DA is not set
|
# CONFIG_BLK_CPQ_DA is not set
|
||||||
# CONFIG_BLK_CPQ_CISS_DA is not set
|
# CONFIG_BLK_CPQ_CISS_DA is not set
|
||||||
# CONFIG_BLK_DEV_DAC960 is not set
|
# CONFIG_BLK_DEV_DAC960 is not set
|
||||||
|
@ -571,6 +590,8 @@ CONFIG_SCSI_LOWLEVEL=y
|
||||||
# CONFIG_SCSI_DC390T is not set
|
# CONFIG_SCSI_DC390T is not set
|
||||||
# CONFIG_SCSI_NSP32 is not set
|
# CONFIG_SCSI_NSP32 is not set
|
||||||
# CONFIG_SCSI_DEBUG is not set
|
# CONFIG_SCSI_DEBUG is not set
|
||||||
|
# CONFIG_SCSI_MESH is not set
|
||||||
|
# CONFIG_SCSI_MAC53C94 is not set
|
||||||
# CONFIG_SCSI_SRP is not set
|
# CONFIG_SCSI_SRP is not set
|
||||||
CONFIG_ATA=y
|
CONFIG_ATA=y
|
||||||
# CONFIG_ATA_NONSTANDARD is not set
|
# CONFIG_ATA_NONSTANDARD is not set
|
||||||
|
@ -639,6 +660,10 @@ CONFIG_PATA_ALI=y
|
||||||
#
|
#
|
||||||
# IEEE 1394 (FireWire) support
|
# IEEE 1394 (FireWire) support
|
||||||
#
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Enable only one of the two stacks, unless you know what you are doing
|
||||||
|
#
|
||||||
# CONFIG_FIREWIRE is not set
|
# CONFIG_FIREWIRE is not set
|
||||||
# CONFIG_IEEE1394 is not set
|
# CONFIG_IEEE1394 is not set
|
||||||
# CONFIG_I2O is not set
|
# CONFIG_I2O is not set
|
||||||
|
@ -655,6 +680,8 @@ CONFIG_DUMMY=y
|
||||||
# CONFIG_PHYLIB is not set
|
# CONFIG_PHYLIB is not set
|
||||||
CONFIG_NET_ETHERNET=y
|
CONFIG_NET_ETHERNET=y
|
||||||
# CONFIG_MII is not set
|
# CONFIG_MII is not set
|
||||||
|
# CONFIG_MACE is not set
|
||||||
|
# CONFIG_BMAC is not set
|
||||||
# CONFIG_HAPPYMEAL is not set
|
# CONFIG_HAPPYMEAL is not set
|
||||||
# CONFIG_SUNGEM is not set
|
# CONFIG_SUNGEM is not set
|
||||||
# CONFIG_CASSINI is not set
|
# CONFIG_CASSINI is not set
|
||||||
|
@ -762,14 +789,16 @@ CONFIG_SERIAL_8250_RSA=y
|
||||||
# CONFIG_SERIAL_UARTLITE is not set
|
# CONFIG_SERIAL_UARTLITE is not set
|
||||||
CONFIG_SERIAL_CORE=y
|
CONFIG_SERIAL_CORE=y
|
||||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||||
|
# CONFIG_SERIAL_PMACZILOG is not set
|
||||||
# CONFIG_SERIAL_JSM is not set
|
# CONFIG_SERIAL_JSM is not set
|
||||||
# CONFIG_SERIAL_OF_PLATFORM is not set
|
# CONFIG_SERIAL_OF_PLATFORM is not set
|
||||||
CONFIG_UNIX98_PTYS=y
|
CONFIG_UNIX98_PTYS=y
|
||||||
# CONFIG_LEGACY_PTYS is not set
|
# CONFIG_LEGACY_PTYS is not set
|
||||||
|
# CONFIG_BRIQ_PANEL is not set
|
||||||
|
# CONFIG_HVC_RTAS is not set
|
||||||
# CONFIG_IPMI_HANDLER is not set
|
# CONFIG_IPMI_HANDLER is not set
|
||||||
# CONFIG_HW_RANDOM is not set
|
# CONFIG_HW_RANDOM is not set
|
||||||
# CONFIG_NVRAM is not set
|
# CONFIG_NVRAM is not set
|
||||||
# CONFIG_GEN_RTC is not set
|
|
||||||
# CONFIG_R3964 is not set
|
# CONFIG_R3964 is not set
|
||||||
# CONFIG_APPLICOM is not set
|
# CONFIG_APPLICOM is not set
|
||||||
# CONFIG_RAW_DRIVER is not set
|
# CONFIG_RAW_DRIVER is not set
|
||||||
|
@ -787,9 +816,11 @@ CONFIG_I2C_BOARDINFO=y
|
||||||
# CONFIG_I2C_ALI15X3 is not set
|
# CONFIG_I2C_ALI15X3 is not set
|
||||||
# CONFIG_I2C_AMD756 is not set
|
# CONFIG_I2C_AMD756 is not set
|
||||||
# CONFIG_I2C_AMD8111 is not set
|
# CONFIG_I2C_AMD8111 is not set
|
||||||
|
# CONFIG_I2C_HYDRA is not set
|
||||||
# CONFIG_I2C_I801 is not set
|
# CONFIG_I2C_I801 is not set
|
||||||
# CONFIG_I2C_I810 is not set
|
# CONFIG_I2C_I810 is not set
|
||||||
# CONFIG_I2C_PIIX4 is not set
|
# CONFIG_I2C_PIIX4 is not set
|
||||||
|
CONFIG_I2C_POWERMAC=y
|
||||||
CONFIG_I2C_MPC=y
|
CONFIG_I2C_MPC=y
|
||||||
# CONFIG_I2C_NFORCE2 is not set
|
# CONFIG_I2C_NFORCE2 is not set
|
||||||
# CONFIG_I2C_OCORES is not set
|
# CONFIG_I2C_OCORES is not set
|
||||||
|
@ -826,6 +857,7 @@ CONFIG_I2C_MPC=y
|
||||||
# CONFIG_POWER_SUPPLY is not set
|
# CONFIG_POWER_SUPPLY is not set
|
||||||
# CONFIG_HWMON is not set
|
# CONFIG_HWMON is not set
|
||||||
# CONFIG_THERMAL is not set
|
# CONFIG_THERMAL is not set
|
||||||
|
# CONFIG_THERMAL_HWMON is not set
|
||||||
# CONFIG_WATCHDOG is not set
|
# CONFIG_WATCHDOG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -888,6 +920,9 @@ CONFIG_FB_CFB_IMAGEBLIT=y
|
||||||
# CONFIG_FB_PM2 is not set
|
# CONFIG_FB_PM2 is not set
|
||||||
# CONFIG_FB_CYBER2000 is not set
|
# CONFIG_FB_CYBER2000 is not set
|
||||||
# CONFIG_FB_OF is not set
|
# CONFIG_FB_OF is not set
|
||||||
|
# CONFIG_FB_CONTROL is not set
|
||||||
|
# CONFIG_FB_PLATINUM is not set
|
||||||
|
# CONFIG_FB_VALKYRIE is not set
|
||||||
# CONFIG_FB_CT65550 is not set
|
# CONFIG_FB_CT65550 is not set
|
||||||
# CONFIG_FB_ASILIANT is not set
|
# CONFIG_FB_ASILIANT is not set
|
||||||
# CONFIG_FB_IMSTT is not set
|
# CONFIG_FB_IMSTT is not set
|
||||||
|
@ -1027,11 +1062,18 @@ CONFIG_SND_VERBOSE_PROCFS=y
|
||||||
#
|
#
|
||||||
# ALSA PowerMac devices
|
# ALSA PowerMac devices
|
||||||
#
|
#
|
||||||
|
# CONFIG_SND_POWERMAC is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# ALSA PowerPC devices
|
# ALSA PowerPC devices
|
||||||
#
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Apple Onboard Audio driver
|
||||||
|
#
|
||||||
|
# CONFIG_SND_AOA is not set
|
||||||
|
# CONFIG_SND_AOA_SOUNDBUS is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# System on Chip audio support
|
# System on Chip audio support
|
||||||
#
|
#
|
||||||
|
@ -1075,7 +1117,57 @@ CONFIG_USB_ARCH_HAS_EHCI=y
|
||||||
# CONFIG_ACCESSIBILITY is not set
|
# CONFIG_ACCESSIBILITY is not set
|
||||||
# CONFIG_INFINIBAND is not set
|
# CONFIG_INFINIBAND is not set
|
||||||
# CONFIG_EDAC is not set
|
# CONFIG_EDAC is not set
|
||||||
# CONFIG_RTC_CLASS is not set
|
CONFIG_RTC_LIB=y
|
||||||
|
CONFIG_RTC_CLASS=y
|
||||||
|
CONFIG_RTC_HCTOSYS=y
|
||||||
|
CONFIG_RTC_HCTOSYS_DEVICE="rtc0"
|
||||||
|
# CONFIG_RTC_DEBUG is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# RTC interfaces
|
||||||
|
#
|
||||||
|
CONFIG_RTC_INTF_SYSFS=y
|
||||||
|
CONFIG_RTC_INTF_PROC=y
|
||||||
|
CONFIG_RTC_INTF_DEV=y
|
||||||
|
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
|
||||||
|
# CONFIG_RTC_DRV_TEST is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# I2C RTC drivers
|
||||||
|
#
|
||||||
|
# CONFIG_RTC_DRV_DS1307 is not set
|
||||||
|
# CONFIG_RTC_DRV_DS1374 is not set
|
||||||
|
# CONFIG_RTC_DRV_DS1672 is not set
|
||||||
|
# CONFIG_RTC_DRV_MAX6900 is not set
|
||||||
|
# CONFIG_RTC_DRV_RS5C372 is not set
|
||||||
|
# CONFIG_RTC_DRV_ISL1208 is not set
|
||||||
|
# CONFIG_RTC_DRV_X1205 is not set
|
||||||
|
# CONFIG_RTC_DRV_PCF8563 is not set
|
||||||
|
# CONFIG_RTC_DRV_PCF8583 is not set
|
||||||
|
# CONFIG_RTC_DRV_M41T80 is not set
|
||||||
|
# CONFIG_RTC_DRV_S35390A is not set
|
||||||
|
# CONFIG_RTC_DRV_FM3130 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# SPI RTC drivers
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Platform RTC drivers
|
||||||
|
#
|
||||||
|
CONFIG_RTC_DRV_CMOS=y
|
||||||
|
# CONFIG_RTC_DRV_DS1511 is not set
|
||||||
|
# CONFIG_RTC_DRV_DS1553 is not set
|
||||||
|
# CONFIG_RTC_DRV_DS1742 is not set
|
||||||
|
# CONFIG_RTC_DRV_STK17TA8 is not set
|
||||||
|
# CONFIG_RTC_DRV_M48T86 is not set
|
||||||
|
# CONFIG_RTC_DRV_M48T59 is not set
|
||||||
|
# CONFIG_RTC_DRV_V3020 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# on-CPU RTC drivers
|
||||||
|
#
|
||||||
|
# CONFIG_RTC_DRV_PPC is not set
|
||||||
# CONFIG_DMADEVICES is not set
|
# CONFIG_DMADEVICES is not set
|
||||||
# CONFIG_UIO is not set
|
# CONFIG_UIO is not set
|
||||||
|
|
||||||
|
@ -1295,8 +1387,11 @@ CONFIG_DEBUG_INFO=y
|
||||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||||
# CONFIG_DEBUG_PAGEALLOC is not set
|
# CONFIG_DEBUG_PAGEALLOC is not set
|
||||||
# CONFIG_DEBUGGER is not set
|
# CONFIG_DEBUGGER is not set
|
||||||
|
# CONFIG_CODE_PATCHING_SELFTEST is not set
|
||||||
|
# CONFIG_FTR_FIXUP_SELFTEST is not set
|
||||||
# CONFIG_IRQSTACKS is not set
|
# CONFIG_IRQSTACKS is not set
|
||||||
# CONFIG_BDI_SWITCH is not set
|
# CONFIG_BDI_SWITCH is not set
|
||||||
|
# CONFIG_BOOTX_TEXT is not set
|
||||||
# CONFIG_PPC_EARLY_DEBUG is not set
|
# CONFIG_PPC_EARLY_DEBUG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
|
|
@ -991,10 +991,12 @@ CONFIG_SND=y
|
||||||
CONFIG_SND_TIMER=y
|
CONFIG_SND_TIMER=y
|
||||||
CONFIG_SND_PCM=y
|
CONFIG_SND_PCM=y
|
||||||
# CONFIG_SND_SEQUENCER is not set
|
# CONFIG_SND_SEQUENCER is not set
|
||||||
# CONFIG_SND_MIXER_OSS is not set
|
CONFIG_SND_OSSEMUL=y
|
||||||
# CONFIG_SND_PCM_OSS is not set
|
CONFIG_SND_MIXER_OSS=y
|
||||||
|
CONFIG_SND_PCM_OSS=y
|
||||||
|
CONFIG_SND_PCM_OSS_PLUGINS=y
|
||||||
# CONFIG_SND_DYNAMIC_MINORS is not set
|
# CONFIG_SND_DYNAMIC_MINORS is not set
|
||||||
CONFIG_SND_SUPPORT_OLD_API=y
|
# CONFIG_SND_SUPPORT_OLD_API is not set
|
||||||
CONFIG_SND_VERBOSE_PROCFS=y
|
CONFIG_SND_VERBOSE_PROCFS=y
|
||||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||||
# CONFIG_SND_DEBUG is not set
|
# CONFIG_SND_DEBUG is not set
|
||||||
|
|
File diff suppressed because it is too large
Load Diff
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.25
|
# Linux kernel version: 2.6.26
|
||||||
# Mon Apr 28 12:39:10 2008
|
# Wed Jul 16 13:59:24 2008
|
||||||
#
|
#
|
||||||
CONFIG_PPC64=y
|
CONFIG_PPC64=y
|
||||||
|
|
||||||
|
@ -14,8 +14,9 @@ CONFIG_POWER4=y
|
||||||
CONFIG_TUNE_CELL=y
|
CONFIG_TUNE_CELL=y
|
||||||
CONFIG_PPC_FPU=y
|
CONFIG_PPC_FPU=y
|
||||||
CONFIG_ALTIVEC=y
|
CONFIG_ALTIVEC=y
|
||||||
|
# CONFIG_VSX is not set
|
||||||
CONFIG_PPC_STD_MMU=y
|
CONFIG_PPC_STD_MMU=y
|
||||||
# CONFIG_PPC_MM_SLICES is not set
|
CONFIG_PPC_MM_SLICES=y
|
||||||
CONFIG_VIRT_CPU_ACCOUNTING=y
|
CONFIG_VIRT_CPU_ACCOUNTING=y
|
||||||
CONFIG_SMP=y
|
CONFIG_SMP=y
|
||||||
CONFIG_NR_CPUS=2
|
CONFIG_NR_CPUS=2
|
||||||
|
@ -31,6 +32,7 @@ CONFIG_GENERIC_HARDIRQS=y
|
||||||
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
|
CONFIG_HAVE_SETUP_PER_CPU_AREA=y
|
||||||
CONFIG_IRQ_PER_CPU=y
|
CONFIG_IRQ_PER_CPU=y
|
||||||
CONFIG_STACKTRACE_SUPPORT=y
|
CONFIG_STACKTRACE_SUPPORT=y
|
||||||
|
CONFIG_HAVE_LATENCYTOP_SUPPORT=y
|
||||||
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
CONFIG_TRACE_IRQFLAGS_SUPPORT=y
|
||||||
CONFIG_LOCKDEP_SUPPORT=y
|
CONFIG_LOCKDEP_SUPPORT=y
|
||||||
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
CONFIG_RWSEM_XCHGADD_ALGORITHM=y
|
||||||
|
@ -90,6 +92,7 @@ CONFIG_CC_OPTIMIZE_FOR_SIZE=y
|
||||||
CONFIG_SYSCTL=y
|
CONFIG_SYSCTL=y
|
||||||
# CONFIG_EMBEDDED is not set
|
# CONFIG_EMBEDDED is not set
|
||||||
CONFIG_SYSCTL_SYSCALL=y
|
CONFIG_SYSCTL_SYSCALL=y
|
||||||
|
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||||
CONFIG_KALLSYMS=y
|
CONFIG_KALLSYMS=y
|
||||||
CONFIG_KALLSYMS_ALL=y
|
CONFIG_KALLSYMS_ALL=y
|
||||||
CONFIG_KALLSYMS_EXTRA_PASS=y
|
CONFIG_KALLSYMS_EXTRA_PASS=y
|
||||||
|
@ -117,12 +120,15 @@ CONFIG_HAVE_OPROFILE=y
|
||||||
# CONFIG_KPROBES is not set
|
# CONFIG_KPROBES is not set
|
||||||
CONFIG_HAVE_KPROBES=y
|
CONFIG_HAVE_KPROBES=y
|
||||||
CONFIG_HAVE_KRETPROBES=y
|
CONFIG_HAVE_KRETPROBES=y
|
||||||
|
CONFIG_HAVE_DMA_ATTRS=y
|
||||||
|
CONFIG_USE_GENERIC_SMP_HELPERS=y
|
||||||
CONFIG_PROC_PAGE_MONITOR=y
|
CONFIG_PROC_PAGE_MONITOR=y
|
||||||
CONFIG_SLABINFO=y
|
CONFIG_SLABINFO=y
|
||||||
CONFIG_RT_MUTEXES=y
|
CONFIG_RT_MUTEXES=y
|
||||||
# CONFIG_TINY_SHMEM is not set
|
# CONFIG_TINY_SHMEM is not set
|
||||||
CONFIG_BASE_SMALL=0
|
CONFIG_BASE_SMALL=0
|
||||||
CONFIG_MODULES=y
|
CONFIG_MODULES=y
|
||||||
|
# CONFIG_MODULE_FORCE_LOAD is not set
|
||||||
CONFIG_MODULE_UNLOAD=y
|
CONFIG_MODULE_UNLOAD=y
|
||||||
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
# CONFIG_MODULE_FORCE_UNLOAD is not set
|
||||||
# CONFIG_MODVERSIONS is not set
|
# CONFIG_MODVERSIONS is not set
|
||||||
|
@ -132,6 +138,7 @@ CONFIG_STOP_MACHINE=y
|
||||||
CONFIG_BLOCK=y
|
CONFIG_BLOCK=y
|
||||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||||
CONFIG_BLK_DEV_BSG=y
|
CONFIG_BLK_DEV_BSG=y
|
||||||
|
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||||
CONFIG_BLOCK_COMPAT=y
|
CONFIG_BLOCK_COMPAT=y
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -152,13 +159,8 @@ CONFIG_CLASSIC_RCU=y
|
||||||
# Platform support
|
# Platform support
|
||||||
#
|
#
|
||||||
CONFIG_PPC_MULTIPLATFORM=y
|
CONFIG_PPC_MULTIPLATFORM=y
|
||||||
# CONFIG_PPC_82xx is not set
|
|
||||||
# CONFIG_PPC_83xx is not set
|
|
||||||
# CONFIG_PPC_86xx is not set
|
|
||||||
# CONFIG_PPC_PSERIES is not set
|
# CONFIG_PPC_PSERIES is not set
|
||||||
# CONFIG_PPC_ISERIES is not set
|
# CONFIG_PPC_ISERIES is not set
|
||||||
# CONFIG_PPC_MPC512x is not set
|
|
||||||
# CONFIG_PPC_MPC5121 is not set
|
|
||||||
# CONFIG_PPC_PMAC is not set
|
# CONFIG_PPC_PMAC is not set
|
||||||
# CONFIG_PPC_MAPLE is not set
|
# CONFIG_PPC_MAPLE is not set
|
||||||
# CONFIG_PPC_PASEMI is not set
|
# CONFIG_PPC_PASEMI is not set
|
||||||
|
@ -187,6 +189,7 @@ CONFIG_PPC_CELL=y
|
||||||
# Cell Broadband Engine options
|
# Cell Broadband Engine options
|
||||||
#
|
#
|
||||||
CONFIG_SPU_FS=y
|
CONFIG_SPU_FS=y
|
||||||
|
CONFIG_SPU_FS_64K_LS=y
|
||||||
CONFIG_SPU_BASE=y
|
CONFIG_SPU_BASE=y
|
||||||
# CONFIG_PQ2ADS is not set
|
# CONFIG_PQ2ADS is not set
|
||||||
# CONFIG_IPIC is not set
|
# CONFIG_IPIC is not set
|
||||||
|
@ -222,6 +225,7 @@ CONFIG_PREEMPT_NONE=y
|
||||||
CONFIG_BINFMT_ELF=y
|
CONFIG_BINFMT_ELF=y
|
||||||
CONFIG_COMPAT_BINFMT_ELF=y
|
CONFIG_COMPAT_BINFMT_ELF=y
|
||||||
CONFIG_BINFMT_MISC=y
|
CONFIG_BINFMT_MISC=y
|
||||||
|
CONFIG_HUGETLB_PAGE_SIZE_VARIABLE=y
|
||||||
# CONFIG_IOMMU_VMERGE is not set
|
# CONFIG_IOMMU_VMERGE is not set
|
||||||
CONFIG_IOMMU_HELPER=y
|
CONFIG_IOMMU_HELPER=y
|
||||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||||
|
@ -248,18 +252,22 @@ CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
|
||||||
# CONFIG_SPARSEMEM_VMEMMAP is not set
|
# CONFIG_SPARSEMEM_VMEMMAP is not set
|
||||||
CONFIG_MEMORY_HOTPLUG=y
|
CONFIG_MEMORY_HOTPLUG=y
|
||||||
CONFIG_MEMORY_HOTPLUG_SPARSE=y
|
CONFIG_MEMORY_HOTPLUG_SPARSE=y
|
||||||
|
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||||
CONFIG_RESOURCES_64BIT=y
|
CONFIG_RESOURCES_64BIT=y
|
||||||
CONFIG_ZONE_DMA_FLAG=1
|
CONFIG_ZONE_DMA_FLAG=1
|
||||||
CONFIG_BOUNCE=y
|
CONFIG_BOUNCE=y
|
||||||
CONFIG_ARCH_MEMORY_PROBE=y
|
CONFIG_ARCH_MEMORY_PROBE=y
|
||||||
# CONFIG_PPC_HAS_HASH_64K is not set
|
CONFIG_PPC_HAS_HASH_64K=y
|
||||||
# CONFIG_PPC_64K_PAGES is not set
|
# CONFIG_PPC_64K_PAGES is not set
|
||||||
CONFIG_FORCE_MAX_ZONEORDER=13
|
CONFIG_FORCE_MAX_ZONEORDER=13
|
||||||
# CONFIG_SCHED_SMT is not set
|
CONFIG_SCHED_SMT=y
|
||||||
CONFIG_PROC_DEVICETREE=y
|
CONFIG_PROC_DEVICETREE=y
|
||||||
# CONFIG_CMDLINE_BOOL is not set
|
# CONFIG_CMDLINE_BOOL is not set
|
||||||
# CONFIG_PM is not set
|
CONFIG_EXTRA_TARGETS=""
|
||||||
|
CONFIG_PM=y
|
||||||
|
CONFIG_PM_DEBUG=y
|
||||||
|
# CONFIG_PM_VERBOSE is not set
|
||||||
# CONFIG_SECCOMP is not set
|
# CONFIG_SECCOMP is not set
|
||||||
CONFIG_ISA_DMA_API=y
|
CONFIG_ISA_DMA_API=y
|
||||||
|
|
||||||
|
@ -273,6 +281,7 @@ CONFIG_GENERIC_ISA_DMA=y
|
||||||
# CONFIG_PCI_SYSCALL is not set
|
# CONFIG_PCI_SYSCALL is not set
|
||||||
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
# CONFIG_ARCH_SUPPORTS_MSI is not set
|
||||||
# CONFIG_PCCARD is not set
|
# CONFIG_PCCARD is not set
|
||||||
|
# CONFIG_HAS_RAPIDIO is not set
|
||||||
CONFIG_PAGE_OFFSET=0xc000000000000000
|
CONFIG_PAGE_OFFSET=0xc000000000000000
|
||||||
CONFIG_KERNEL_START=0xc000000000000000
|
CONFIG_KERNEL_START=0xc000000000000000
|
||||||
CONFIG_PHYSICAL_START=0x00000000
|
CONFIG_PHYSICAL_START=0x00000000
|
||||||
|
@ -412,6 +421,8 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||||
CONFIG_STANDALONE=y
|
CONFIG_STANDALONE=y
|
||||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||||
CONFIG_FW_LOADER=m
|
CONFIG_FW_LOADER=m
|
||||||
|
# CONFIG_FIRMWARE_IN_KERNEL is not set
|
||||||
|
CONFIG_EXTRA_FIRMWARE=""
|
||||||
# CONFIG_DEBUG_DRIVER is not set
|
# CONFIG_DEBUG_DRIVER is not set
|
||||||
# CONFIG_DEBUG_DEVRES is not set
|
# CONFIG_DEBUG_DEVRES is not set
|
||||||
# CONFIG_SYS_HYPERVISOR is not set
|
# CONFIG_SYS_HYPERVISOR is not set
|
||||||
|
@ -478,6 +489,7 @@ CONFIG_SCSI_WAIT_SCAN=m
|
||||||
# CONFIG_SCSI_SAS_LIBSAS is not set
|
# CONFIG_SCSI_SAS_LIBSAS is not set
|
||||||
# CONFIG_SCSI_SRP_ATTRS is not set
|
# CONFIG_SCSI_SRP_ATTRS is not set
|
||||||
# CONFIG_SCSI_LOWLEVEL is not set
|
# CONFIG_SCSI_LOWLEVEL is not set
|
||||||
|
# CONFIG_SCSI_DH is not set
|
||||||
# CONFIG_ATA is not set
|
# CONFIG_ATA is not set
|
||||||
# CONFIG_MD is not set
|
# CONFIG_MD is not set
|
||||||
# CONFIG_MACINTOSH_DRIVERS is not set
|
# CONFIG_MACINTOSH_DRIVERS is not set
|
||||||
|
@ -533,8 +545,18 @@ CONFIG_USB_NET_MCS7830=m
|
||||||
# CONFIG_USB_NET_CDC_SUBSET is not set
|
# CONFIG_USB_NET_CDC_SUBSET is not set
|
||||||
# CONFIG_USB_NET_ZAURUS is not set
|
# CONFIG_USB_NET_ZAURUS is not set
|
||||||
# CONFIG_WAN is not set
|
# CONFIG_WAN is not set
|
||||||
# CONFIG_PPP is not set
|
CONFIG_PPP=m
|
||||||
|
CONFIG_PPP_MULTILINK=y
|
||||||
|
# CONFIG_PPP_FILTER is not set
|
||||||
|
CONFIG_PPP_ASYNC=m
|
||||||
|
# CONFIG_PPP_SYNC_TTY is not set
|
||||||
|
CONFIG_PPP_DEFLATE=m
|
||||||
|
# CONFIG_PPP_BSDCOMP is not set
|
||||||
|
# CONFIG_PPP_MPPE is not set
|
||||||
|
CONFIG_PPPOE=m
|
||||||
|
# CONFIG_PPPOL2TP is not set
|
||||||
# CONFIG_SLIP is not set
|
# CONFIG_SLIP is not set
|
||||||
|
CONFIG_SLHC=m
|
||||||
# CONFIG_NETCONSOLE is not set
|
# CONFIG_NETCONSOLE is not set
|
||||||
# CONFIG_NETPOLL is not set
|
# CONFIG_NETPOLL is not set
|
||||||
# CONFIG_NET_POLL_CONTROLLER is not set
|
# CONFIG_NET_POLL_CONTROLLER is not set
|
||||||
|
@ -603,6 +625,7 @@ CONFIG_VT=y
|
||||||
CONFIG_VT_CONSOLE=y
|
CONFIG_VT_CONSOLE=y
|
||||||
CONFIG_HW_CONSOLE=y
|
CONFIG_HW_CONSOLE=y
|
||||||
CONFIG_VT_HW_CONSOLE_BINDING=y
|
CONFIG_VT_HW_CONSOLE_BINDING=y
|
||||||
|
CONFIG_DEVKMEM=y
|
||||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -618,23 +641,17 @@ CONFIG_LEGACY_PTYS=y
|
||||||
CONFIG_LEGACY_PTY_COUNT=16
|
CONFIG_LEGACY_PTY_COUNT=16
|
||||||
# CONFIG_IPMI_HANDLER is not set
|
# CONFIG_IPMI_HANDLER is not set
|
||||||
# CONFIG_HW_RANDOM is not set
|
# CONFIG_HW_RANDOM is not set
|
||||||
CONFIG_GEN_RTC=y
|
|
||||||
# CONFIG_GEN_RTC_X is not set
|
|
||||||
# CONFIG_R3964 is not set
|
# CONFIG_R3964 is not set
|
||||||
# CONFIG_RAW_DRIVER is not set
|
# CONFIG_RAW_DRIVER is not set
|
||||||
# CONFIG_HANGCHECK_TIMER is not set
|
# CONFIG_HANGCHECK_TIMER is not set
|
||||||
# CONFIG_TCG_TPM is not set
|
# CONFIG_TCG_TPM is not set
|
||||||
# CONFIG_I2C is not set
|
# CONFIG_I2C is not set
|
||||||
|
|
||||||
#
|
|
||||||
# SPI support
|
|
||||||
#
|
|
||||||
# CONFIG_SPI is not set
|
# CONFIG_SPI is not set
|
||||||
# CONFIG_SPI_MASTER is not set
|
|
||||||
# CONFIG_W1 is not set
|
# CONFIG_W1 is not set
|
||||||
# CONFIG_POWER_SUPPLY is not set
|
# CONFIG_POWER_SUPPLY is not set
|
||||||
# CONFIG_HWMON is not set
|
# CONFIG_HWMON is not set
|
||||||
# CONFIG_THERMAL is not set
|
# CONFIG_THERMAL is not set
|
||||||
|
# CONFIG_THERMAL_HWMON is not set
|
||||||
# CONFIG_WATCHDOG is not set
|
# CONFIG_WATCHDOG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -652,8 +669,17 @@ CONFIG_SSB_POSSIBLE=y
|
||||||
#
|
#
|
||||||
# Multimedia devices
|
# Multimedia devices
|
||||||
#
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Multimedia core support
|
||||||
|
#
|
||||||
# CONFIG_VIDEO_DEV is not set
|
# CONFIG_VIDEO_DEV is not set
|
||||||
# CONFIG_DVB_CORE is not set
|
# CONFIG_DVB_CORE is not set
|
||||||
|
# CONFIG_VIDEO_MEDIA is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Multimedia drivers
|
||||||
|
#
|
||||||
# CONFIG_DAB is not set
|
# CONFIG_DAB is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -671,8 +697,8 @@ CONFIG_FB=y
|
||||||
CONFIG_FB_SYS_FILLRECT=y
|
CONFIG_FB_SYS_FILLRECT=y
|
||||||
CONFIG_FB_SYS_COPYAREA=y
|
CONFIG_FB_SYS_COPYAREA=y
|
||||||
CONFIG_FB_SYS_IMAGEBLIT=y
|
CONFIG_FB_SYS_IMAGEBLIT=y
|
||||||
|
# CONFIG_FB_FOREIGN_ENDIAN is not set
|
||||||
CONFIG_FB_SYS_FOPS=y
|
CONFIG_FB_SYS_FOPS=y
|
||||||
CONFIG_FB_DEFERRED_IO=y
|
|
||||||
# CONFIG_FB_SVGALIB is not set
|
# CONFIG_FB_SVGALIB is not set
|
||||||
# CONFIG_FB_MACMODES is not set
|
# CONFIG_FB_MACMODES is not set
|
||||||
# CONFIG_FB_BACKLIGHT is not set
|
# CONFIG_FB_BACKLIGHT is not set
|
||||||
|
@ -712,18 +738,12 @@ CONFIG_FB_LOGO_EXTRA=y
|
||||||
# CONFIG_LOGO_LINUX_MONO is not set
|
# CONFIG_LOGO_LINUX_MONO is not set
|
||||||
# CONFIG_LOGO_LINUX_VGA16 is not set
|
# CONFIG_LOGO_LINUX_VGA16 is not set
|
||||||
CONFIG_LOGO_LINUX_CLUT224=y
|
CONFIG_LOGO_LINUX_CLUT224=y
|
||||||
|
|
||||||
#
|
|
||||||
# Sound
|
|
||||||
#
|
|
||||||
CONFIG_SOUND=m
|
CONFIG_SOUND=m
|
||||||
|
|
||||||
#
|
|
||||||
# Advanced Linux Sound Architecture
|
|
||||||
#
|
|
||||||
CONFIG_SND=m
|
CONFIG_SND=m
|
||||||
CONFIG_SND_TIMER=m
|
CONFIG_SND_TIMER=m
|
||||||
CONFIG_SND_PCM=m
|
CONFIG_SND_PCM=m
|
||||||
|
CONFIG_SND_HWDEP=m
|
||||||
|
CONFIG_SND_RAWMIDI=m
|
||||||
# CONFIG_SND_SEQUENCER is not set
|
# CONFIG_SND_SEQUENCER is not set
|
||||||
# CONFIG_SND_MIXER_OSS is not set
|
# CONFIG_SND_MIXER_OSS is not set
|
||||||
# CONFIG_SND_PCM_OSS is not set
|
# CONFIG_SND_PCM_OSS is not set
|
||||||
|
@ -732,53 +752,20 @@ CONFIG_SND_SUPPORT_OLD_API=y
|
||||||
CONFIG_SND_VERBOSE_PROCFS=y
|
CONFIG_SND_VERBOSE_PROCFS=y
|
||||||
# CONFIG_SND_VERBOSE_PRINTK is not set
|
# CONFIG_SND_VERBOSE_PRINTK is not set
|
||||||
# CONFIG_SND_DEBUG is not set
|
# CONFIG_SND_DEBUG is not set
|
||||||
|
# CONFIG_SND_DRIVERS is not set
|
||||||
#
|
CONFIG_SND_PPC=y
|
||||||
# Generic devices
|
|
||||||
#
|
|
||||||
# CONFIG_SND_DUMMY is not set
|
|
||||||
# CONFIG_SND_MTPAV is not set
|
|
||||||
# CONFIG_SND_SERIAL_U16550 is not set
|
|
||||||
# CONFIG_SND_MPU401 is not set
|
|
||||||
|
|
||||||
#
|
|
||||||
# ALSA PowerMac devices
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# ALSA PowerMac requires I2C
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# ALSA PowerPC devices
|
|
||||||
#
|
|
||||||
CONFIG_SND_PS3=m
|
CONFIG_SND_PS3=m
|
||||||
CONFIG_SND_PS3_DEFAULT_START_DELAY=2000
|
CONFIG_SND_PS3_DEFAULT_START_DELAY=2000
|
||||||
|
CONFIG_SND_USB=y
|
||||||
#
|
CONFIG_SND_USB_AUDIO=m
|
||||||
# USB devices
|
|
||||||
#
|
|
||||||
# CONFIG_SND_USB_AUDIO is not set
|
|
||||||
# CONFIG_SND_USB_USX2Y is not set
|
# CONFIG_SND_USB_USX2Y is not set
|
||||||
# CONFIG_SND_USB_CAIAQ is not set
|
# CONFIG_SND_USB_CAIAQ is not set
|
||||||
|
|
||||||
#
|
|
||||||
# System on Chip audio support
|
|
||||||
#
|
|
||||||
# CONFIG_SND_SOC is not set
|
# CONFIG_SND_SOC is not set
|
||||||
|
|
||||||
#
|
|
||||||
# ALSA SoC audio for Freescale SOCs
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
|
||||||
# Open Sound System
|
|
||||||
#
|
|
||||||
# CONFIG_SOUND_PRIME is not set
|
# CONFIG_SOUND_PRIME is not set
|
||||||
CONFIG_HID_SUPPORT=y
|
CONFIG_HID_SUPPORT=y
|
||||||
CONFIG_HID=y
|
CONFIG_HID=y
|
||||||
# CONFIG_HID_DEBUG is not set
|
# CONFIG_HID_DEBUG is not set
|
||||||
# CONFIG_HIDRAW is not set
|
CONFIG_HIDRAW=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB Input Devices
|
# USB Input Devices
|
||||||
|
@ -807,17 +794,20 @@ CONFIG_USB=m
|
||||||
CONFIG_USB_DEVICEFS=y
|
CONFIG_USB_DEVICEFS=y
|
||||||
# CONFIG_USB_DEVICE_CLASS is not set
|
# CONFIG_USB_DEVICE_CLASS is not set
|
||||||
# CONFIG_USB_DYNAMIC_MINORS is not set
|
# CONFIG_USB_DYNAMIC_MINORS is not set
|
||||||
|
CONFIG_USB_SUSPEND=y
|
||||||
# CONFIG_USB_OTG is not set
|
# CONFIG_USB_OTG is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB Host Controller Drivers
|
# USB Host Controller Drivers
|
||||||
#
|
#
|
||||||
|
# CONFIG_USB_C67X00_HCD is not set
|
||||||
CONFIG_USB_EHCI_HCD=m
|
CONFIG_USB_EHCI_HCD=m
|
||||||
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
|
# CONFIG_USB_EHCI_ROOT_HUB_TT is not set
|
||||||
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
|
# CONFIG_USB_EHCI_TT_NEWSCHED is not set
|
||||||
CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
|
CONFIG_USB_EHCI_BIG_ENDIAN_MMIO=y
|
||||||
# CONFIG_USB_EHCI_HCD_PPC_OF is not set
|
# CONFIG_USB_EHCI_HCD_PPC_OF is not set
|
||||||
# CONFIG_USB_ISP116X_HCD is not set
|
# CONFIG_USB_ISP116X_HCD is not set
|
||||||
|
# CONFIG_USB_ISP1760_HCD is not set
|
||||||
CONFIG_USB_OHCI_HCD=m
|
CONFIG_USB_OHCI_HCD=m
|
||||||
# CONFIG_USB_OHCI_HCD_PPC_OF is not set
|
# CONFIG_USB_OHCI_HCD_PPC_OF is not set
|
||||||
# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
|
# CONFIG_USB_OHCI_BIG_ENDIAN_DESC is not set
|
||||||
|
@ -831,6 +821,7 @@ CONFIG_USB_OHCI_LITTLE_ENDIAN=y
|
||||||
#
|
#
|
||||||
# CONFIG_USB_ACM is not set
|
# CONFIG_USB_ACM is not set
|
||||||
# CONFIG_USB_PRINTER is not set
|
# CONFIG_USB_PRINTER is not set
|
||||||
|
# CONFIG_USB_WDM is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support'
|
||||||
|
@ -890,12 +881,45 @@ CONFIG_USB_MON=y
|
||||||
# CONFIG_USB_TRANCEVIBRATOR is not set
|
# CONFIG_USB_TRANCEVIBRATOR is not set
|
||||||
# CONFIG_USB_IOWARRIOR is not set
|
# CONFIG_USB_IOWARRIOR is not set
|
||||||
# CONFIG_USB_TEST is not set
|
# CONFIG_USB_TEST is not set
|
||||||
|
# CONFIG_USB_ISIGHTFW is not set
|
||||||
# CONFIG_USB_GADGET is not set
|
# CONFIG_USB_GADGET is not set
|
||||||
# CONFIG_MMC is not set
|
# CONFIG_MMC is not set
|
||||||
# CONFIG_MEMSTICK is not set
|
# CONFIG_MEMSTICK is not set
|
||||||
# CONFIG_NEW_LEDS is not set
|
# CONFIG_NEW_LEDS is not set
|
||||||
|
# CONFIG_ACCESSIBILITY is not set
|
||||||
# CONFIG_EDAC is not set
|
# CONFIG_EDAC is not set
|
||||||
# CONFIG_RTC_CLASS is not set
|
CONFIG_RTC_LIB=m
|
||||||
|
CONFIG_RTC_CLASS=m
|
||||||
|
|
||||||
|
#
|
||||||
|
# RTC interfaces
|
||||||
|
#
|
||||||
|
CONFIG_RTC_INTF_SYSFS=y
|
||||||
|
CONFIG_RTC_INTF_PROC=y
|
||||||
|
CONFIG_RTC_INTF_DEV=y
|
||||||
|
# CONFIG_RTC_INTF_DEV_UIE_EMUL is not set
|
||||||
|
# CONFIG_RTC_DRV_TEST is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# SPI RTC drivers
|
||||||
|
#
|
||||||
|
|
||||||
|
#
|
||||||
|
# Platform RTC drivers
|
||||||
|
#
|
||||||
|
# CONFIG_RTC_DRV_CMOS is not set
|
||||||
|
# CONFIG_RTC_DRV_DS1511 is not set
|
||||||
|
# CONFIG_RTC_DRV_DS1553 is not set
|
||||||
|
# CONFIG_RTC_DRV_DS1742 is not set
|
||||||
|
# CONFIG_RTC_DRV_STK17TA8 is not set
|
||||||
|
# CONFIG_RTC_DRV_M48T86 is not set
|
||||||
|
# CONFIG_RTC_DRV_M48T59 is not set
|
||||||
|
# CONFIG_RTC_DRV_V3020 is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# on-CPU RTC drivers
|
||||||
|
#
|
||||||
|
CONFIG_RTC_DRV_PPC=m
|
||||||
# CONFIG_DMADEVICES is not set
|
# CONFIG_DMADEVICES is not set
|
||||||
# CONFIG_UIO is not set
|
# CONFIG_UIO is not set
|
||||||
|
|
||||||
|
@ -911,6 +935,7 @@ CONFIG_EXT3_FS_XATTR=y
|
||||||
# CONFIG_EXT3_FS_SECURITY is not set
|
# CONFIG_EXT3_FS_SECURITY is not set
|
||||||
# CONFIG_EXT4DEV_FS is not set
|
# CONFIG_EXT4DEV_FS is not set
|
||||||
CONFIG_JBD=y
|
CONFIG_JBD=y
|
||||||
|
# CONFIG_JBD_DEBUG is not set
|
||||||
CONFIG_FS_MBCACHE=y
|
CONFIG_FS_MBCACHE=y
|
||||||
# CONFIG_REISERFS_FS is not set
|
# CONFIG_REISERFS_FS is not set
|
||||||
# CONFIG_JFS_FS is not set
|
# CONFIG_JFS_FS is not set
|
||||||
|
@ -959,8 +984,8 @@ CONFIG_PROC_SYSCTL=y
|
||||||
CONFIG_SYSFS=y
|
CONFIG_SYSFS=y
|
||||||
CONFIG_TMPFS=y
|
CONFIG_TMPFS=y
|
||||||
# CONFIG_TMPFS_POSIX_ACL is not set
|
# CONFIG_TMPFS_POSIX_ACL is not set
|
||||||
# CONFIG_HUGETLBFS is not set
|
CONFIG_HUGETLBFS=y
|
||||||
# CONFIG_HUGETLB_PAGE is not set
|
CONFIG_HUGETLB_PAGE=y
|
||||||
# CONFIG_CONFIGFS_FS is not set
|
# CONFIG_CONFIGFS_FS is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
|
@ -1059,12 +1084,15 @@ CONFIG_NLS_ISO8859_1=y
|
||||||
#
|
#
|
||||||
CONFIG_BITREVERSE=y
|
CONFIG_BITREVERSE=y
|
||||||
# CONFIG_GENERIC_FIND_FIRST_BIT is not set
|
# CONFIG_GENERIC_FIND_FIRST_BIT is not set
|
||||||
# CONFIG_CRC_CCITT is not set
|
CONFIG_CRC_CCITT=m
|
||||||
# CONFIG_CRC16 is not set
|
# CONFIG_CRC16 is not set
|
||||||
|
# CONFIG_CRC_T10DIF is not set
|
||||||
CONFIG_CRC_ITU_T=m
|
CONFIG_CRC_ITU_T=m
|
||||||
CONFIG_CRC32=y
|
CONFIG_CRC32=y
|
||||||
# CONFIG_CRC7 is not set
|
# CONFIG_CRC7 is not set
|
||||||
# CONFIG_LIBCRC32C is not set
|
# CONFIG_LIBCRC32C is not set
|
||||||
|
CONFIG_ZLIB_INFLATE=m
|
||||||
|
CONFIG_ZLIB_DEFLATE=m
|
||||||
CONFIG_LZO_COMPRESS=m
|
CONFIG_LZO_COMPRESS=m
|
||||||
CONFIG_LZO_DECOMPRESS=m
|
CONFIG_LZO_DECOMPRESS=m
|
||||||
CONFIG_PLIST=y
|
CONFIG_PLIST=y
|
||||||
|
@ -1082,7 +1110,7 @@ CONFIG_ENABLE_MUST_CHECK=y
|
||||||
CONFIG_FRAME_WARN=2048
|
CONFIG_FRAME_WARN=2048
|
||||||
CONFIG_MAGIC_SYSRQ=y
|
CONFIG_MAGIC_SYSRQ=y
|
||||||
# CONFIG_UNUSED_SYMBOLS is not set
|
# CONFIG_UNUSED_SYMBOLS is not set
|
||||||
# CONFIG_DEBUG_FS is not set
|
CONFIG_DEBUG_FS=y
|
||||||
# CONFIG_HEADERS_CHECK is not set
|
# CONFIG_HEADERS_CHECK is not set
|
||||||
CONFIG_DEBUG_KERNEL=y
|
CONFIG_DEBUG_KERNEL=y
|
||||||
# CONFIG_DEBUG_SHIRQ is not set
|
# CONFIG_DEBUG_SHIRQ is not set
|
||||||
|
@ -1090,33 +1118,49 @@ CONFIG_DETECT_SOFTLOCKUP=y
|
||||||
CONFIG_SCHED_DEBUG=y
|
CONFIG_SCHED_DEBUG=y
|
||||||
# CONFIG_SCHEDSTATS is not set
|
# CONFIG_SCHEDSTATS is not set
|
||||||
# CONFIG_TIMER_STATS is not set
|
# CONFIG_TIMER_STATS is not set
|
||||||
|
# CONFIG_DEBUG_OBJECTS is not set
|
||||||
# CONFIG_DEBUG_SLAB is not set
|
# CONFIG_DEBUG_SLAB is not set
|
||||||
# CONFIG_DEBUG_RT_MUTEXES is not set
|
# CONFIG_DEBUG_RT_MUTEXES is not set
|
||||||
# CONFIG_RT_MUTEX_TESTER is not set
|
# CONFIG_RT_MUTEX_TESTER is not set
|
||||||
CONFIG_DEBUG_SPINLOCK=y
|
CONFIG_DEBUG_SPINLOCK=y
|
||||||
CONFIG_DEBUG_MUTEXES=y
|
CONFIG_DEBUG_MUTEXES=y
|
||||||
# CONFIG_DEBUG_LOCK_ALLOC is not set
|
CONFIG_DEBUG_LOCK_ALLOC=y
|
||||||
# CONFIG_PROVE_LOCKING is not set
|
CONFIG_PROVE_LOCKING=y
|
||||||
|
CONFIG_LOCKDEP=y
|
||||||
# CONFIG_LOCK_STAT is not set
|
# CONFIG_LOCK_STAT is not set
|
||||||
|
CONFIG_DEBUG_LOCKDEP=y
|
||||||
|
CONFIG_TRACE_IRQFLAGS=y
|
||||||
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
CONFIG_DEBUG_SPINLOCK_SLEEP=y
|
||||||
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
# CONFIG_DEBUG_LOCKING_API_SELFTESTS is not set
|
||||||
|
CONFIG_STACKTRACE=y
|
||||||
# CONFIG_DEBUG_KOBJECT is not set
|
# CONFIG_DEBUG_KOBJECT is not set
|
||||||
CONFIG_DEBUG_BUGVERBOSE=y
|
CONFIG_DEBUG_BUGVERBOSE=y
|
||||||
CONFIG_DEBUG_INFO=y
|
CONFIG_DEBUG_INFO=y
|
||||||
# CONFIG_DEBUG_VM is not set
|
# CONFIG_DEBUG_VM is not set
|
||||||
# CONFIG_DEBUG_WRITECOUNT is not set
|
CONFIG_DEBUG_WRITECOUNT=y
|
||||||
CONFIG_DEBUG_LIST=y
|
CONFIG_DEBUG_LIST=y
|
||||||
# CONFIG_DEBUG_SG is not set
|
# CONFIG_DEBUG_SG is not set
|
||||||
|
CONFIG_FRAME_POINTER=y
|
||||||
# CONFIG_BOOT_PRINTK_DELAY is not set
|
# CONFIG_BOOT_PRINTK_DELAY is not set
|
||||||
# CONFIG_RCU_TORTURE_TEST is not set
|
# CONFIG_RCU_TORTURE_TEST is not set
|
||||||
# CONFIG_BACKTRACE_SELF_TEST is not set
|
# CONFIG_BACKTRACE_SELF_TEST is not set
|
||||||
# CONFIG_FAULT_INJECTION is not set
|
# CONFIG_FAULT_INJECTION is not set
|
||||||
|
# CONFIG_LATENCYTOP is not set
|
||||||
|
CONFIG_HAVE_FTRACE=y
|
||||||
|
CONFIG_HAVE_DYNAMIC_FTRACE=y
|
||||||
|
# CONFIG_FTRACE is not set
|
||||||
|
# CONFIG_IRQSOFF_TRACER is not set
|
||||||
|
# CONFIG_SCHED_TRACER is not set
|
||||||
|
# CONFIG_CONTEXT_SWITCH_TRACER is not set
|
||||||
# CONFIG_SAMPLES is not set
|
# CONFIG_SAMPLES is not set
|
||||||
CONFIG_DEBUG_STACKOVERFLOW=y
|
CONFIG_DEBUG_STACKOVERFLOW=y
|
||||||
# CONFIG_DEBUG_STACK_USAGE is not set
|
# CONFIG_DEBUG_STACK_USAGE is not set
|
||||||
# CONFIG_DEBUG_PAGEALLOC is not set
|
# CONFIG_DEBUG_PAGEALLOC is not set
|
||||||
# CONFIG_DEBUGGER is not set
|
# CONFIG_DEBUGGER is not set
|
||||||
|
# CONFIG_CODE_PATCHING_SELFTEST is not set
|
||||||
|
# CONFIG_FTR_FIXUP_SELFTEST is not set
|
||||||
CONFIG_IRQSTACKS=y
|
CONFIG_IRQSTACKS=y
|
||||||
|
# CONFIG_VIRQ_DEBUG is not set
|
||||||
# CONFIG_BOOTX_TEXT is not set
|
# CONFIG_BOOTX_TEXT is not set
|
||||||
# CONFIG_PPC_EARLY_DEBUG is not set
|
# CONFIG_PPC_EARLY_DEBUG is not set
|
||||||
|
|
||||||
|
@ -1172,6 +1216,10 @@ CONFIG_CRYPTO_PCBC=m
|
||||||
# CONFIG_CRYPTO_MD4 is not set
|
# CONFIG_CRYPTO_MD4 is not set
|
||||||
CONFIG_CRYPTO_MD5=y
|
CONFIG_CRYPTO_MD5=y
|
||||||
CONFIG_CRYPTO_MICHAEL_MIC=m
|
CONFIG_CRYPTO_MICHAEL_MIC=m
|
||||||
|
# CONFIG_CRYPTO_RMD128 is not set
|
||||||
|
# CONFIG_CRYPTO_RMD160 is not set
|
||||||
|
# CONFIG_CRYPTO_RMD256 is not set
|
||||||
|
# CONFIG_CRYPTO_RMD320 is not set
|
||||||
# CONFIG_CRYPTO_SHA1 is not set
|
# CONFIG_CRYPTO_SHA1 is not set
|
||||||
# CONFIG_CRYPTO_SHA256 is not set
|
# CONFIG_CRYPTO_SHA256 is not set
|
||||||
# CONFIG_CRYPTO_SHA512 is not set
|
# CONFIG_CRYPTO_SHA512 is not set
|
||||||
|
|
|
@ -355,6 +355,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||||
.icache_bsize = 128,
|
.icache_bsize = 128,
|
||||||
.dcache_bsize = 128,
|
.dcache_bsize = 128,
|
||||||
.machine_check = machine_check_generic,
|
.machine_check = machine_check_generic,
|
||||||
|
.oprofile_cpu_type = "ppc64/compat-power5+",
|
||||||
.platform = "power5+",
|
.platform = "power5+",
|
||||||
},
|
},
|
||||||
{ /* Power6 */
|
{ /* Power6 */
|
||||||
|
@ -386,6 +387,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||||
.icache_bsize = 128,
|
.icache_bsize = 128,
|
||||||
.dcache_bsize = 128,
|
.dcache_bsize = 128,
|
||||||
.machine_check = machine_check_generic,
|
.machine_check = machine_check_generic,
|
||||||
|
.oprofile_cpu_type = "ppc64/compat-power6",
|
||||||
.platform = "power6",
|
.platform = "power6",
|
||||||
},
|
},
|
||||||
{ /* 2.06-compliant processor, i.e. Power7 "architected" mode */
|
{ /* 2.06-compliant processor, i.e. Power7 "architected" mode */
|
||||||
|
@ -397,6 +399,7 @@ static struct cpu_spec __initdata cpu_specs[] = {
|
||||||
.icache_bsize = 128,
|
.icache_bsize = 128,
|
||||||
.dcache_bsize = 128,
|
.dcache_bsize = 128,
|
||||||
.machine_check = machine_check_generic,
|
.machine_check = machine_check_generic,
|
||||||
|
.oprofile_cpu_type = "ppc64/compat-power7",
|
||||||
.platform = "power7",
|
.platform = "power7",
|
||||||
},
|
},
|
||||||
{ /* Power7 */
|
{ /* Power7 */
|
||||||
|
@ -1629,6 +1632,23 @@ struct cpu_spec * __init identify_cpu(unsigned long offset, unsigned int pvr)
|
||||||
t->cpu_setup = s->cpu_setup;
|
t->cpu_setup = s->cpu_setup;
|
||||||
t->cpu_restore = s->cpu_restore;
|
t->cpu_restore = s->cpu_restore;
|
||||||
t->platform = s->platform;
|
t->platform = s->platform;
|
||||||
|
/*
|
||||||
|
* If we have passed through this logic once
|
||||||
|
* before and have pulled the default case
|
||||||
|
* because the real PVR was not found inside
|
||||||
|
* cpu_specs[], then we are possibly running in
|
||||||
|
* compatibility mode. In that case, let the
|
||||||
|
* oprofiler know which set of compatibility
|
||||||
|
* counters to pull from by making sure the
|
||||||
|
* oprofile_cpu_type string is set to that of
|
||||||
|
* compatibility mode. If the oprofile_cpu_type
|
||||||
|
* already has a value, then we are possibly
|
||||||
|
* overriding a real PVR with a logical one, and,
|
||||||
|
* in that case, keep the current value for
|
||||||
|
* oprofile_cpu_type.
|
||||||
|
*/
|
||||||
|
if (t->oprofile_cpu_type == NULL)
|
||||||
|
t->oprofile_cpu_type = s->oprofile_cpu_type;
|
||||||
} else
|
} else
|
||||||
*t = *s;
|
*t = *s;
|
||||||
*PTRRELOC(&cur_cpu_spec) = &the_cpu_spec;
|
*PTRRELOC(&cur_cpu_spec) = &the_cpu_spec;
|
||||||
|
|
|
@ -151,16 +151,11 @@ skpinv: addi r6,r6,1 /* Increment */
|
||||||
/* Invalidate TLB0 */
|
/* Invalidate TLB0 */
|
||||||
li r6,0x04
|
li r6,0x04
|
||||||
tlbivax 0,r6
|
tlbivax 0,r6
|
||||||
#ifdef CONFIG_SMP
|
TLBSYNC
|
||||||
tlbsync
|
|
||||||
#endif
|
|
||||||
/* Invalidate TLB1 */
|
/* Invalidate TLB1 */
|
||||||
li r6,0x0c
|
li r6,0x0c
|
||||||
tlbivax 0,r6
|
tlbivax 0,r6
|
||||||
#ifdef CONFIG_SMP
|
TLBSYNC
|
||||||
tlbsync
|
|
||||||
#endif
|
|
||||||
msync
|
|
||||||
|
|
||||||
/* 3. Setup a temp mapping and jump to it */
|
/* 3. Setup a temp mapping and jump to it */
|
||||||
andi. r5, r3, 0x1 /* Find an entry not used and is non-zero */
|
andi. r5, r3, 0x1 /* Find an entry not used and is non-zero */
|
||||||
|
@ -238,10 +233,7 @@ skpinv: addi r6,r6,1 /* Increment */
|
||||||
/* Invalidate TLB1 */
|
/* Invalidate TLB1 */
|
||||||
li r9,0x0c
|
li r9,0x0c
|
||||||
tlbivax 0,r9
|
tlbivax 0,r9
|
||||||
#ifdef CONFIG_SMP
|
TLBSYNC
|
||||||
tlbsync
|
|
||||||
#endif
|
|
||||||
msync
|
|
||||||
|
|
||||||
/* 6. Setup KERNELBASE mapping in TLB1[0] */
|
/* 6. Setup KERNELBASE mapping in TLB1[0] */
|
||||||
lis r6,0x1000 /* Set MAS0(TLBSEL) = TLB1(1), ESEL = 0 */
|
lis r6,0x1000 /* Set MAS0(TLBSEL) = TLB1(1), ESEL = 0 */
|
||||||
|
@ -283,10 +275,7 @@ skpinv: addi r6,r6,1 /* Increment */
|
||||||
/* Invalidate TLB1 */
|
/* Invalidate TLB1 */
|
||||||
li r9,0x0c
|
li r9,0x0c
|
||||||
tlbivax 0,r9
|
tlbivax 0,r9
|
||||||
#ifdef CONFIG_SMP
|
TLBSYNC
|
||||||
tlbsync
|
|
||||||
#endif
|
|
||||||
msync
|
|
||||||
|
|
||||||
/* Establish the interrupt vector offsets */
|
/* Establish the interrupt vector offsets */
|
||||||
SET_IVOR(0, CriticalInput);
|
SET_IVOR(0, CriticalInput);
|
||||||
|
@ -483,90 +472,16 @@ interrupt_base:
|
||||||
|
|
||||||
/* Data Storage Interrupt */
|
/* Data Storage Interrupt */
|
||||||
START_EXCEPTION(DataStorage)
|
START_EXCEPTION(DataStorage)
|
||||||
mtspr SPRN_SPRG0, r10 /* Save some working registers */
|
NORMAL_EXCEPTION_PROLOG
|
||||||
mtspr SPRN_SPRG1, r11
|
mfspr r5,SPRN_ESR /* Grab the ESR, save it, pass arg3 */
|
||||||
mtspr SPRN_SPRG4W, r12
|
stw r5,_ESR(r11)
|
||||||
mtspr SPRN_SPRG5W, r13
|
mfspr r4,SPRN_DEAR /* Grab the DEAR, save it, pass arg2 */
|
||||||
mfcr r11
|
andis. r10,r5,(ESR_ILK|ESR_DLK)@h
|
||||||
mtspr SPRN_SPRG7W, r11
|
bne 1f
|
||||||
|
EXC_XFER_EE_LITE(0x0300, handle_page_fault)
|
||||||
/*
|
1:
|
||||||
* Check if it was a store fault, if not then bail
|
addi r3,r1,STACK_FRAME_OVERHEAD
|
||||||
* because a user tried to access a kernel or
|
EXC_XFER_EE_LITE(0x0300, CacheLockingException)
|
||||||
* read-protected page. Otherwise, get the
|
|
||||||
* offending address and handle it.
|
|
||||||
*/
|
|
||||||
mfspr r10, SPRN_ESR
|
|
||||||
andis. r10, r10, ESR_ST@h
|
|
||||||
beq 2f
|
|
||||||
|
|
||||||
mfspr r10, SPRN_DEAR /* Get faulting address */
|
|
||||||
|
|
||||||
/* If we are faulting a kernel address, we have to use the
|
|
||||||
* kernel page tables.
|
|
||||||
*/
|
|
||||||
lis r11, PAGE_OFFSET@h
|
|
||||||
cmplw 0, r10, r11
|
|
||||||
bge 2f
|
|
||||||
|
|
||||||
/* Get the PGD for the current thread */
|
|
||||||
3:
|
|
||||||
mfspr r11,SPRN_SPRG3
|
|
||||||
lwz r11,PGDIR(r11)
|
|
||||||
4:
|
|
||||||
FIND_PTE
|
|
||||||
|
|
||||||
/* Are _PAGE_USER & _PAGE_RW set & _PAGE_HWWRITE not? */
|
|
||||||
andi. r13, r11, _PAGE_RW|_PAGE_USER|_PAGE_HWWRITE
|
|
||||||
cmpwi 0, r13, _PAGE_RW|_PAGE_USER
|
|
||||||
bne 2f /* Bail if not */
|
|
||||||
|
|
||||||
/* Update 'changed'. */
|
|
||||||
ori r11, r11, _PAGE_DIRTY|_PAGE_ACCESSED|_PAGE_HWWRITE
|
|
||||||
stw r11, PTE_FLAGS_OFFSET(r12) /* Update Linux page table */
|
|
||||||
|
|
||||||
/* MAS2 not updated as the entry does exist in the tlb, this
|
|
||||||
fault taken to detect state transition (eg: COW -> DIRTY)
|
|
||||||
*/
|
|
||||||
andi. r11, r11, _PAGE_HWEXEC
|
|
||||||
rlwimi r11, r11, 31, 27, 27 /* SX <- _PAGE_HWEXEC */
|
|
||||||
ori r11, r11, (MAS3_UW|MAS3_SW|MAS3_UR|MAS3_SR)@l /* set static perms */
|
|
||||||
|
|
||||||
/* update search PID in MAS6, AS = 0 */
|
|
||||||
mfspr r12, SPRN_PID0
|
|
||||||
slwi r12, r12, 16
|
|
||||||
mtspr SPRN_MAS6, r12
|
|
||||||
|
|
||||||
/* find the TLB index that caused the fault. It has to be here. */
|
|
||||||
tlbsx 0, r10
|
|
||||||
|
|
||||||
/* only update the perm bits, assume the RPN is fine */
|
|
||||||
mfspr r12, SPRN_MAS3
|
|
||||||
rlwimi r12, r11, 0, 20, 31
|
|
||||||
mtspr SPRN_MAS3,r12
|
|
||||||
tlbwe
|
|
||||||
|
|
||||||
/* Done...restore registers and get out of here. */
|
|
||||||
mfspr r11, SPRN_SPRG7R
|
|
||||||
mtcr r11
|
|
||||||
mfspr r13, SPRN_SPRG5R
|
|
||||||
mfspr r12, SPRN_SPRG4R
|
|
||||||
mfspr r11, SPRN_SPRG1
|
|
||||||
mfspr r10, SPRN_SPRG0
|
|
||||||
rfi /* Force context change */
|
|
||||||
|
|
||||||
2:
|
|
||||||
/*
|
|
||||||
* The bailout. Restore registers to pre-exception conditions
|
|
||||||
* and call the heavyweights to help us out.
|
|
||||||
*/
|
|
||||||
mfspr r11, SPRN_SPRG7R
|
|
||||||
mtcr r11
|
|
||||||
mfspr r13, SPRN_SPRG5R
|
|
||||||
mfspr r12, SPRN_SPRG4R
|
|
||||||
mfspr r11, SPRN_SPRG1
|
|
||||||
mfspr r10, SPRN_SPRG0
|
|
||||||
b data_access
|
|
||||||
|
|
||||||
/* Instruction Storage Interrupt */
|
/* Instruction Storage Interrupt */
|
||||||
INSTRUCTION_STORAGE_EXCEPTION
|
INSTRUCTION_STORAGE_EXCEPTION
|
||||||
|
@ -645,15 +560,30 @@ interrupt_base:
|
||||||
lwz r11,PGDIR(r11)
|
lwz r11,PGDIR(r11)
|
||||||
|
|
||||||
4:
|
4:
|
||||||
|
/* Mask of required permission bits. Note that while we
|
||||||
|
* do copy ESR:ST to _PAGE_RW position as trying to write
|
||||||
|
* to an RO page is pretty common, we don't do it with
|
||||||
|
* _PAGE_DIRTY. We could do it, but it's a fairly rare
|
||||||
|
* event so I'd rather take the overhead when it happens
|
||||||
|
* rather than adding an instruction here. We should measure
|
||||||
|
* whether the whole thing is worth it in the first place
|
||||||
|
* as we could avoid loading SPRN_ESR completely in the first
|
||||||
|
* place...
|
||||||
|
*
|
||||||
|
* TODO: Is it worth doing that mfspr & rlwimi in the first
|
||||||
|
* place or can we save a couple of instructions here ?
|
||||||
|
*/
|
||||||
|
mfspr r12,SPRN_ESR
|
||||||
|
li r13,_PAGE_PRESENT|_PAGE_ACCESSED
|
||||||
|
rlwimi r13,r12,11,29,29
|
||||||
|
|
||||||
FIND_PTE
|
FIND_PTE
|
||||||
andi. r13, r11, _PAGE_PRESENT /* Is the page present? */
|
andc. r13,r13,r11 /* Check permission */
|
||||||
beq 2f /* Bail if not present */
|
bne 2f /* Bail if permission mismach */
|
||||||
|
|
||||||
#ifdef CONFIG_PTE_64BIT
|
#ifdef CONFIG_PTE_64BIT
|
||||||
lwz r13, 0(r12)
|
lwz r13, 0(r12)
|
||||||
#endif
|
#endif
|
||||||
ori r11, r11, _PAGE_ACCESSED
|
|
||||||
stw r11, PTE_FLAGS_OFFSET(r12)
|
|
||||||
|
|
||||||
/* Jump to common tlb load */
|
/* Jump to common tlb load */
|
||||||
b finish_tlb_load
|
b finish_tlb_load
|
||||||
|
@ -667,7 +597,7 @@ interrupt_base:
|
||||||
mfspr r12, SPRN_SPRG4R
|
mfspr r12, SPRN_SPRG4R
|
||||||
mfspr r11, SPRN_SPRG1
|
mfspr r11, SPRN_SPRG1
|
||||||
mfspr r10, SPRN_SPRG0
|
mfspr r10, SPRN_SPRG0
|
||||||
b data_access
|
b DataStorage
|
||||||
|
|
||||||
/* Instruction TLB Error Interrupt */
|
/* Instruction TLB Error Interrupt */
|
||||||
/*
|
/*
|
||||||
|
@ -705,15 +635,16 @@ interrupt_base:
|
||||||
lwz r11,PGDIR(r11)
|
lwz r11,PGDIR(r11)
|
||||||
|
|
||||||
4:
|
4:
|
||||||
|
/* Make up the required permissions */
|
||||||
|
li r13,_PAGE_PRESENT | _PAGE_ACCESSED | _PAGE_HWEXEC
|
||||||
|
|
||||||
FIND_PTE
|
FIND_PTE
|
||||||
andi. r13, r11, _PAGE_PRESENT /* Is the page present? */
|
andc. r13,r13,r11 /* Check permission */
|
||||||
beq 2f /* Bail if not present */
|
bne 2f /* Bail if permission mismach */
|
||||||
|
|
||||||
#ifdef CONFIG_PTE_64BIT
|
#ifdef CONFIG_PTE_64BIT
|
||||||
lwz r13, 0(r12)
|
lwz r13, 0(r12)
|
||||||
#endif
|
#endif
|
||||||
ori r11, r11, _PAGE_ACCESSED
|
|
||||||
stw r11, PTE_FLAGS_OFFSET(r12)
|
|
||||||
|
|
||||||
/* Jump to common TLB load point */
|
/* Jump to common TLB load point */
|
||||||
b finish_tlb_load
|
b finish_tlb_load
|
||||||
|
@ -768,29 +699,13 @@ interrupt_base:
|
||||||
* Local functions
|
* Local functions
|
||||||
*/
|
*/
|
||||||
|
|
||||||
/*
|
|
||||||
* Data TLB exceptions will bail out to this point
|
|
||||||
* if they can't resolve the lightweight TLB fault.
|
|
||||||
*/
|
|
||||||
data_access:
|
|
||||||
NORMAL_EXCEPTION_PROLOG
|
|
||||||
mfspr r5,SPRN_ESR /* Grab the ESR, save it, pass arg3 */
|
|
||||||
stw r5,_ESR(r11)
|
|
||||||
mfspr r4,SPRN_DEAR /* Grab the DEAR, save it, pass arg2 */
|
|
||||||
andis. r10,r5,(ESR_ILK|ESR_DLK)@h
|
|
||||||
bne 1f
|
|
||||||
EXC_XFER_EE_LITE(0x0300, handle_page_fault)
|
|
||||||
1:
|
|
||||||
addi r3,r1,STACK_FRAME_OVERHEAD
|
|
||||||
EXC_XFER_EE_LITE(0x0300, CacheLockingException)
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
||||||
* Both the instruction and data TLB miss get to this
|
* Both the instruction and data TLB miss get to this
|
||||||
* point to load the TLB.
|
* point to load the TLB.
|
||||||
* r10 - EA of fault
|
* r10 - EA of fault
|
||||||
* r11 - TLB (info from Linux PTE)
|
* r11 - TLB (info from Linux PTE)
|
||||||
* r12, r13 - available to use
|
* r12 - available to use
|
||||||
|
* r13 - upper bits of PTE (if PTE_64BIT) or available to use
|
||||||
* CR5 - results of addr >= PAGE_OFFSET
|
* CR5 - results of addr >= PAGE_OFFSET
|
||||||
* MAS0, MAS1 - loaded with proper value when we get here
|
* MAS0, MAS1 - loaded with proper value when we get here
|
||||||
* MAS2, MAS3 - will need additional info from Linux PTE
|
* MAS2, MAS3 - will need additional info from Linux PTE
|
||||||
|
@ -812,20 +727,14 @@ finish_tlb_load:
|
||||||
#endif
|
#endif
|
||||||
mtspr SPRN_MAS2, r12
|
mtspr SPRN_MAS2, r12
|
||||||
|
|
||||||
bge 5, 1f
|
li r10, (_PAGE_HWEXEC | _PAGE_PRESENT)
|
||||||
|
rlwimi r10, r11, 31, 29, 29 /* extract _PAGE_DIRTY into SW */
|
||||||
/* is user addr */
|
and r12, r11, r10
|
||||||
andi. r12, r11, (_PAGE_USER | _PAGE_HWWRITE | _PAGE_HWEXEC)
|
|
||||||
andi. r10, r11, _PAGE_USER /* Test for _PAGE_USER */
|
andi. r10, r11, _PAGE_USER /* Test for _PAGE_USER */
|
||||||
srwi r10, r12, 1
|
slwi r10, r12, 1
|
||||||
or r12, r12, r10 /* Copy user perms into supervisor */
|
or r10, r10, r12
|
||||||
iseleq r12, 0, r12
|
iseleq r12, r12, r10
|
||||||
b 2f
|
|
||||||
|
|
||||||
/* is kernel addr */
|
|
||||||
1: rlwinm r12, r11, 31, 29, 29 /* Extract _PAGE_HWWRITE into SW */
|
|
||||||
ori r12, r12, (MAS3_SX | MAS3_SR)
|
|
||||||
|
|
||||||
#ifdef CONFIG_PTE_64BIT
|
#ifdef CONFIG_PTE_64BIT
|
||||||
2: rlwimi r12, r13, 24, 0, 7 /* grab RPN[32:39] */
|
2: rlwimi r12, r13, 24, 0, 7 /* grab RPN[32:39] */
|
||||||
rlwimi r12, r11, 24, 8, 19 /* grab RPN[40:51] */
|
rlwimi r12, r11, 24, 8, 19 /* grab RPN[40:51] */
|
||||||
|
|
|
@ -186,7 +186,8 @@ static unsigned long iommu_range_alloc(struct device *dev,
|
||||||
static dma_addr_t iommu_alloc(struct device *dev, struct iommu_table *tbl,
|
static dma_addr_t iommu_alloc(struct device *dev, struct iommu_table *tbl,
|
||||||
void *page, unsigned int npages,
|
void *page, unsigned int npages,
|
||||||
enum dma_data_direction direction,
|
enum dma_data_direction direction,
|
||||||
unsigned long mask, unsigned int align_order)
|
unsigned long mask, unsigned int align_order,
|
||||||
|
struct dma_attrs *attrs)
|
||||||
{
|
{
|
||||||
unsigned long entry, flags;
|
unsigned long entry, flags;
|
||||||
dma_addr_t ret = DMA_ERROR_CODE;
|
dma_addr_t ret = DMA_ERROR_CODE;
|
||||||
|
@ -205,7 +206,7 @@ static dma_addr_t iommu_alloc(struct device *dev, struct iommu_table *tbl,
|
||||||
|
|
||||||
/* Put the TCEs in the HW table */
|
/* Put the TCEs in the HW table */
|
||||||
ppc_md.tce_build(tbl, entry, npages, (unsigned long)page & IOMMU_PAGE_MASK,
|
ppc_md.tce_build(tbl, entry, npages, (unsigned long)page & IOMMU_PAGE_MASK,
|
||||||
direction);
|
direction, attrs);
|
||||||
|
|
||||||
|
|
||||||
/* Flush/invalidate TLB caches if necessary */
|
/* Flush/invalidate TLB caches if necessary */
|
||||||
|
@ -336,7 +337,8 @@ int iommu_map_sg(struct device *dev, struct iommu_table *tbl,
|
||||||
npages, entry, dma_addr);
|
npages, entry, dma_addr);
|
||||||
|
|
||||||
/* Insert into HW table */
|
/* Insert into HW table */
|
||||||
ppc_md.tce_build(tbl, entry, npages, vaddr & IOMMU_PAGE_MASK, direction);
|
ppc_md.tce_build(tbl, entry, npages, vaddr & IOMMU_PAGE_MASK,
|
||||||
|
direction, attrs);
|
||||||
|
|
||||||
/* If we are in an open segment, try merging */
|
/* If we are in an open segment, try merging */
|
||||||
if (segstart != s) {
|
if (segstart != s) {
|
||||||
|
@ -573,7 +575,8 @@ dma_addr_t iommu_map_single(struct device *dev, struct iommu_table *tbl,
|
||||||
align = PAGE_SHIFT - IOMMU_PAGE_SHIFT;
|
align = PAGE_SHIFT - IOMMU_PAGE_SHIFT;
|
||||||
|
|
||||||
dma_handle = iommu_alloc(dev, tbl, vaddr, npages, direction,
|
dma_handle = iommu_alloc(dev, tbl, vaddr, npages, direction,
|
||||||
mask >> IOMMU_PAGE_SHIFT, align);
|
mask >> IOMMU_PAGE_SHIFT, align,
|
||||||
|
attrs);
|
||||||
if (dma_handle == DMA_ERROR_CODE) {
|
if (dma_handle == DMA_ERROR_CODE) {
|
||||||
if (printk_ratelimit()) {
|
if (printk_ratelimit()) {
|
||||||
printk(KERN_INFO "iommu_alloc failed, "
|
printk(KERN_INFO "iommu_alloc failed, "
|
||||||
|
@ -642,7 +645,7 @@ void *iommu_alloc_coherent(struct device *dev, struct iommu_table *tbl,
|
||||||
nio_pages = size >> IOMMU_PAGE_SHIFT;
|
nio_pages = size >> IOMMU_PAGE_SHIFT;
|
||||||
io_order = get_iommu_order(size);
|
io_order = get_iommu_order(size);
|
||||||
mapping = iommu_alloc(dev, tbl, ret, nio_pages, DMA_BIDIRECTIONAL,
|
mapping = iommu_alloc(dev, tbl, ret, nio_pages, DMA_BIDIRECTIONAL,
|
||||||
mask >> IOMMU_PAGE_SHIFT, io_order);
|
mask >> IOMMU_PAGE_SHIFT, io_order, NULL);
|
||||||
if (mapping == DMA_ERROR_CODE) {
|
if (mapping == DMA_ERROR_CODE) {
|
||||||
free_pages((unsigned long)ret, order);
|
free_pages((unsigned long)ret, order);
|
||||||
return NULL;
|
return NULL;
|
||||||
|
|
|
@ -598,6 +598,7 @@ void __devinit pci_process_bridge_OF_ranges(struct pci_controller *hose,
|
||||||
res->start = pci_addr;
|
res->start = pci_addr;
|
||||||
break;
|
break;
|
||||||
case 2: /* PCI Memory space */
|
case 2: /* PCI Memory space */
|
||||||
|
case 3: /* PCI 64 bits Memory space */
|
||||||
printk(KERN_INFO
|
printk(KERN_INFO
|
||||||
" MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
|
" MEM 0x%016llx..0x%016llx -> 0x%016llx %s\n",
|
||||||
cpu_addr, cpu_addr + size - 1, pci_addr,
|
cpu_addr, cpu_addr + size - 1, pci_addr,
|
||||||
|
|
|
@ -128,31 +128,6 @@ static void of_bus_pci_count_cells(struct device_node *np,
|
||||||
*sizec = 2;
|
*sizec = 2;
|
||||||
}
|
}
|
||||||
|
|
||||||
static u64 of_bus_pci_map(u32 *addr, const u32 *range, int na, int ns, int pna)
|
|
||||||
{
|
|
||||||
u64 cp, s, da;
|
|
||||||
|
|
||||||
/* Check address type match */
|
|
||||||
if ((addr[0] ^ range[0]) & 0x03000000)
|
|
||||||
return OF_BAD_ADDR;
|
|
||||||
|
|
||||||
/* Read address values, skipping high cell */
|
|
||||||
cp = of_read_number(range + 1, na - 1);
|
|
||||||
s = of_read_number(range + na + pna, ns);
|
|
||||||
da = of_read_number(addr + 1, na - 1);
|
|
||||||
|
|
||||||
DBG("OF: PCI map, cp="PRu64", s="PRu64", da="PRu64"\n", cp, s, da);
|
|
||||||
|
|
||||||
if (da < cp || da >= (cp + s))
|
|
||||||
return OF_BAD_ADDR;
|
|
||||||
return da - cp;
|
|
||||||
}
|
|
||||||
|
|
||||||
static int of_bus_pci_translate(u32 *addr, u64 offset, int na)
|
|
||||||
{
|
|
||||||
return of_bus_default_translate(addr + 1, offset, na - 1);
|
|
||||||
}
|
|
||||||
|
|
||||||
static unsigned int of_bus_pci_get_flags(const u32 *addr)
|
static unsigned int of_bus_pci_get_flags(const u32 *addr)
|
||||||
{
|
{
|
||||||
unsigned int flags = 0;
|
unsigned int flags = 0;
|
||||||
|
@ -172,6 +147,35 @@ static unsigned int of_bus_pci_get_flags(const u32 *addr)
|
||||||
return flags;
|
return flags;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static u64 of_bus_pci_map(u32 *addr, const u32 *range, int na, int ns, int pna)
|
||||||
|
{
|
||||||
|
u64 cp, s, da;
|
||||||
|
unsigned int af, rf;
|
||||||
|
|
||||||
|
af = of_bus_pci_get_flags(addr);
|
||||||
|
rf = of_bus_pci_get_flags(range);
|
||||||
|
|
||||||
|
/* Check address type match */
|
||||||
|
if ((af ^ rf) & (IORESOURCE_MEM | IORESOURCE_IO))
|
||||||
|
return OF_BAD_ADDR;
|
||||||
|
|
||||||
|
/* Read address values, skipping high cell */
|
||||||
|
cp = of_read_number(range + 1, na - 1);
|
||||||
|
s = of_read_number(range + na + pna, ns);
|
||||||
|
da = of_read_number(addr + 1, na - 1);
|
||||||
|
|
||||||
|
DBG("OF: PCI map, cp="PRu64", s="PRu64", da="PRu64"\n", cp, s, da);
|
||||||
|
|
||||||
|
if (da < cp || da >= (cp + s))
|
||||||
|
return OF_BAD_ADDR;
|
||||||
|
return da - cp;
|
||||||
|
}
|
||||||
|
|
||||||
|
static int of_bus_pci_translate(u32 *addr, u64 offset, int na)
|
||||||
|
{
|
||||||
|
return of_bus_default_translate(addr + 1, offset, na - 1);
|
||||||
|
}
|
||||||
|
|
||||||
const u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
|
const u32 *of_get_pci_address(struct device_node *dev, int bar_no, u64 *size,
|
||||||
unsigned int *flags)
|
unsigned int *flags)
|
||||||
{
|
{
|
||||||
|
|
|
@ -59,6 +59,6 @@ EXPORT_SYMBOL_GPL(save_stack_trace);
|
||||||
|
|
||||||
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
void save_stack_trace_tsk(struct task_struct *tsk, struct stack_trace *trace)
|
||||||
{
|
{
|
||||||
save_context_stack(trace, tsk->thread.regs->gpr[1], tsk, 0);
|
save_context_stack(trace, tsk->thread.ksp, tsk, 0);
|
||||||
}
|
}
|
||||||
EXPORT_SYMBOL_GPL(save_stack_trace_tsk);
|
EXPORT_SYMBOL_GPL(save_stack_trace_tsk);
|
||||||
|
|
|
@ -28,7 +28,9 @@ static DEFINE_PER_CPU(struct cpu, cpu_devices);
|
||||||
/* Time in microseconds we delay before sleeping in the idle loop */
|
/* Time in microseconds we delay before sleeping in the idle loop */
|
||||||
DEFINE_PER_CPU(unsigned long, smt_snooze_delay) = { 100 };
|
DEFINE_PER_CPU(unsigned long, smt_snooze_delay) = { 100 };
|
||||||
|
|
||||||
static ssize_t store_smt_snooze_delay(struct sys_device *dev, const char *buf,
|
static ssize_t store_smt_snooze_delay(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr,
|
||||||
|
const char *buf,
|
||||||
size_t count)
|
size_t count)
|
||||||
{
|
{
|
||||||
struct cpu *cpu = container_of(dev, struct cpu, sysdev);
|
struct cpu *cpu = container_of(dev, struct cpu, sysdev);
|
||||||
|
@ -44,7 +46,9 @@ static ssize_t store_smt_snooze_delay(struct sys_device *dev, const char *buf,
|
||||||
return count;
|
return count;
|
||||||
}
|
}
|
||||||
|
|
||||||
static ssize_t show_smt_snooze_delay(struct sys_device *dev, char *buf)
|
static ssize_t show_smt_snooze_delay(struct sys_device *dev,
|
||||||
|
struct sysdev_attribute *attr,
|
||||||
|
char *buf)
|
||||||
{
|
{
|
||||||
struct cpu *cpu = container_of(dev, struct cpu, sysdev);
|
struct cpu *cpu = container_of(dev, struct cpu, sysdev);
|
||||||
|
|
||||||
|
@ -152,14 +156,17 @@ static unsigned long write_##NAME(unsigned long val) \
|
||||||
mtspr(ADDRESS, val); \
|
mtspr(ADDRESS, val); \
|
||||||
return 0; \
|
return 0; \
|
||||||
} \
|
} \
|
||||||
static ssize_t show_##NAME(struct sys_device *dev, char *buf) \
|
static ssize_t show_##NAME(struct sys_device *dev, \
|
||||||
|
struct sysdev_attribute *attr, \
|
||||||
|
char *buf) \
|
||||||
{ \
|
{ \
|
||||||
struct cpu *cpu = container_of(dev, struct cpu, sysdev); \
|
struct cpu *cpu = container_of(dev, struct cpu, sysdev); \
|
||||||
unsigned long val = run_on_cpu(cpu->sysdev.id, read_##NAME, 0); \
|
unsigned long val = run_on_cpu(cpu->sysdev.id, read_##NAME, 0); \
|
||||||
return sprintf(buf, "%lx\n", val); \
|
return sprintf(buf, "%lx\n", val); \
|
||||||
} \
|
} \
|
||||||
static ssize_t __used \
|
static ssize_t __used \
|
||||||
store_##NAME(struct sys_device *dev, const char *buf, size_t count) \
|
store_##NAME(struct sys_device *dev, struct sysdev_attribute *attr, \
|
||||||
|
const char *buf, size_t count) \
|
||||||
{ \
|
{ \
|
||||||
struct cpu *cpu = container_of(dev, struct cpu, sysdev); \
|
struct cpu *cpu = container_of(dev, struct cpu, sysdev); \
|
||||||
unsigned long val; \
|
unsigned long val; \
|
||||||
|
|
|
@ -9,6 +9,25 @@
|
||||||
|
|
||||||
ENTRY(_stext)
|
ENTRY(_stext)
|
||||||
|
|
||||||
|
PHDRS {
|
||||||
|
kernel PT_LOAD FLAGS(7); /* RWX */
|
||||||
|
notes PT_NOTE FLAGS(0);
|
||||||
|
dummy PT_NOTE FLAGS(0);
|
||||||
|
|
||||||
|
/* binutils < 2.18 has a bug that makes it misbehave when taking an
|
||||||
|
ELF file with all segments at load address 0 as input. This
|
||||||
|
happens when running "strip" on vmlinux, because of the AT() magic
|
||||||
|
in this linker script. People using GCC >= 4.2 won't run into
|
||||||
|
this problem, because the "build-id" support will put some data
|
||||||
|
into the "notes" segment (at a non-zero load address).
|
||||||
|
|
||||||
|
To work around this, we force some data into both the "dummy"
|
||||||
|
segment and the kernel segment, so the dummy segment will get a
|
||||||
|
non-zero load address. It's not enough to always create the
|
||||||
|
"notes" segment, since if nothing gets assigned to it, its load
|
||||||
|
address will be zero. */
|
||||||
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_PPC64
|
#ifdef CONFIG_PPC64
|
||||||
OUTPUT_ARCH(powerpc:common64)
|
OUTPUT_ARCH(powerpc:common64)
|
||||||
jiffies = jiffies_64;
|
jiffies = jiffies_64;
|
||||||
|
@ -50,7 +69,7 @@ SECTIONS
|
||||||
. = ALIGN(PAGE_SIZE);
|
. = ALIGN(PAGE_SIZE);
|
||||||
_etext = .;
|
_etext = .;
|
||||||
PROVIDE32 (etext = .);
|
PROVIDE32 (etext = .);
|
||||||
}
|
} :kernel
|
||||||
|
|
||||||
/* Read-only data */
|
/* Read-only data */
|
||||||
RODATA
|
RODATA
|
||||||
|
@ -62,7 +81,13 @@ SECTIONS
|
||||||
__stop___ex_table = .;
|
__stop___ex_table = .;
|
||||||
}
|
}
|
||||||
|
|
||||||
NOTES
|
NOTES :kernel :notes
|
||||||
|
|
||||||
|
/* The dummy segment contents for the bug workaround mentioned above
|
||||||
|
near PHDRS. */
|
||||||
|
.dummy : {
|
||||||
|
LONG(0xf177)
|
||||||
|
} :kernel :dummy
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Init sections discarded at runtime
|
* Init sections discarded at runtime
|
||||||
|
@ -74,7 +99,7 @@ SECTIONS
|
||||||
_sinittext = .;
|
_sinittext = .;
|
||||||
INIT_TEXT
|
INIT_TEXT
|
||||||
_einittext = .;
|
_einittext = .;
|
||||||
}
|
} :kernel
|
||||||
|
|
||||||
/* .exit.text is discarded at runtime, not link time,
|
/* .exit.text is discarded at runtime, not link time,
|
||||||
* to deal with references from __bug_table
|
* to deal with references from __bug_table
|
||||||
|
|
|
@ -99,7 +99,7 @@ void do_feature_fixups(unsigned long value, void *fixup_start, void *fixup_end)
|
||||||
|
|
||||||
for (; fcur < fend; fcur++) {
|
for (; fcur < fend; fcur++) {
|
||||||
if (patch_feature_section(value, fcur)) {
|
if (patch_feature_section(value, fcur)) {
|
||||||
__WARN();
|
WARN_ON(1);
|
||||||
printk("Unable to patch feature section at %p - %p" \
|
printk("Unable to patch feature section at %p - %p" \
|
||||||
" with %p - %p\n",
|
" with %p - %p\n",
|
||||||
calc_addr(fcur, fcur->start_off),
|
calc_addr(fcur, fcur->start_off),
|
||||||
|
|
|
@ -13,13 +13,7 @@
|
||||||
#include <asm/ppc_asm.h>
|
#include <asm/ppc_asm.h>
|
||||||
|
|
||||||
.section __ex_table,"a"
|
.section __ex_table,"a"
|
||||||
#ifdef CONFIG_PPC64
|
PPC_LONG_ALIGN
|
||||||
.align 3
|
|
||||||
#define EXTBL .llong
|
|
||||||
#else
|
|
||||||
.align 2
|
|
||||||
#define EXTBL .long
|
|
||||||
#endif
|
|
||||||
.text
|
.text
|
||||||
|
|
||||||
_GLOBAL(strcpy)
|
_GLOBAL(strcpy)
|
||||||
|
@ -160,9 +154,9 @@ _GLOBAL(__clear_user)
|
||||||
blr
|
blr
|
||||||
|
|
||||||
.section __ex_table,"a"
|
.section __ex_table,"a"
|
||||||
EXTBL 11b,90b
|
PPC_LONG 11b,90b
|
||||||
EXTBL 1b,91b
|
PPC_LONG 1b,91b
|
||||||
EXTBL 8b,92b
|
PPC_LONG 8b,92b
|
||||||
.text
|
.text
|
||||||
|
|
||||||
_GLOBAL(__strncpy_from_user)
|
_GLOBAL(__strncpy_from_user)
|
||||||
|
@ -183,7 +177,7 @@ _GLOBAL(__strncpy_from_user)
|
||||||
blr
|
blr
|
||||||
|
|
||||||
.section __ex_table,"a"
|
.section __ex_table,"a"
|
||||||
EXTBL 1b,99b
|
PPC_LONG 1b,99b
|
||||||
.text
|
.text
|
||||||
|
|
||||||
/* r3 = str, r4 = len (> 0), r5 = top (highest addr) */
|
/* r3 = str, r4 = len (> 0), r5 = top (highest addr) */
|
||||||
|
@ -208,4 +202,4 @@ _GLOBAL(__strnlen_user)
|
||||||
blr
|
blr
|
||||||
|
|
||||||
.section __ex_table,"a"
|
.section __ex_table,"a"
|
||||||
EXTBL 1b,99b
|
PPC_LONG 1b,99b
|
||||||
|
|
|
@ -3,6 +3,7 @@ config PPC_MPC52xx
|
||||||
depends on PPC_MULTIPLATFORM && PPC32
|
depends on PPC_MULTIPLATFORM && PPC32
|
||||||
select FSL_SOC
|
select FSL_SOC
|
||||||
select PPC_CLOCK
|
select PPC_CLOCK
|
||||||
|
select PPC_PCI_CHOICE
|
||||||
|
|
||||||
config PPC_MPC5200_SIMPLE
|
config PPC_MPC5200_SIMPLE
|
||||||
bool "Generic support for simple MPC5200 based boards"
|
bool "Generic support for simple MPC5200 based boards"
|
||||||
|
|
|
@ -30,6 +30,7 @@ config EP8248E
|
||||||
select 8272
|
select 8272
|
||||||
select 8260
|
select 8260
|
||||||
select FSL_SOC
|
select FSL_SOC
|
||||||
|
select PHYLIB
|
||||||
select MDIO_BITBANG
|
select MDIO_BITBANG
|
||||||
help
|
help
|
||||||
This enables support for the Embedded Planet EP8248E board.
|
This enables support for the Embedded Planet EP8248E board.
|
||||||
|
|
|
@ -59,7 +59,6 @@ static void __init ep8248e_pic_init(void)
|
||||||
of_node_put(np);
|
of_node_put(np);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_FS_ENET_MDIO_FCC
|
|
||||||
static void ep8248e_set_mdc(struct mdiobb_ctrl *ctrl, int level)
|
static void ep8248e_set_mdc(struct mdiobb_ctrl *ctrl, int level)
|
||||||
{
|
{
|
||||||
if (level)
|
if (level)
|
||||||
|
@ -165,7 +164,6 @@ static struct of_platform_driver ep8248e_mdio_driver = {
|
||||||
.probe = ep8248e_mdio_probe,
|
.probe = ep8248e_mdio_probe,
|
||||||
.remove = ep8248e_mdio_remove,
|
.remove = ep8248e_mdio_remove,
|
||||||
};
|
};
|
||||||
#endif
|
|
||||||
|
|
||||||
struct cpm_pin {
|
struct cpm_pin {
|
||||||
int port, pin, flags;
|
int port, pin, flags;
|
||||||
|
@ -298,9 +296,7 @@ static __initdata struct of_device_id of_bus_ids[] = {
|
||||||
static int __init declare_of_platform_devices(void)
|
static int __init declare_of_platform_devices(void)
|
||||||
{
|
{
|
||||||
of_platform_bus_probe(NULL, of_bus_ids, NULL);
|
of_platform_bus_probe(NULL, of_bus_ids, NULL);
|
||||||
#ifdef CONFIG_FS_ENET_MDIO_FCC
|
|
||||||
of_register_platform_driver(&ep8248e_mdio_driver);
|
of_register_platform_driver(&ep8248e_mdio_driver);
|
||||||
#endif
|
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -2,7 +2,8 @@ menuconfig PPC_83xx
|
||||||
bool "83xx-based boards"
|
bool "83xx-based boards"
|
||||||
depends on 6xx && PPC_MULTIPLATFORM
|
depends on 6xx && PPC_MULTIPLATFORM
|
||||||
select PPC_UDBG_16550
|
select PPC_UDBG_16550
|
||||||
select PPC_INDIRECT_PCI
|
select PPC_PCI_CHOICE
|
||||||
|
select FSL_PCI if PCI
|
||||||
select FSL_SOC
|
select FSL_SOC
|
||||||
select IPIC
|
select IPIC
|
||||||
|
|
||||||
|
|
|
@ -2,7 +2,7 @@
|
||||||
# Makefile for the PowerPC 83xx linux kernel.
|
# Makefile for the PowerPC 83xx linux kernel.
|
||||||
#
|
#
|
||||||
obj-y := misc.o usb.o
|
obj-y := misc.o usb.o
|
||||||
obj-$(CONFIG_PCI) += pci.o
|
obj-$(CONFIG_SUSPEND) += suspend.o suspend-asm.o
|
||||||
obj-$(CONFIG_MPC831x_RDB) += mpc831x_rdb.o
|
obj-$(CONFIG_MPC831x_RDB) += mpc831x_rdb.o
|
||||||
obj-$(CONFIG_MPC832x_RDB) += mpc832x_rdb.o
|
obj-$(CONFIG_MPC832x_RDB) += mpc832x_rdb.o
|
||||||
obj-$(CONFIG_MPC834x_MDS) += mpc834x_mds.o
|
obj-$(CONFIG_MPC834x_MDS) += mpc834x_mds.o
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <asm/time.h>
|
#include <asm/time.h>
|
||||||
#include <asm/ipic.h>
|
#include <asm/ipic.h>
|
||||||
#include <asm/udbg.h>
|
#include <asm/udbg.h>
|
||||||
|
#include <sysdev/fsl_pci.h>
|
||||||
|
|
||||||
#include "mpc83xx.h"
|
#include "mpc83xx.h"
|
||||||
|
|
||||||
|
|
|
@ -36,6 +36,7 @@
|
||||||
#include <asm/prom.h>
|
#include <asm/prom.h>
|
||||||
#include <asm/udbg.h>
|
#include <asm/udbg.h>
|
||||||
#include <sysdev/fsl_soc.h>
|
#include <sysdev/fsl_soc.h>
|
||||||
|
#include <sysdev/fsl_pci.h>
|
||||||
#include <asm/qe.h>
|
#include <asm/qe.h>
|
||||||
#include <asm/qe_ic.h>
|
#include <asm/qe_ic.h>
|
||||||
|
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue