mirror of
https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git
synced 2024-08-26 19:00:25 +00:00
Merge with /home/shaggy/git/linus-clean/
Signed-off-by: Dave Kleikamp <shaggy@austin.ibm.com>
This commit is contained in:
commit
7078253c08
903 changed files with 37302 additions and 16674 deletions
7
CREDITS
7
CREDITS
|
@ -339,7 +339,7 @@ W: http://tomas.nocrew.org/
|
||||||
D: dsp56k device driver
|
D: dsp56k device driver
|
||||||
|
|
||||||
N: Ross Biro
|
N: Ross Biro
|
||||||
E: bir7@leland.Stanford.Edu
|
E: ross.biro@gmail.com
|
||||||
D: Original author of the Linux networking code
|
D: Original author of the Linux networking code
|
||||||
|
|
||||||
N: Anton Blanchard
|
N: Anton Blanchard
|
||||||
|
@ -882,13 +882,12 @@ S: Blacksburg, Virginia 24061
|
||||||
S: USA
|
S: USA
|
||||||
|
|
||||||
N: Randy Dunlap
|
N: Randy Dunlap
|
||||||
E: rddunlap@osdl.org
|
E: rdunlap@xenotime.net
|
||||||
W: http://www.xenotime.net/linux/linux.html
|
W: http://www.xenotime.net/linux/linux.html
|
||||||
W: http://www.linux-usb.org
|
W: http://www.linux-usb.org
|
||||||
D: Linux-USB subsystem, USB core/UHCI/printer/storage drivers
|
D: Linux-USB subsystem, USB core/UHCI/printer/storage drivers
|
||||||
D: x86 SMP, ACPI, bootflag hacking
|
D: x86 SMP, ACPI, bootflag hacking
|
||||||
S: 12725 SW Millikan Way, Suite 400
|
S: (ask for current address)
|
||||||
S: Beaverton, Oregon 97005
|
|
||||||
S: USA
|
S: USA
|
||||||
|
|
||||||
N: Bob Dunlop
|
N: Bob Dunlop
|
||||||
|
|
|
@ -12,8 +12,6 @@ Following translations are available on the WWW:
|
||||||
|
|
||||||
00-INDEX
|
00-INDEX
|
||||||
- this file.
|
- this file.
|
||||||
BK-usage/
|
|
||||||
- directory with info on BitKeeper.
|
|
||||||
BUG-HUNTING
|
BUG-HUNTING
|
||||||
- brute force method of doing binary search of patches to find bug.
|
- brute force method of doing binary search of patches to find bug.
|
||||||
Changes
|
Changes
|
||||||
|
|
|
@ -1,51 +0,0 @@
|
||||||
bk-kernel-howto.txt: Description of kernel workflow under BitKeeper
|
|
||||||
|
|
||||||
bk-make-sum: Create summary of changesets in one repository and not
|
|
||||||
another, typically in preparation to be sent to an upstream maintainer.
|
|
||||||
Typical usage:
|
|
||||||
cd my-updated-repo
|
|
||||||
bk-make-sum ~/repo/original-repo
|
|
||||||
mv /tmp/linus.txt ../original-repo.txt
|
|
||||||
|
|
||||||
bksend: Create readable text output containing summary of changes, GNU
|
|
||||||
patch of the changes, and BK metadata of changes (as needed for proper
|
|
||||||
importing into BitKeeper by an upstream maintainer). This output is
|
|
||||||
suitable for emailing BitKeeper changes. The recipient of this output
|
|
||||||
may pipe it directly to 'bk receive'.
|
|
||||||
|
|
||||||
bz64wrap: helper script. Uncompressed input is piped to this script,
|
|
||||||
which compresses its input, and then outputs the uu-/base64-encoded
|
|
||||||
version of the compressed input.
|
|
||||||
|
|
||||||
cpcset: Copy changeset between unrelated repositories.
|
|
||||||
Attempts to preserve changeset user, user address, description, in
|
|
||||||
addition to the changeset (the patch) itself.
|
|
||||||
Typical usage:
|
|
||||||
cd my-updated-repo
|
|
||||||
bk changes # looking for a changeset...
|
|
||||||
cpcset 1.1511 . ../another-repo
|
|
||||||
|
|
||||||
csets-to-patches: Produces a delta of two BK repositories, in the form
|
|
||||||
of individual files, each containing a single cset as a GNU patch.
|
|
||||||
Output is several files, each with the filename "/tmp/rev-$REV.patch"
|
|
||||||
Typical usage:
|
|
||||||
cd my-updated-repo
|
|
||||||
bk changes -L ~/repo/original-repo 2>&1 | \
|
|
||||||
perl csets-to-patches
|
|
||||||
|
|
||||||
cset-to-linus: Produces a delta of two BK repositories, in the form of
|
|
||||||
changeset descriptions, with 'diffstat' output created for each
|
|
||||||
individual changset.
|
|
||||||
Typical usage:
|
|
||||||
cd my-updated-repo
|
|
||||||
bk changes -L ~/repo/original-repo 2>&1 | \
|
|
||||||
perl cset-to-linus > summary.txt
|
|
||||||
|
|
||||||
gcapatch: Generates patch containing changes in local repository.
|
|
||||||
Typical usage:
|
|
||||||
cd my-updated-repo
|
|
||||||
gcapatch > foo.patch
|
|
||||||
|
|
||||||
unbz64wrap: Reverse an encoded, compressed data stream created by
|
|
||||||
bz64wrap into an uncompressed, typically text/plain output.
|
|
||||||
|
|
|
@ -1,283 +0,0 @@
|
||||||
|
|
||||||
Doing the BK Thing, Penguin-Style
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
This set of notes is intended mainly for kernel developers, occasional
|
|
||||||
or full-time, but sysadmins and power users may find parts of it useful
|
|
||||||
as well. It assumes at least a basic familiarity with CVS, both at a
|
|
||||||
user level (use on the cmd line) and at a higher level (client-server model).
|
|
||||||
Due to the author's background, an operation may be described in terms
|
|
||||||
of CVS, or in terms of how that operation differs from CVS.
|
|
||||||
|
|
||||||
This is -not- intended to be BitKeeper documentation. Always run
|
|
||||||
"bk help <command>" or in X "bk helptool <command>" for reference
|
|
||||||
documentation.
|
|
||||||
|
|
||||||
|
|
||||||
BitKeeper Concepts
|
|
||||||
------------------
|
|
||||||
|
|
||||||
In the true nature of the Internet itself, BitKeeper is a distributed
|
|
||||||
system. When applied to revision control, this means doing away with
|
|
||||||
client-server, and changing to a parent-child model... essentially
|
|
||||||
peer-to-peer. On the developer's end, this also represents a
|
|
||||||
fundamental disruption in the standard workflow of changes, commits,
|
|
||||||
and merges. You will need to take a few minutes to think about
|
|
||||||
how to best work under BitKeeper, and re-optimize things a bit.
|
|
||||||
In some sense it is a bit radical, because it might described as
|
|
||||||
tossing changes out into a maelstrom and having them magically
|
|
||||||
land at the right destination... but I'm getting ahead of myself.
|
|
||||||
|
|
||||||
Let's start with this progression:
|
|
||||||
Each BitKeeper source tree on disk is a repository unto itself.
|
|
||||||
Each repository has a parent (except the root/original, of course).
|
|
||||||
Each repository contains a set of a changesets ("csets").
|
|
||||||
Each cset is one or more changed files, bundled together.
|
|
||||||
|
|
||||||
Each tree is a repository, so all changes are checked into the local
|
|
||||||
tree. When a change is checked in, all modified files are grouped
|
|
||||||
into a logical unit, the changeset. Internally, BK links these
|
|
||||||
changesets in a tree, representing various converging and diverging
|
|
||||||
lines of development. These changesets are the bread and butter of
|
|
||||||
the BK system.
|
|
||||||
|
|
||||||
After the concept of changesets, the next thing you need to get used
|
|
||||||
to is having multiple copies of source trees lying around. This -really-
|
|
||||||
takes some getting used to, for some people. Separate source trees
|
|
||||||
are the means in BitKeeper by which you delineate parallel lines
|
|
||||||
of development, both minor and major. What would be branches in
|
|
||||||
CVS become separate source trees, or "clones" in BitKeeper [heh,
|
|
||||||
or Star Wars] terminology.
|
|
||||||
|
|
||||||
Clones and changesets are the tools from which most of the power of
|
|
||||||
BitKeeper is derived. As mentioned earlier, each clone has a parent,
|
|
||||||
the tree used as the source when the new clone was created. In a
|
|
||||||
CVS-like setup, the parent would be a remote server on the Internet,
|
|
||||||
and the child is your local clone of that tree.
|
|
||||||
|
|
||||||
Once you have established a common baseline between two source trees --
|
|
||||||
a common parent -- then you can merge changesets between those two
|
|
||||||
trees with ease. Merging changes into a tree is called a "pull", and
|
|
||||||
is analagous to 'cvs update'. A pull downloads all the changesets in
|
|
||||||
the remote tree you do not have, and merges them. Sending changes in
|
|
||||||
one tree to another tree is called a "push". Push sends all changes
|
|
||||||
in the local tree the remote does not yet have, and merges them.
|
|
||||||
|
|
||||||
From these concepts come some initial command examples:
|
|
||||||
|
|
||||||
1) bk clone -q http://linux.bkbits.net/linux-2.5 linus-2.5
|
|
||||||
Download a 2.5 stock kernel tree, naming it "linus-2.5" in the local dir.
|
|
||||||
The "-q" disables listing every single file as it is downloaded.
|
|
||||||
|
|
||||||
2) bk clone -ql linus-2.5 alpha-2.5
|
|
||||||
Create a separate source tree for the Alpha AXP architecture.
|
|
||||||
The "-l" uses hard links instead of copying data, since both trees are
|
|
||||||
on the local disk. You can also replace the above with "bk lclone -q ..."
|
|
||||||
|
|
||||||
You only clone a tree -once-. After cloning the tree lives a long time
|
|
||||||
on disk, being updating by pushes and pulls.
|
|
||||||
|
|
||||||
3) cd alpha-2.5 ; bk pull http://gkernel.bkbits.net/alpha-2.5
|
|
||||||
Download changes in "alpha-2.5" repository which are not present
|
|
||||||
in the local repository, and merge them into the source tree.
|
|
||||||
|
|
||||||
4) bk -r co -q
|
|
||||||
Because every tree is a repository, files must be checked out before
|
|
||||||
they will be in their standard places in the source tree.
|
|
||||||
|
|
||||||
5) bk vi fs/inode.c # example change...
|
|
||||||
bk citool # checkin, using X tool
|
|
||||||
bk push bk://gkernel@bkbits.net/alpha-2.5 # upload change
|
|
||||||
Typical example of a BK sequence that would replace the analagous CVS
|
|
||||||
situation,
|
|
||||||
vi fs/inode.c
|
|
||||||
cvs commit
|
|
||||||
|
|
||||||
As this is just supposed to be a quick BK intro, for more in-depth
|
|
||||||
tutorials, live working demos, and docs, see http://www.bitkeeper.com/
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
BK and Kernel Development Workflow
|
|
||||||
----------------------------------
|
|
||||||
Currently the latest 2.5 tree is available via "bk clone $URL"
|
|
||||||
and "bk pull $URL" at http://linux.bkbits.net/linux-2.5
|
|
||||||
This should change in a few weeks to a kernel.org URL.
|
|
||||||
|
|
||||||
|
|
||||||
A big part of using BitKeeper is organizing the various trees you have
|
|
||||||
on your local disk, and organizing the flow of changes among those
|
|
||||||
trees, and remote trees. If one were to graph the relationships between
|
|
||||||
a desired BK setup, you are likely to see a few-many-few graph, like
|
|
||||||
this:
|
|
||||||
|
|
||||||
linux-2.5
|
|
||||||
|
|
|
||||||
merge-to-linus-2.5
|
|
||||||
/ | |
|
|
||||||
/ | |
|
|
||||||
vm-hacks bugfixes filesys personal-hacks
|
|
||||||
\ | | /
|
|
||||||
\ | | /
|
|
||||||
\ | | /
|
|
||||||
testing-and-validation
|
|
||||||
|
|
||||||
Since a "bk push" sends all changes not in the target tree, and
|
|
||||||
since a "bk pull" receives all changes not in the source tree, you want
|
|
||||||
to make sure you are only pushing specific changes to the desired tree,
|
|
||||||
not all changes from "peer parent" trees. For example, pushing a change
|
|
||||||
from the testing-and-validation tree would probably be a bad idea,
|
|
||||||
because it will push all changes from vm-hacks, bugfixes, filesys, and
|
|
||||||
personal-hacks trees into the target tree.
|
|
||||||
|
|
||||||
One would typically work on only one "theme" at a time, either
|
|
||||||
vm-hacks or bugfixes or filesys, keeping those changes isolated in
|
|
||||||
their own tree during development, and only merge the isolated with
|
|
||||||
other changes when going upstream (to Linus or other maintainers) or
|
|
||||||
downstream (to your "union" trees, like testing-and-validation above).
|
|
||||||
|
|
||||||
It should be noted that some of this separation is not just recommended
|
|
||||||
practice, it's actually [for now] -enforced- by BitKeeper. BitKeeper
|
|
||||||
requires that changesets maintain a certain order, which is the reason
|
|
||||||
that "bk push" sends all local changesets the remote doesn't have. This
|
|
||||||
separation may look like a lot of wasted disk space at first, but it
|
|
||||||
helps when two unrelated changes may "pollute" the same area of code, or
|
|
||||||
don't follow the same pace of development, or any other of the standard
|
|
||||||
reasons why one creates a development branch.
|
|
||||||
|
|
||||||
Small development branches (clones) will appear and disappear:
|
|
||||||
|
|
||||||
-------- A --------- B --------- C --------- D -------
|
|
||||||
\ /
|
|
||||||
-----short-term devel branch-----
|
|
||||||
|
|
||||||
While long-term branches will parallel a tree (or trees), with period
|
|
||||||
merge points. In this first example, we pull from a tree (pulls,
|
|
||||||
"\") periodically, such as what occurs when tracking changes in a
|
|
||||||
vendor tree, never pushing changes back up the line:
|
|
||||||
|
|
||||||
-------- A --------- B --------- C --------- D -------
|
|
||||||
\ \ \
|
|
||||||
----long-term devel branch-----------------
|
|
||||||
|
|
||||||
And then a more common case in Linux kernel development, a long term
|
|
||||||
branch with periodic merges back into the tree (pushes, "/"):
|
|
||||||
|
|
||||||
-------- A --------- B --------- C --------- D -------
|
|
||||||
\ \ / \
|
|
||||||
----long-term devel branch-----------------
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Submitting Changes to Linus
|
|
||||||
---------------------------
|
|
||||||
There's a bit of an art, or style, of submitting changes to Linus.
|
|
||||||
Since Linus's tree is now (you might say) fully integrated into the
|
|
||||||
distributed BitKeeper system, there are several prerequisites to
|
|
||||||
properly submitting a BitKeeper change. All these prereq's are just
|
|
||||||
general cleanliness of BK usage, so as people become experts at BK, feel
|
|
||||||
free to optimize this process further (assuming Linus agrees, of
|
|
||||||
course).
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
0) Make sure your tree was originally cloned from the linux-2.5 tree
|
|
||||||
created by Linus. If your tree does not have this as its ancestor, it
|
|
||||||
is impossible to reliably exchange changesets.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
1) Pay attention to your commit text. The commit message that
|
|
||||||
accompanies each changeset you submit will live on forever in history,
|
|
||||||
and is used by Linus to accurately summarize the changes in each
|
|
||||||
pre-patch. Remember that there is no context, so
|
|
||||||
"fix for new scheduler changes"
|
|
||||||
would be too vague, but
|
|
||||||
"fix mips64 arch for new scheduler switch_to(), TIF_xxx semantics"
|
|
||||||
would be much better.
|
|
||||||
|
|
||||||
You can and should use the command "bk comment -C<rev>" to update the
|
|
||||||
commit text, and improve it after the fact. This is very useful for
|
|
||||||
development: poor, quick descriptions during development, which get
|
|
||||||
cleaned up using "bk comment" before issuing the "bk push" to submit the
|
|
||||||
changes.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
2) Include an Internet-available URL for Linus to pull from, such as
|
|
||||||
|
|
||||||
Pull from: http://gkernel.bkbits.net/net-drivers-2.5
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
3) Include a summary and "diffstat -p1" of each changeset that will be
|
|
||||||
downloaded, when Linus issues a "bk pull". The author auto-generates
|
|
||||||
these summaries using "bk changes -L <parent>", to obtain a listing
|
|
||||||
of all the pending-to-send changesets, and their commit messages.
|
|
||||||
|
|
||||||
It is important to show Linus what he will be downloading when he issues
|
|
||||||
a "bk pull", to reduce the time required to sift the changes once they
|
|
||||||
are downloaded to Linus's local machine.
|
|
||||||
|
|
||||||
IMPORTANT NOTE: One of the features of BK is that your repository does
|
|
||||||
not have to be up to date, in order for Linus to receive your changes.
|
|
||||||
It is considered a courtesy to keep your repository fairly recent, to
|
|
||||||
lessen any potential merge work Linus may need to do.
|
|
||||||
|
|
||||||
|
|
||||||
4) Split up your changes. Each maintainer<->Linus situation is likely
|
|
||||||
to be slightly different here, so take this just as general advice. The
|
|
||||||
author splits up changes according to "themes" when merging with Linus.
|
|
||||||
Simultaneous pushes from local development go to special trees which
|
|
||||||
exist solely to house changes "queued" for Linus. Example of the trees:
|
|
||||||
|
|
||||||
net-drivers-2.5 -- on-going net driver maintenance
|
|
||||||
vm-2.5 -- VM-related changes
|
|
||||||
fs-2.5 -- filesystem-related changes
|
|
||||||
|
|
||||||
Linus then has much more freedom for pulling changes. He could (for
|
|
||||||
example) issue a "bk pull" on vm-2.5 and fs-2.5 trees, to merge their
|
|
||||||
changes, but hold off net-drivers-2.5 because of a change that needs
|
|
||||||
more discussion.
|
|
||||||
|
|
||||||
Other maintainers may find that a single linus-pull-from tree is
|
|
||||||
adequate for passing BK changesets to him.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
Frequently Answered Questions
|
|
||||||
-----------------------------
|
|
||||||
1) How do I change the e-mail address shown in the changelog?
|
|
||||||
A. When you run "bk citool" or "bk commit", set environment
|
|
||||||
variables BK_USER and BK_HOST to the desired username
|
|
||||||
and host/domain name.
|
|
||||||
|
|
||||||
|
|
||||||
2) How do I use tags / get a diff between two kernel versions?
|
|
||||||
A. Pass the tags Linus uses to 'bk export'.
|
|
||||||
|
|
||||||
ChangeSets are in a forward-progressing order, so it's pretty easy
|
|
||||||
to get a snapshot starting and ending at any two points in time.
|
|
||||||
Linus puts tags on each release and pre-release, so you could use
|
|
||||||
these two examples:
|
|
||||||
|
|
||||||
bk export -tpatch -hdu -rv2.5.4,v2.5.5 | less
|
|
||||||
# creates patch-2.5.5 essentially
|
|
||||||
bk export -tpatch -du -rv2.5.5-pre1,v2.5.5 | less
|
|
||||||
# changes from pre1 to final
|
|
||||||
|
|
||||||
A tag is just an alias for a specific changeset... and since changesets
|
|
||||||
are ordered, a tag is thus a marker for a specific point in time (or
|
|
||||||
specific state of the tree).
|
|
||||||
|
|
||||||
|
|
||||||
3) Is there an easy way to generate One Big Patch versus mainline,
|
|
||||||
for my long-lived kernel branch?
|
|
||||||
A. Yes. This requires BK 3.x, though.
|
|
||||||
|
|
||||||
bk export -tpatch -r`bk repogca bk://linux.bkbits.net/linux-2.5`,+
|
|
||||||
|
|
|
@ -1,34 +0,0 @@
|
||||||
#!/bin/sh -e
|
|
||||||
# DIR=$HOME/BK/axp-2.5
|
|
||||||
# cd $DIR
|
|
||||||
|
|
||||||
LINUS_REPO=$1
|
|
||||||
DIRBASE=`basename $PWD`
|
|
||||||
|
|
||||||
{
|
|
||||||
cat <<EOT
|
|
||||||
Please do a
|
|
||||||
|
|
||||||
bk pull bk://gkernel.bkbits.net/$DIRBASE
|
|
||||||
|
|
||||||
This will update the following files:
|
|
||||||
|
|
||||||
EOT
|
|
||||||
|
|
||||||
bk export -tpatch -hdu -r`bk repogca $LINUS_REPO`,+ | diffstat -p1 2>/dev/null
|
|
||||||
|
|
||||||
cat <<EOT
|
|
||||||
|
|
||||||
through these ChangeSets:
|
|
||||||
|
|
||||||
EOT
|
|
||||||
|
|
||||||
bk changes -L -d'$unless(:MERGE:){ChangeSet|:CSETREV:\n}' $LINUS_REPO |
|
|
||||||
bk -R prs -h -d'$unless(:MERGE:){<:P:@:HOST:> (:D: :I:)\n$each(:C:){ (:C:)\n}\n}' -
|
|
||||||
|
|
||||||
} > /tmp/linus.txt
|
|
||||||
|
|
||||||
cat <<EOT
|
|
||||||
Mail text in /tmp/linus.txt; please check and send using your favourite
|
|
||||||
mailer.
|
|
||||||
EOT
|
|
|
@ -1,36 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
# A script to format BK changeset output in a manner that is easy to read.
|
|
||||||
# Andreas Dilger <adilger@turbolabs.com> 13/02/2002
|
|
||||||
#
|
|
||||||
# Add diffstat output after Changelog <adilger@turbolabs.com> 21/02/2002
|
|
||||||
|
|
||||||
PROG=bksend
|
|
||||||
|
|
||||||
usage() {
|
|
||||||
echo "usage: $PROG -r<rev>"
|
|
||||||
echo -e "\twhere <rev> is of the form '1.23', '1.23..', '1.23..1.27',"
|
|
||||||
echo -e "\tor '+' to indicate the most recent revision"
|
|
||||||
|
|
||||||
exit 1
|
|
||||||
}
|
|
||||||
|
|
||||||
case $1 in
|
|
||||||
-r) REV=$2; shift ;;
|
|
||||||
-r*) REV=`echo $1 | sed 's/^-r//'` ;;
|
|
||||||
*) echo "$PROG: no revision given, you probably don't want that";;
|
|
||||||
esac
|
|
||||||
|
|
||||||
[ -z "$REV" ] && usage
|
|
||||||
|
|
||||||
echo "You can import this changeset into BK by piping this whole message to:"
|
|
||||||
echo "'| bk receive [path to repository]' or apply the patch as usual."
|
|
||||||
|
|
||||||
SEP="\n===================================================================\n\n"
|
|
||||||
echo -e $SEP
|
|
||||||
env PAGER=/bin/cat bk changes -r$REV
|
|
||||||
echo
|
|
||||||
bk export -tpatch -du -h -r$REV | diffstat
|
|
||||||
echo; echo
|
|
||||||
bk export -tpatch -du -h -r$REV
|
|
||||||
echo -e $SEP
|
|
||||||
bk send -wgzip_uu -r$REV -
|
|
|
@ -1,41 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# bz64wrap - the sending side of a bzip2 | base64 stream
|
|
||||||
# Andreas Dilger <adilger@clusterfs.com> Jan 2002
|
|
||||||
|
|
||||||
|
|
||||||
PATH=$PATH:/usr/bin:/usr/local/bin:/usr/freeware/bin
|
|
||||||
|
|
||||||
# A program to generate base64 encoding on stdout
|
|
||||||
BASE64_ENCODE="uuencode -m /dev/stdout"
|
|
||||||
BASE64_BEGIN=
|
|
||||||
BASE64_END=
|
|
||||||
|
|
||||||
BZIP=NO
|
|
||||||
BASE64=NO
|
|
||||||
|
|
||||||
# Test if we have the bzip program installed
|
|
||||||
bzip2 -c /dev/null > /dev/null 2>&1 && BZIP=YES
|
|
||||||
|
|
||||||
# Test if uuencode can handle the -m (MIME) encoding option
|
|
||||||
$BASE64_ENCODE < /dev/null > /dev/null 2>&1 && BASE64=YES
|
|
||||||
|
|
||||||
if [ $BASE64 = NO ]; then
|
|
||||||
BASE64_ENCODE=mimencode
|
|
||||||
BASE64_BEGIN="begin-base64 644 -"
|
|
||||||
BASE64_END="===="
|
|
||||||
|
|
||||||
$BASE64_ENCODE < /dev/null > /dev/null 2>&1 && BASE64=YES
|
|
||||||
fi
|
|
||||||
|
|
||||||
if [ $BZIP = NO -o $BASE64 = NO ]; then
|
|
||||||
echo "$0: can't use bz64 encoding: bzip2=$BZIP, $BASE64_ENCODE=$BASE64"
|
|
||||||
exit 1
|
|
||||||
fi
|
|
||||||
|
|
||||||
# Sadly, mimencode does not appear to have good "begin" and "end" markers
|
|
||||||
# like uuencode does, and it is picky about getting the right start/end of
|
|
||||||
# the base64 stream, so we handle this internally.
|
|
||||||
echo "$BASE64_BEGIN"
|
|
||||||
bzip2 -9 | $BASE64_ENCODE
|
|
||||||
echo "$BASE64_END"
|
|
|
@ -1,36 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Purpose: Copy changeset patch and description from one
|
|
||||||
# repository to another, unrelated one.
|
|
||||||
#
|
|
||||||
# usage: cpcset [revision] [from-repository] [to-repository]
|
|
||||||
#
|
|
||||||
|
|
||||||
REV=$1
|
|
||||||
FROM=$2
|
|
||||||
TO=$3
|
|
||||||
TMPF=/tmp/cpcset.$$
|
|
||||||
|
|
||||||
rm -f $TMPF*
|
|
||||||
|
|
||||||
CWD_SAVE=`pwd`
|
|
||||||
cd $FROM
|
|
||||||
bk changes -r$REV | \
|
|
||||||
grep -v '^ChangeSet' | \
|
|
||||||
sed -e 's/^ //g' > $TMPF.log
|
|
||||||
|
|
||||||
USERHOST=`bk changes -r$REV | grep '^ChangeSet' | awk '{print $4}'`
|
|
||||||
export BK_USER=`echo $USERHOST | awk '-F@' '{print $1}'`
|
|
||||||
export BK_HOST=`echo $USERHOST | awk '-F@' '{print $2}'`
|
|
||||||
|
|
||||||
bk export -tpatch -hdu -r$REV > $TMPF.patch && \
|
|
||||||
cd $CWD_SAVE && \
|
|
||||||
cd $TO && \
|
|
||||||
bk import -tpatch -CFR -y"`cat $TMPF.log`" $TMPF.patch . && \
|
|
||||||
bk commit -y"`cat $TMPF.log`"
|
|
||||||
|
|
||||||
rm -f $TMPF*
|
|
||||||
|
|
||||||
echo changeset $REV copied.
|
|
||||||
echo ""
|
|
||||||
|
|
|
@ -1,49 +0,0 @@
|
||||||
#!/usr/bin/perl -w
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
my ($lhs, $rev, $tmp, $rhs, $s);
|
|
||||||
my @cset_text = ();
|
|
||||||
my @pipe_text = ();
|
|
||||||
my $have_cset = 0;
|
|
||||||
|
|
||||||
while (<>) {
|
|
||||||
next if /^---/;
|
|
||||||
|
|
||||||
if (($lhs, $tmp, $rhs) = (/^(ChangeSet\@)([^,]+)(, .*)$/)) {
|
|
||||||
&cset_rev if ($have_cset);
|
|
||||||
|
|
||||||
$rev = $tmp;
|
|
||||||
$have_cset = 1;
|
|
||||||
|
|
||||||
push(@cset_text, $_);
|
|
||||||
}
|
|
||||||
|
|
||||||
elsif ($have_cset) {
|
|
||||||
push(@cset_text, $_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&cset_rev if ($have_cset);
|
|
||||||
exit(0);
|
|
||||||
|
|
||||||
|
|
||||||
sub cset_rev {
|
|
||||||
my $empty_cset = 0;
|
|
||||||
|
|
||||||
open PIPE, "bk export -tpatch -hdu -r $rev | diffstat -p1 2>/dev/null |" or die;
|
|
||||||
while ($s = <PIPE>) {
|
|
||||||
$empty_cset = 1 if ($s =~ /0 files changed/);
|
|
||||||
push(@pipe_text, $s);
|
|
||||||
}
|
|
||||||
close(PIPE);
|
|
||||||
|
|
||||||
if (! $empty_cset) {
|
|
||||||
print @cset_text;
|
|
||||||
print @pipe_text;
|
|
||||||
print "\n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
@pipe_text = ();
|
|
||||||
@cset_text = ();
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,44 +0,0 @@
|
||||||
#!/usr/bin/perl -w
|
|
||||||
|
|
||||||
use strict;
|
|
||||||
|
|
||||||
my ($lhs, $rev, $tmp, $rhs, $s);
|
|
||||||
my @cset_text = ();
|
|
||||||
my @pipe_text = ();
|
|
||||||
my $have_cset = 0;
|
|
||||||
|
|
||||||
while (<>) {
|
|
||||||
next if /^---/;
|
|
||||||
|
|
||||||
if (($lhs, $tmp, $rhs) = (/^(ChangeSet\@)([^,]+)(, .*)$/)) {
|
|
||||||
&cset_rev if ($have_cset);
|
|
||||||
|
|
||||||
$rev = $tmp;
|
|
||||||
$have_cset = 1;
|
|
||||||
|
|
||||||
push(@cset_text, $_);
|
|
||||||
}
|
|
||||||
|
|
||||||
elsif ($have_cset) {
|
|
||||||
push(@cset_text, $_);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
&cset_rev if ($have_cset);
|
|
||||||
exit(0);
|
|
||||||
|
|
||||||
|
|
||||||
sub cset_rev {
|
|
||||||
my $empty_cset = 0;
|
|
||||||
|
|
||||||
system("bk export -tpatch -du -r $rev > /tmp/rev-$rev.patch");
|
|
||||||
|
|
||||||
if (! $empty_cset) {
|
|
||||||
print @cset_text;
|
|
||||||
print @pipe_text;
|
|
||||||
print "\n\n";
|
|
||||||
}
|
|
||||||
|
|
||||||
@pipe_text = ();
|
|
||||||
@cset_text = ();
|
|
||||||
}
|
|
||||||
|
|
|
@ -1,8 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
#
|
|
||||||
# Purpose: Generate GNU diff of local changes versus canonical top-of-tree
|
|
||||||
#
|
|
||||||
# Usage: gcapatch > foo.patch
|
|
||||||
#
|
|
||||||
|
|
||||||
bk export -tpatch -hdu -r`bk repogca bk://linux.bkbits.net/linux-2.5`,+
|
|
|
@ -1,25 +0,0 @@
|
||||||
#!/bin/sh
|
|
||||||
|
|
||||||
# unbz64wrap - the receiving side of a bzip2 | base64 stream
|
|
||||||
# Andreas Dilger <adilger@clusterfs.com> Jan 2002
|
|
||||||
|
|
||||||
# Sadly, mimencode does not appear to have good "begin" and "end" markers
|
|
||||||
# like uuencode does, and it is picky about getting the right start/end of
|
|
||||||
# the base64 stream, so we handle this explicitly here.
|
|
||||||
|
|
||||||
PATH=$PATH:/usr/bin:/usr/local/bin:/usr/freeware/bin
|
|
||||||
|
|
||||||
if mimencode -u < /dev/null > /dev/null 2>&1 ; then
|
|
||||||
SHOW=
|
|
||||||
while read LINE; do
|
|
||||||
case $LINE in
|
|
||||||
begin-base64*) SHOW=YES ;;
|
|
||||||
====) SHOW= ;;
|
|
||||||
*) [ "$SHOW" ] && echo "$LINE" ;;
|
|
||||||
esac
|
|
||||||
done | mimencode -u | bunzip2
|
|
||||||
exit $?
|
|
||||||
else
|
|
||||||
cat - | uudecode -o /dev/stdout | bunzip2
|
|
||||||
exit $?
|
|
||||||
fi
|
|
128
Documentation/cpu-freq/cpufreq-stats.txt
Normal file
128
Documentation/cpu-freq/cpufreq-stats.txt
Normal file
|
@ -0,0 +1,128 @@
|
||||||
|
|
||||||
|
CPU frequency and voltage scaling statictics in the Linux(TM) kernel
|
||||||
|
|
||||||
|
|
||||||
|
L i n u x c p u f r e q - s t a t s d r i v e r
|
||||||
|
|
||||||
|
- information for users -
|
||||||
|
|
||||||
|
|
||||||
|
Venkatesh Pallipadi <venkatesh.pallipadi@intel.com>
|
||||||
|
|
||||||
|
Contents
|
||||||
|
1. Introduction
|
||||||
|
2. Statistics Provided (with example)
|
||||||
|
3. Configuring cpufreq-stats
|
||||||
|
|
||||||
|
|
||||||
|
1. Introduction
|
||||||
|
|
||||||
|
cpufreq-stats is a driver that provices CPU frequency statistics for each CPU.
|
||||||
|
This statistics is provided in /sysfs as a bunch of read_only interfaces. This
|
||||||
|
interface (when configured) will appear in a seperate directory under cpufreq
|
||||||
|
in /sysfs (<sysfs root>/devices/system/cpu/cpuX/cpufreq/stats/) for each CPU.
|
||||||
|
Various statistics will form read_only files under this directory.
|
||||||
|
|
||||||
|
This driver is designed to be independent of any particular cpufreq_driver
|
||||||
|
that may be running on your CPU. So, it will work with any cpufreq_driver.
|
||||||
|
|
||||||
|
|
||||||
|
2. Statistics Provided (with example)
|
||||||
|
|
||||||
|
cpufreq stats provides following statistics (explained in detail below).
|
||||||
|
- time_in_state
|
||||||
|
- total_trans
|
||||||
|
- trans_table
|
||||||
|
|
||||||
|
All the statistics will be from the time the stats driver has been inserted
|
||||||
|
to the time when a read of a particular statistic is done. Obviously, stats
|
||||||
|
driver will not have any information about the the frequcny transitions before
|
||||||
|
the stats driver insertion.
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # ls -l
|
||||||
|
total 0
|
||||||
|
drwxr-xr-x 2 root root 0 May 14 16:06 .
|
||||||
|
drwxr-xr-x 3 root root 0 May 14 15:58 ..
|
||||||
|
-r--r--r-- 1 root root 4096 May 14 16:06 time_in_state
|
||||||
|
-r--r--r-- 1 root root 4096 May 14 16:06 total_trans
|
||||||
|
-r--r--r-- 1 root root 4096 May 14 16:06 trans_table
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
- time_in_state
|
||||||
|
This gives the amount of time spent in each of the frequencies supported by
|
||||||
|
this CPU. The cat output will have "<frequency> <time>" pair in each line, which
|
||||||
|
will mean this CPU spent <time> usertime units of time at <frequency>. Output
|
||||||
|
will have one line for each of the supported freuencies. usertime units here
|
||||||
|
is 10mS (similar to other time exported in /proc).
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat time_in_state
|
||||||
|
3600000 2089
|
||||||
|
3400000 136
|
||||||
|
3200000 34
|
||||||
|
3000000 67
|
||||||
|
2800000 172488
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
- total_trans
|
||||||
|
This gives the total number of frequency transitions on this CPU. The cat
|
||||||
|
output will have a single count which is the total number of frequency
|
||||||
|
transitions.
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat total_trans
|
||||||
|
20
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
- trans_table
|
||||||
|
This will give a fine grained information about all the CPU frequency
|
||||||
|
transitions. The cat output here is a two dimensional matrix, where an entry
|
||||||
|
<i,j> (row i, column j) represents the count of number of transitions from
|
||||||
|
Freq_i to Freq_j. Freq_i is in descending order with increasing rows and
|
||||||
|
Freq_j is in descending order with increasing columns. The output here also
|
||||||
|
contains the actual freq values for each row and column for better readability.
|
||||||
|
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
<mysystem>:/sys/devices/system/cpu/cpu0/cpufreq/stats # cat trans_table
|
||||||
|
From : To
|
||||||
|
: 3600000 3400000 3200000 3000000 2800000
|
||||||
|
3600000: 0 5 0 0 0
|
||||||
|
3400000: 4 0 2 0 0
|
||||||
|
3200000: 0 1 0 2 0
|
||||||
|
3000000: 0 0 1 0 3
|
||||||
|
2800000: 0 0 0 2 0
|
||||||
|
--------------------------------------------------------------------------------
|
||||||
|
|
||||||
|
|
||||||
|
3. Configuring cpufreq-stats
|
||||||
|
|
||||||
|
To configure cpufreq-stats in your kernel
|
||||||
|
Config Main Menu
|
||||||
|
Power management options (ACPI, APM) --->
|
||||||
|
CPU Frequency scaling --->
|
||||||
|
[*] CPU Frequency scaling
|
||||||
|
<*> CPU frequency translation statistics
|
||||||
|
[*] CPU frequency translation statistics details
|
||||||
|
|
||||||
|
|
||||||
|
"CPU Frequency scaling" (CONFIG_CPU_FREQ) should be enabled to configure
|
||||||
|
cpufreq-stats.
|
||||||
|
|
||||||
|
"CPU frequency translation statistics" (CONFIG_CPU_FREQ_STAT) provides the
|
||||||
|
basic statistics which includes time_in_state and total_trans.
|
||||||
|
|
||||||
|
"CPU frequency translation statistics details" (CONFIG_CPU_FREQ_STAT_DETAILS)
|
||||||
|
provides fine grained cpufreq stats by trans_table. The reason for having a
|
||||||
|
seperate config option for trans_table is:
|
||||||
|
- trans_table goes against the traditional /sysfs rule of one value per
|
||||||
|
interface. It provides a whole bunch of value in a 2 dimensional matrix
|
||||||
|
form.
|
||||||
|
|
||||||
|
Once these two options are enabled and your CPU supports cpufrequency, you
|
||||||
|
will be able to see the CPU frequency statistics in /sysfs.
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
|
@ -252,8 +252,7 @@ in a tasks processor placement.
|
||||||
There is an exception to the above. If hotplug funtionality is used
|
There is an exception to the above. If hotplug funtionality is used
|
||||||
to remove all the CPUs that are currently assigned to a cpuset,
|
to remove all the CPUs that are currently assigned to a cpuset,
|
||||||
then the kernel will automatically update the cpus_allowed of all
|
then the kernel will automatically update the cpus_allowed of all
|
||||||
tasks attached to CPUs in that cpuset with the online CPUs of the
|
tasks attached to CPUs in that cpuset to allow all CPUs. When memory
|
||||||
nearest parent cpuset that still has some CPUs online. When memory
|
|
||||||
hotplug functionality for removing Memory Nodes is available, a
|
hotplug functionality for removing Memory Nodes is available, a
|
||||||
similar exception is expected to apply there as well. In general,
|
similar exception is expected to apply there as well. In general,
|
||||||
the kernel prefers to violate cpuset placement, over starving a task
|
the kernel prefers to violate cpuset placement, over starving a task
|
||||||
|
|
|
@ -27,6 +27,7 @@
|
||||||
*.so
|
*.so
|
||||||
*.tex
|
*.tex
|
||||||
*.ver
|
*.ver
|
||||||
|
*.xml
|
||||||
*_MODULES
|
*_MODULES
|
||||||
*_vga16.c
|
*_vga16.c
|
||||||
*cscope*
|
*cscope*
|
||||||
|
@ -110,6 +111,7 @@ mkdep
|
||||||
mktables
|
mktables
|
||||||
modpost
|
modpost
|
||||||
modversions.h*
|
modversions.h*
|
||||||
|
offsets.h
|
||||||
oui.c*
|
oui.c*
|
||||||
parse.c*
|
parse.c*
|
||||||
parse.h*
|
parse.h*
|
||||||
|
@ -134,4 +136,5 @@ vmlinux-*
|
||||||
vmlinux.lds
|
vmlinux.lds
|
||||||
vsyscall.lds
|
vsyscall.lds
|
||||||
wanxlfw.inc
|
wanxlfw.inc
|
||||||
|
uImage
|
||||||
zImage
|
zImage
|
||||||
|
|
205
Documentation/dvb/README.flexcop
Normal file
205
Documentation/dvb/README.flexcop
Normal file
|
@ -0,0 +1,205 @@
|
||||||
|
This README escorted the skystar2-driver rewriting procedure. It describes the
|
||||||
|
state of the new flexcop-driver set and some internals are written down here
|
||||||
|
too.
|
||||||
|
|
||||||
|
This document hopefully describes things about the flexcop and its
|
||||||
|
device-offsprings. Goal was to write an easy-to-write and easy-to-read set of
|
||||||
|
drivers based on the skystar2.c and other information.
|
||||||
|
|
||||||
|
Remark: flexcop-pci.c was a copy of skystar2.c, but every line has been
|
||||||
|
touched and rewritten.
|
||||||
|
|
||||||
|
History & News
|
||||||
|
==============
|
||||||
|
2005-04-01 - correct USB ISOC transfers (thanks to Vadim Catana)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
General coding processing
|
||||||
|
=========================
|
||||||
|
|
||||||
|
We should proceed as follows (as long as no one complains):
|
||||||
|
|
||||||
|
0) Think before start writing code!
|
||||||
|
|
||||||
|
1) rewriting the skystar2.c with the help of the flexcop register descriptions
|
||||||
|
and splitting up the files to a pci-bus-part and a flexcop-part.
|
||||||
|
The new driver will be called b2c2-flexcop-pci.ko/b2c2-flexcop-usb.ko for the
|
||||||
|
device-specific part and b2c2-flexcop.ko for the common flexcop-functions.
|
||||||
|
|
||||||
|
2) Search for errors in the leftover of flexcop-pci.c (compare with pluto2.c
|
||||||
|
and other pci drivers)
|
||||||
|
|
||||||
|
3) make some beautification (see 'Improvements when rewriting (refactoring) is
|
||||||
|
done')
|
||||||
|
|
||||||
|
4) Testing the new driver and maybe substitute the skystar2.c with it, to reach
|
||||||
|
a wider tester audience.
|
||||||
|
|
||||||
|
5) creating an usb-bus-part using the already written flexcop code for the pci
|
||||||
|
card.
|
||||||
|
|
||||||
|
Idea: create a kernel-object for the flexcop and export all important
|
||||||
|
functions. This option saves kernel-memory, but maybe a lot of functions have
|
||||||
|
to be exported to kernel namespace.
|
||||||
|
|
||||||
|
|
||||||
|
Current situation
|
||||||
|
=================
|
||||||
|
|
||||||
|
0) Done :)
|
||||||
|
1) Done (some minor issues left)
|
||||||
|
2) Done
|
||||||
|
3) Not ready yet, more information is necessary
|
||||||
|
4) next to be done (see the table below)
|
||||||
|
5) USB driver is working (yes, there are some minor issues)
|
||||||
|
|
||||||
|
What seems to be ready?
|
||||||
|
-----------------------
|
||||||
|
|
||||||
|
1) Rewriting
|
||||||
|
1a) i2c is cut off from the flexcop-pci.c and seems to work
|
||||||
|
1b) moved tuner and demod stuff from flexcop-pci.c to flexcop-tuner-fe.c
|
||||||
|
1c) moved lnb and diseqc stuff from flexcop-pci.c to flexcop-tuner-fe.c
|
||||||
|
1e) eeprom (reading MAC address)
|
||||||
|
1d) sram (no dynamic sll size detection (commented out) (using default as JJ told me))
|
||||||
|
1f) misc. register accesses for reading parameters (e.g. resetting, revision)
|
||||||
|
1g) pid/mac filter (flexcop-hw-filter.c)
|
||||||
|
1i) dvb-stuff initialization in flexcop.c (done)
|
||||||
|
1h) dma stuff (now just using the size-irq, instead of all-together, to be done)
|
||||||
|
1j) remove flexcop initialization from flexcop-pci.c completely (done)
|
||||||
|
1l) use a well working dma IRQ method (done, see 'Known bugs and problems and TODO')
|
||||||
|
1k) cleanup flexcop-files (remove unused EXPORT_SYMBOLs, make static from
|
||||||
|
non-static where possible, moved code to proper places)
|
||||||
|
|
||||||
|
2) Search for errors in the leftover of flexcop-pci.c (partially done)
|
||||||
|
5a) add MAC address reading
|
||||||
|
5c) feeding of ISOC data to the software demux (format of the isochronous data
|
||||||
|
and speed optimization, no real error) (thanks to Vadim Catana)
|
||||||
|
|
||||||
|
What to do in the near future?
|
||||||
|
--------------------------------------
|
||||||
|
(no special order here)
|
||||||
|
|
||||||
|
5) USB driver
|
||||||
|
5b) optimize isoc-transfer (submitting/killing isoc URBs when transfer is starting)
|
||||||
|
|
||||||
|
Testing changes
|
||||||
|
---------------
|
||||||
|
|
||||||
|
O = item is working
|
||||||
|
P = item is partially working
|
||||||
|
X = item is not working
|
||||||
|
N = item does not apply here
|
||||||
|
<empty field> = item need to be examined
|
||||||
|
|
||||||
|
| PCI | USB
|
||||||
|
item | mt352 | nxt2002 | stv0299 | mt312 | mt352 | nxt2002 | stv0299 | mt312
|
||||||
|
-------+-------+---------+---------+-------+-------+---------+---------+-------
|
||||||
|
1a) | O | | | | N | N | N | N
|
||||||
|
1b) | O | | | | | | O |
|
||||||
|
1c) | N | N | | | N | N | O |
|
||||||
|
1d) | O | O
|
||||||
|
1e) | O | O
|
||||||
|
1f) | P
|
||||||
|
1g) | O
|
||||||
|
1h) | P |
|
||||||
|
1i) | O | N
|
||||||
|
1j) | O | N
|
||||||
|
1l) | O | N
|
||||||
|
2) | O | N
|
||||||
|
5a) | N | O
|
||||||
|
5b)* | N |
|
||||||
|
5c) | N | O
|
||||||
|
|
||||||
|
* - not done yet
|
||||||
|
|
||||||
|
Known bugs and problems and TODO
|
||||||
|
--------------------------------
|
||||||
|
|
||||||
|
1g/h/l) when pid filtering is enabled on the pci card
|
||||||
|
|
||||||
|
DMA usage currently:
|
||||||
|
The DMA is splitted in 2 equal-sized subbuffers. The Flexcop writes to first
|
||||||
|
address and triggers an IRQ when it's full and starts writing to the second
|
||||||
|
address. When the second address is full, the IRQ is triggered again, and
|
||||||
|
the flexcop writes to first address again, and so on.
|
||||||
|
The buffersize of each address is currently 640*188 bytes.
|
||||||
|
|
||||||
|
Problem is, when using hw-pid-filtering and doing some low-bandwidth
|
||||||
|
operation (like scanning) the buffers won't be filled enough to trigger
|
||||||
|
the IRQ. That's why:
|
||||||
|
|
||||||
|
When PID filtering is activated, the timer IRQ is used. Every 1.97 ms the IRQ
|
||||||
|
is triggered. Is the current write address of DMA1 different to the one
|
||||||
|
during the last IRQ, then the data is passed to the demuxer.
|
||||||
|
|
||||||
|
There is an additional DMA-IRQ-method: packet count IRQ. This isn't
|
||||||
|
implemented correctly yet.
|
||||||
|
|
||||||
|
The solution is to disable HW PID filtering, but I don't know how the DVB
|
||||||
|
API software demux behaves on slow systems with 45MBit/s TS.
|
||||||
|
|
||||||
|
Solved bugs :)
|
||||||
|
--------------
|
||||||
|
1g) pid-filtering (somehow pid index 4 and 5 (EMM_PID and ECM_PID) aren't
|
||||||
|
working)
|
||||||
|
SOLUTION: also index 0 was affected, because net_translation is done for
|
||||||
|
these indexes by default
|
||||||
|
|
||||||
|
5b) isochronous transfer does only work in the first attempt (for the Sky2PC
|
||||||
|
USB, Air2PC is working) SOLUTION: the flexcop was going asleep and never really
|
||||||
|
woke up again (don't know if this need fixes, see
|
||||||
|
flexcop-fe-tuner.c:flexcop_sleep)
|
||||||
|
|
||||||
|
NEWS: when the driver is loaded and unloaded and loaded again (w/o doing
|
||||||
|
anything in the while the driver is loaded the first time), no transfers take
|
||||||
|
place anymore.
|
||||||
|
|
||||||
|
Improvements when rewriting (refactoring) is done
|
||||||
|
=================================================
|
||||||
|
|
||||||
|
- split sleeping of the flexcop (misc_204.ACPI3_sig = 1;) from lnb_control
|
||||||
|
(enable sleeping for other demods than dvb-s)
|
||||||
|
- add support for CableStar (stv0297 Microtune 203x/ALPS) (almost done, incompatibilities with the Nexus-CA)
|
||||||
|
|
||||||
|
Debugging
|
||||||
|
---------
|
||||||
|
- add verbose debugging to skystar2.c (dump the reg_dw_data) and compare it
|
||||||
|
with this flexcop, this is important, because i2c is now using the
|
||||||
|
flexcop_ibi_value union from flexcop-reg.h (do you have a better idea for
|
||||||
|
that, please tell us so).
|
||||||
|
|
||||||
|
Everything which is identical in the following table, can be put into a common
|
||||||
|
flexcop-module.
|
||||||
|
|
||||||
|
PCI USB
|
||||||
|
-------------------------------------------------------------------------------
|
||||||
|
Different:
|
||||||
|
Register access: accessing IO memory USB control message
|
||||||
|
I2C bus: I2C bus of the FC USB control message
|
||||||
|
Data transfer: DMA isochronous transfer
|
||||||
|
EEPROM transfer: through i2c bus not clear yet
|
||||||
|
|
||||||
|
Identical:
|
||||||
|
Streaming: accessing registers
|
||||||
|
PID Filtering: accessing registers
|
||||||
|
Sram destinations: accessing registers
|
||||||
|
Tuner/Demod: I2C bus
|
||||||
|
DVB-stuff: can be written for common use
|
||||||
|
|
||||||
|
Acknowledgements (just for the rewriting part)
|
||||||
|
================
|
||||||
|
|
||||||
|
Bjarne Steinsbo thought a lot in the first place of the pci part for this code
|
||||||
|
sharing idea.
|
||||||
|
|
||||||
|
Andreas Oberritter for providing a recent PCI initialization template
|
||||||
|
(pluto2.c).
|
||||||
|
|
||||||
|
Boleslaw Ciesielski for pointing out a problem with firmware loader.
|
||||||
|
|
||||||
|
Vadim Catana for correcting the USB transfer.
|
||||||
|
|
||||||
|
comments, critics and ideas to linux-dvb@linuxtv.org.
|
|
@ -17,74 +17,53 @@ Because of this, you need to enable
|
||||||
"Device drivers" => "Multimedia devices"
|
"Device drivers" => "Multimedia devices"
|
||||||
=> "Video For Linux" => "BT848 Video For Linux"
|
=> "Video For Linux" => "BT848 Video For Linux"
|
||||||
|
|
||||||
|
Furthermore you need to enable
|
||||||
|
"Device drivers" => "Multimedia devices" => "Digital Video Broadcasting Devices"
|
||||||
|
=> "DVB for Linux" "DVB Core Support" "Nebula/Pinnacle PCTV/TwinHan PCI Cards"
|
||||||
|
|
||||||
2) Loading Modules
|
2) Loading Modules
|
||||||
==================
|
==================
|
||||||
|
|
||||||
In general you need to load the bttv driver, which will handle the gpio and
|
In general you need to load the bttv driver, which will handle the gpio and
|
||||||
i2c communication for us. Next you need the common dvb-bt8xx device driver
|
i2c communication for us, plus the common dvb-bt8xx device driver.
|
||||||
and one frontend driver.
|
The frontends for Nebula (nxt6000), Pinnacle PCTV (cx24110) and
|
||||||
|
TwinHan (dst) are loaded automatically by the dvb-bt8xx device driver.
|
||||||
The bttv driver will HANG YOUR SYSTEM IF YOU DO NOT SPECIFY THE CORRECT
|
|
||||||
CARD ID!
|
|
||||||
|
|
||||||
(If you don't get your card running and you suspect that the card id you're
|
|
||||||
using is wrong, have a look at "bttv-cards.c" for a list of possible card
|
|
||||||
ids.)
|
|
||||||
|
|
||||||
Pay attention to failures when you load the frontend drivers
|
|
||||||
(e.g. dmesg, /var/log/messages).
|
|
||||||
|
|
||||||
3a) Nebula / Pinnacle PCTV
|
3a) Nebula / Pinnacle PCTV
|
||||||
--------------------------
|
--------------------------
|
||||||
|
|
||||||
$ modprobe bttv i2c_hw=1 card=0x68
|
$ modprobe bttv (normally bttv is being loaded automatically by kmod)
|
||||||
$ modprobe dvb-bt8xx
|
$ modprobe dvb-bt8xx (or just place dvb-bt8xx in /etc/modules for automatic loading)
|
||||||
|
|
||||||
For Nebula cards use the "nxt6000" frontend driver:
|
|
||||||
$ modprobe nxt6000
|
|
||||||
|
|
||||||
For Pinnacle PCTV cards use the "cx24110" frontend driver:
|
|
||||||
$ modprobe cx24110
|
|
||||||
|
|
||||||
3b) TwinHan
|
3b) TwinHan and Clones
|
||||||
-----------
|
--------------------------
|
||||||
|
|
||||||
$ modprobe bttv i2c_hw=1 card=0x71
|
$ modprobe bttv i2c_hw=1 card=0x71
|
||||||
$ modprobe dvb-bt8xx
|
$ modprobe dvb-bt8xx
|
||||||
$ modprobe dst
|
$ modprobe dst
|
||||||
|
|
||||||
The value 0x71 will override the PCI type detection for dvb-bt8xx, which
|
The value 0x71 will override the PCI type detection for dvb-bt8xx,
|
||||||
is necessary for TwinHan cards.#
|
which is necessary for TwinHan cards.
|
||||||
|
|
||||||
If you're having an older card (blue color circuit) and card=0x71 locks your
|
If you're having an older card (blue color circuit) and card=0x71 locks
|
||||||
machine, try using 0x68, too. If that does not work, ask on the DVB mailing list.
|
your machine, try using 0x68, too. If that does not work, ask on the
|
||||||
|
mailing list.
|
||||||
|
|
||||||
The DST module takes a couple of useful parameters, in case the
|
The DST module takes a couple of useful parameters.
|
||||||
dst drivers fails to detect your type of card correctly.
|
|
||||||
|
|
||||||
dst_type takes values 0 (satellite), 1 (terrestial TV), 2 (cable).
|
verbose takes values 0 to 5. These values control the verbosity level.
|
||||||
|
|
||||||
dst_type_flags takes bit combined values:
|
debug takes values 0 and 1. You can either disable or enable debugging.
|
||||||
1 = new tuner type packets. You can use this if your card is detected
|
|
||||||
and you have debug and you continually see the tuner packets not
|
|
||||||
working (make sure not a basic problem like dish alignment etc.)
|
|
||||||
|
|
||||||
2 = TS 204. If your card tunes OK, but the picture is terrible, seemingly
|
dst_addons takes values 0 and 0x20. A value of 0 means it is a FTA card.
|
||||||
breaking up in one half continually, and crc fails a lot, then
|
0x20 means it has a Conditional Access slot.
|
||||||
this is worth a try (or trying to turn off)
|
|
||||||
|
|
||||||
4 = has symdiv. Some cards, mostly without new tuner packets, require
|
The autodected values are determined bythe cards 'response
|
||||||
a symbol division algorithm. Doesn't apply to terrestial TV.
|
|
||||||
|
|
||||||
You can also specify a value to have the autodetected values turned off
|
|
||||||
(e.g. 0). The autodected values are determined bythe cards 'response
|
|
||||||
string' which you can see in your logs e.g.
|
string' which you can see in your logs e.g.
|
||||||
|
|
||||||
dst_check_ci: recognize DST-MOT
|
dst_get_device_id: Recognise [DSTMCI]
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
dst_check_ci: unable to recognize DSTXCI or STXCI
|
|
||||||
|
|
||||||
--
|
--
|
||||||
Authors: Richard Walker, Jamie Honan, Michael Hunold
|
Authors: Richard Walker, Jamie Honan, Michael Hunold, Manu Abraham
|
||||||
|
|
219
Documentation/dvb/ci.txt
Normal file
219
Documentation/dvb/ci.txt
Normal file
|
@ -0,0 +1,219 @@
|
||||||
|
* For the user
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
NOTE: This document describes the usage of the high level CI API as
|
||||||
|
in accordance to the Linux DVB API. This is a not a documentation for the,
|
||||||
|
existing low level CI API.
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
To utilize the High Level CI capabilities,
|
||||||
|
|
||||||
|
(1*) This point is valid only for the Twinhan/clones
|
||||||
|
For the Twinhan/Twinhan clones, the dst_ca module handles the CI
|
||||||
|
hardware handling.This module is loaded automatically if a CI
|
||||||
|
(Common Interface, that holds the CAM (Conditional Access Module)
|
||||||
|
is detected.
|
||||||
|
|
||||||
|
(2) one requires a userspace application, ca_zap. This small userland
|
||||||
|
application is in charge of sending the descrambling related information
|
||||||
|
to the CAM.
|
||||||
|
|
||||||
|
This application requires the following to function properly as of now.
|
||||||
|
|
||||||
|
(a) Tune to a valid channel, with szap.
|
||||||
|
eg: $ szap -c channels.conf -r "TMC" -x
|
||||||
|
|
||||||
|
(b) a channels.conf containing a valid PMT PID
|
||||||
|
|
||||||
|
eg: TMC:11996:h:0:27500:278:512:650:321
|
||||||
|
|
||||||
|
here 278 is a valid PMT PID. the rest of the values are the
|
||||||
|
same ones that szap uses.
|
||||||
|
|
||||||
|
(c) after running a szap, you have to run ca_zap, for the
|
||||||
|
descrambler to function,
|
||||||
|
|
||||||
|
eg: $ ca_zap patched_channels.conf "TMC"
|
||||||
|
|
||||||
|
The patched means a patch to apply to scan, such that scan can
|
||||||
|
generate a channels.conf_with pmt, which has this PMT PID info
|
||||||
|
(NOTE: szap cannot use this channels.conf with the PMT_PID)
|
||||||
|
|
||||||
|
|
||||||
|
(d) Hopeflly Enjoy your favourite subscribed channel as you do with
|
||||||
|
a FTA card.
|
||||||
|
|
||||||
|
(3) Currently ca_zap, and dst_test, both are meant for demonstration
|
||||||
|
purposes only, they can become full fledged applications if necessary.
|
||||||
|
|
||||||
|
|
||||||
|
* Cards that fall in this category
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
At present the cards that fall in this category are the Twinhan and it's
|
||||||
|
clones, these cards are available as VVMER, Tomato, Hercules, Orange and
|
||||||
|
so on.
|
||||||
|
|
||||||
|
* CI modules that are supported
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
The CI module support is largely dependant upon the firmware on the cards
|
||||||
|
Some cards do support almost all of the available CI modules. There is
|
||||||
|
nothing much that can be done in order to make additional CI modules
|
||||||
|
working with these cards.
|
||||||
|
|
||||||
|
Modules that have been tested by this driver at present are
|
||||||
|
|
||||||
|
(1) Irdeto 1 and 2 from SCM
|
||||||
|
(2) Viaccess from SCM
|
||||||
|
(3) Dragoncam
|
||||||
|
|
||||||
|
* The High level CI API
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
|
||||||
|
* For the programmer
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
With the High Level CI approach any new card with almost any random
|
||||||
|
architecture can be implemented with this style, the definitions
|
||||||
|
insidethe switch statement can be easily adapted for any card, thereby
|
||||||
|
eliminating the need for any additional ioctls.
|
||||||
|
|
||||||
|
The disadvantage is that the driver/hardware has to manage the rest. For
|
||||||
|
the application programmer it would be as simple as sending/receiving an
|
||||||
|
array to/from the CI ioctls as defined in the Linux DVB API. No changes
|
||||||
|
have been made in the API to accomodate this feature.
|
||||||
|
|
||||||
|
|
||||||
|
* Why the need for another CI interface ?
|
||||||
|
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||||
|
This is one of the most commonly asked question. Well a nice question.
|
||||||
|
Strictly speaking this is not a new interface.
|
||||||
|
|
||||||
|
The CI interface is defined in the DVB API in ca.h as
|
||||||
|
|
||||||
|
typedef struct ca_slot_info {
|
||||||
|
int num; /* slot number */
|
||||||
|
|
||||||
|
int type; /* CA interface this slot supports */
|
||||||
|
#define CA_CI 1 /* CI high level interface */
|
||||||
|
#define CA_CI_LINK 2 /* CI link layer level interface */
|
||||||
|
#define CA_CI_PHYS 4 /* CI physical layer level interface */
|
||||||
|
#define CA_DESCR 8 /* built-in descrambler */
|
||||||
|
#define CA_SC 128 /* simple smart card interface */
|
||||||
|
|
||||||
|
unsigned int flags;
|
||||||
|
#define CA_CI_MODULE_PRESENT 1 /* module (or card) inserted */
|
||||||
|
#define CA_CI_MODULE_READY 2
|
||||||
|
} ca_slot_info_t;
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
This CI interface follows the CI high level interface, which is not
|
||||||
|
implemented by most applications. Hence this area is revisited.
|
||||||
|
|
||||||
|
This CI interface is quite different in the case that it tries to
|
||||||
|
accomodate all other CI based devices, that fall into the other categories
|
||||||
|
|
||||||
|
This means that this CI interface handles the EN50221 style tags in the
|
||||||
|
Application layer only and no session management is taken care of by the
|
||||||
|
application. The driver/hardware will take care of all that.
|
||||||
|
|
||||||
|
This interface is purely an EN50221 interface exchanging APDU's. This
|
||||||
|
means that no session management, link layer or a transport layer do
|
||||||
|
exist in this case in the application to driver communication. It is
|
||||||
|
as simple as that. The driver/hardware has to take care of that.
|
||||||
|
|
||||||
|
|
||||||
|
With this High Level CI interface, the interface can be defined with the
|
||||||
|
regular ioctls.
|
||||||
|
|
||||||
|
All these ioctls are also valid for the High level CI interface
|
||||||
|
|
||||||
|
#define CA_RESET _IO('o', 128)
|
||||||
|
#define CA_GET_CAP _IOR('o', 129, ca_caps_t)
|
||||||
|
#define CA_GET_SLOT_INFO _IOR('o', 130, ca_slot_info_t)
|
||||||
|
#define CA_GET_DESCR_INFO _IOR('o', 131, ca_descr_info_t)
|
||||||
|
#define CA_GET_MSG _IOR('o', 132, ca_msg_t)
|
||||||
|
#define CA_SEND_MSG _IOW('o', 133, ca_msg_t)
|
||||||
|
#define CA_SET_DESCR _IOW('o', 134, ca_descr_t)
|
||||||
|
#define CA_SET_PID _IOW('o', 135, ca_pid_t)
|
||||||
|
|
||||||
|
|
||||||
|
On querying the device, the device yields information thus
|
||||||
|
|
||||||
|
CA_GET_SLOT_INFO
|
||||||
|
----------------------------
|
||||||
|
Command = [info]
|
||||||
|
APP: Number=[1]
|
||||||
|
APP: Type=[1]
|
||||||
|
APP: flags=[1]
|
||||||
|
APP: CI High level interface
|
||||||
|
APP: CA/CI Module Present
|
||||||
|
|
||||||
|
CA_GET_CAP
|
||||||
|
----------------------------
|
||||||
|
Command = [caps]
|
||||||
|
APP: Slots=[1]
|
||||||
|
APP: Type=[1]
|
||||||
|
APP: Descrambler keys=[16]
|
||||||
|
APP: Type=[1]
|
||||||
|
|
||||||
|
CA_SEND_MSG
|
||||||
|
----------------------------
|
||||||
|
Descriptors(Program Level)=[ 09 06 06 04 05 50 ff f1]
|
||||||
|
Found CA descriptor @ program level
|
||||||
|
|
||||||
|
(20) ES type=[2] ES pid=[201] ES length =[0 (0x0)]
|
||||||
|
(25) ES type=[4] ES pid=[301] ES length =[0 (0x0)]
|
||||||
|
ca_message length is 25 (0x19) bytes
|
||||||
|
EN50221 CA MSG=[ 9f 80 32 19 03 01 2d d1 f0 08 01 09 06 06 04 05 50 ff f1 02 e0 c9 00 00 04 e1 2d 00 00]
|
||||||
|
|
||||||
|
|
||||||
|
Not all ioctl's are implemented in the driver from the API, the other
|
||||||
|
features of the hardware that cannot be implemented by the API are achieved
|
||||||
|
using the CA_GET_MSG and CA_SEND_MSG ioctls. An EN50221 style wrapper is
|
||||||
|
used to exchange the data to maintain compatibility with other hardware.
|
||||||
|
|
||||||
|
|
||||||
|
/* a message to/from a CI-CAM */
|
||||||
|
typedef struct ca_msg {
|
||||||
|
unsigned int index;
|
||||||
|
unsigned int type;
|
||||||
|
unsigned int length;
|
||||||
|
unsigned char msg[256];
|
||||||
|
} ca_msg_t;
|
||||||
|
|
||||||
|
|
||||||
|
The flow of data can be described thus,
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
App (User)
|
||||||
|
-----
|
||||||
|
parse
|
||||||
|
|
|
||||||
|
|
|
||||||
|
v
|
||||||
|
en50221 APDU (package)
|
||||||
|
--------------------------------------
|
||||||
|
| | | High Level CI driver
|
||||||
|
| | |
|
||||||
|
| v |
|
||||||
|
| en50221 APDU (unpackage) |
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
| v |
|
||||||
|
| sanity checks |
|
||||||
|
| | |
|
||||||
|
| | |
|
||||||
|
| v |
|
||||||
|
| do (H/W dep) |
|
||||||
|
--------------------------------------
|
||||||
|
| Hardware
|
||||||
|
|
|
||||||
|
v
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
The High Level CI interface uses the EN50221 DVB standard, following a
|
||||||
|
standard ensures futureproofness.
|
|
@ -107,7 +107,7 @@ sub tda10045 {
|
||||||
sub tda10046 {
|
sub tda10046 {
|
||||||
my $sourcefile = "tt_budget_217g.zip";
|
my $sourcefile = "tt_budget_217g.zip";
|
||||||
my $url = "http://www.technotrend.de/new/217g/$sourcefile";
|
my $url = "http://www.technotrend.de/new/217g/$sourcefile";
|
||||||
my $hash = "a25b579e37109af60f4a36c37893957c";
|
my $hash = "6a7e1e2f2644b162ff0502367553c72d";
|
||||||
my $outfile = "dvb-fe-tda10046.fw";
|
my $outfile = "dvb-fe-tda10046.fw";
|
||||||
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
my $tmpdir = tempdir(DIR => "/tmp", CLEANUP => 1);
|
||||||
|
|
||||||
|
@ -115,7 +115,7 @@ sub tda10046 {
|
||||||
|
|
||||||
wgetfile($sourcefile, $url);
|
wgetfile($sourcefile, $url);
|
||||||
unzip($sourcefile, $tmpdir);
|
unzip($sourcefile, $tmpdir);
|
||||||
extract("$tmpdir/software/OEM/PCI/App/ttlcdacc.dll", 0x3f731, 24479, "$tmpdir/fwtmp");
|
extract("$tmpdir/software/OEM/PCI/App/ttlcdacc.dll", 0x3f731, 24478, "$tmpdir/fwtmp");
|
||||||
verify("$tmpdir/fwtmp", $hash);
|
verify("$tmpdir/fwtmp", $hash);
|
||||||
copy("$tmpdir/fwtmp", $outfile);
|
copy("$tmpdir/fwtmp", $outfile);
|
||||||
|
|
||||||
|
|
|
@ -63,3 +63,23 @@ Why: Outside of Linux, the only implementations of anything even
|
||||||
people, who might be using implementations that I am not aware
|
people, who might be using implementations that I am not aware
|
||||||
of, to adjust to this upcoming change.
|
of, to adjust to this upcoming change.
|
||||||
Who: Paul E. McKenney <paulmck@us.ibm.com>
|
Who: Paul E. McKenney <paulmck@us.ibm.com>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: IEEE1394 Audio and Music Data Transmission Protocol driver,
|
||||||
|
Connection Management Procedures driver
|
||||||
|
When: November 2005
|
||||||
|
Files: drivers/ieee1394/{amdtp,cmp}*
|
||||||
|
Why: These are incomplete, have never worked, and are better implemented
|
||||||
|
in userland via raw1394 (see http://freebob.sourceforge.net/ for
|
||||||
|
example.)
|
||||||
|
Who: Jody McIntyre <scjody@steamballoon.com>
|
||||||
|
|
||||||
|
---------------------------
|
||||||
|
|
||||||
|
What: raw1394: requests of type RAW1394_REQ_ISO_SEND, RAW1394_REQ_ISO_LISTEN
|
||||||
|
When: November 2005
|
||||||
|
Why: Deprecated in favour of the new ioctl-based rawiso interface, which is
|
||||||
|
more efficient. You should really be using libraw1394 for raw1394
|
||||||
|
access anyway.
|
||||||
|
Who: Jody McIntyre <scjody@steamballoon.com>
|
||||||
|
|
|
@ -7,7 +7,6 @@ that support it. For example, a given bus might look like this:
|
||||||
|-- 0000:17:00.0
|
|-- 0000:17:00.0
|
||||||
| |-- class
|
| |-- class
|
||||||
| |-- config
|
| |-- config
|
||||||
| |-- detach_state
|
|
||||||
| |-- device
|
| |-- device
|
||||||
| |-- irq
|
| |-- irq
|
||||||
| |-- local_cpus
|
| |-- local_cpus
|
||||||
|
@ -19,7 +18,7 @@ that support it. For example, a given bus might look like this:
|
||||||
| |-- subsystem_device
|
| |-- subsystem_device
|
||||||
| |-- subsystem_vendor
|
| |-- subsystem_vendor
|
||||||
| `-- vendor
|
| `-- vendor
|
||||||
`-- detach_state
|
`-- ...
|
||||||
|
|
||||||
The topmost element describes the PCI domain and bus number. In this case,
|
The topmost element describes the PCI domain and bus number. In this case,
|
||||||
the domain number is 0000 and the bus number is 17 (both values are in hex).
|
the domain number is 0000 and the bus number is 17 (both values are in hex).
|
||||||
|
@ -31,7 +30,6 @@ files, each with their own function.
|
||||||
---- --------
|
---- --------
|
||||||
class PCI class (ascii, ro)
|
class PCI class (ascii, ro)
|
||||||
config PCI config space (binary, rw)
|
config PCI config space (binary, rw)
|
||||||
detach_state connection status (bool, rw)
|
|
||||||
device PCI device (ascii, ro)
|
device PCI device (ascii, ro)
|
||||||
irq IRQ number (ascii, ro)
|
irq IRQ number (ascii, ro)
|
||||||
local_cpus nearby CPU mask (cpumask, ro)
|
local_cpus nearby CPU mask (cpumask, ro)
|
||||||
|
@ -85,4 +83,4 @@ useful return codes should be provided.
|
||||||
|
|
||||||
Legacy resources are protected by the HAVE_PCI_LEGACY define. Platforms
|
Legacy resources are protected by the HAVE_PCI_LEGACY define. Platforms
|
||||||
wishing to support legacy functionality should define it and provide
|
wishing to support legacy functionality should define it and provide
|
||||||
pci_legacy_read, pci_legacy_write and pci_mmap_legacy_page_range functions.
|
pci_legacy_read, pci_legacy_write and pci_mmap_legacy_page_range functions.
|
||||||
|
|
|
@ -178,10 +178,9 @@ Released 1994-06-13
|
||||||
7. ACKNOWLEDGMENTS.
|
7. ACKNOWLEDGMENTS.
|
||||||
|
|
||||||
These drivers wouldn't have been done without the base
|
These drivers wouldn't have been done without the base
|
||||||
(and support) from Ross Biro <bir7@leland.stanford.edu>,
|
(and support) from Ross Biro, and D-Link Systems Inc.
|
||||||
and D-Link Systems Inc. The driver relies upon GPL-ed
|
The driver relies upon GPL-ed source from D-Link Systems Inc.
|
||||||
source from D-Link Systems Inc. and from Russel Nelson at
|
and from Russel Nelson at Crynwr Software <nelson@crynwr.com>.
|
||||||
Crynwr Software <nelson@crynwr.com>.
|
|
||||||
|
|
||||||
Additional input also from:
|
Additional input also from:
|
||||||
Donald Becker <becker@super.org>, Alan Cox <A.Cox@swansea.ac.uk>
|
Donald Becker <becker@super.org>, Alan Cox <A.Cox@swansea.ac.uk>
|
||||||
|
|
|
@ -207,27 +207,6 @@ SYSTEM_SHUTDOWN, I do not understand this one too much. probably event
|
||||||
#READY_AFTER_RESUME
|
#READY_AFTER_RESUME
|
||||||
#
|
#
|
||||||
|
|
||||||
Driver Detach Power Management
|
|
||||||
|
|
||||||
The kernel now supports the ability to place a device in a low-power
|
|
||||||
state when it is detached from its driver, which happens when its
|
|
||||||
module is removed.
|
|
||||||
|
|
||||||
Each device contains a 'detach_state' file in its sysfs directory
|
|
||||||
which can be used to control this state. Reading from this file
|
|
||||||
displays what the current detach state is set to. This is 0 (On) by
|
|
||||||
default. A user may write a positive integer value to this file in the
|
|
||||||
range of 1-4 inclusive.
|
|
||||||
|
|
||||||
A value of 1-3 will indicate the device should be placed in that
|
|
||||||
low-power state, which will cause ->suspend() to be called for that
|
|
||||||
device. A value of 4 indicates that the device should be shutdown, so
|
|
||||||
->shutdown() will be called for that device.
|
|
||||||
|
|
||||||
The driver is responsible for reinitializing the device when the
|
|
||||||
module is re-inserted during it's ->probe() (or equivalent) method.
|
|
||||||
The driver core will not call any extra functions when binding the
|
|
||||||
device to the driver.
|
|
||||||
|
|
||||||
pm_message_t meaning
|
pm_message_t meaning
|
||||||
|
|
||||||
|
|
|
@ -347,8 +347,8 @@ address that is created by firmware. An example vty-server sysfs entry
|
||||||
looks like the following:
|
looks like the following:
|
||||||
|
|
||||||
Pow5:/sys/bus/vio/drivers/hvcs/30000004 # ls
|
Pow5:/sys/bus/vio/drivers/hvcs/30000004 # ls
|
||||||
. current_vty devspec name partner_vtys
|
. current_vty devspec name partner_vtys
|
||||||
.. detach_state index partner_clcs vterm_state
|
.. index partner_clcs vterm_state
|
||||||
|
|
||||||
Each entry is provided, by default with a "name" attribute. Reading the
|
Each entry is provided, by default with a "name" attribute. Reading the
|
||||||
"name" attribute will reveal the device type as shown in the following
|
"name" attribute will reveal the device type as shown in the following
|
||||||
|
|
|
@ -25,6 +25,9 @@ APICs
|
||||||
|
|
||||||
noapictimer Don't set up the APIC timer
|
noapictimer Don't set up the APIC timer
|
||||||
|
|
||||||
|
no_timer_check Don't check the IO-APIC timer. This can work around
|
||||||
|
problems with incorrect timer initialization on some boards.
|
||||||
|
|
||||||
Early Console
|
Early Console
|
||||||
|
|
||||||
syntax: earlyprintk=vga
|
syntax: earlyprintk=vga
|
||||||
|
|
14
MAINTAINERS
14
MAINTAINERS
|
@ -239,6 +239,12 @@ L: linux-usb-devel@lists.sourceforge.net
|
||||||
W: http://www.linux-usb.org/SpeedTouch/
|
W: http://www.linux-usb.org/SpeedTouch/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
|
ALI1563 I2C DRIVER
|
||||||
|
P: Rudolf Marek
|
||||||
|
M: r.marek@sh.cvut.cz
|
||||||
|
L: sensors@stimpy.netroedge.com
|
||||||
|
S: Maintained
|
||||||
|
|
||||||
ALPHA PORT
|
ALPHA PORT
|
||||||
P: Richard Henderson
|
P: Richard Henderson
|
||||||
M: rth@twiddle.net
|
M: rth@twiddle.net
|
||||||
|
@ -1023,8 +1029,8 @@ W: http://www.ia64-linux.org/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
SN-IA64 (Itanium) SUB-PLATFORM
|
SN-IA64 (Itanium) SUB-PLATFORM
|
||||||
P: Jesse Barnes
|
P: Greg Edwards
|
||||||
M: jbarnes@sgi.com
|
M: edwardsg@sgi.com
|
||||||
L: linux-altix@sgi.com
|
L: linux-altix@sgi.com
|
||||||
L: linux-ia64@vger.kernel.org
|
L: linux-ia64@vger.kernel.org
|
||||||
W: http://www.sgi.com/altix
|
W: http://www.sgi.com/altix
|
||||||
|
@ -1699,7 +1705,9 @@ P: Pavel Roskin
|
||||||
M: proski@gnu.org
|
M: proski@gnu.org
|
||||||
P: David Gibson
|
P: David Gibson
|
||||||
M: hermes@gibson.dropbear.id.au
|
M: hermes@gibson.dropbear.id.au
|
||||||
W: http://www.ozlabs.org/people/dgibson/dldwd
|
L: orinoco-users@lists.sourceforge.net
|
||||||
|
L: orinoco-devel@lists.sourceforge.net
|
||||||
|
W: http://www.nongnu.org/orinoco/
|
||||||
S: Maintained
|
S: Maintained
|
||||||
|
|
||||||
PARALLEL PORT SUPPORT
|
PARALLEL PORT SUPPORT
|
||||||
|
|
4
Makefile
4
Makefile
|
@ -1,7 +1,7 @@
|
||||||
VERSION = 2
|
VERSION = 2
|
||||||
PATCHLEVEL = 6
|
PATCHLEVEL = 6
|
||||||
SUBLEVEL = 12
|
SUBLEVEL = 12
|
||||||
EXTRAVERSION =-rc3
|
EXTRAVERSION =-rc5
|
||||||
NAME=Woozy Numbat
|
NAME=Woozy Numbat
|
||||||
|
|
||||||
# *DOCUMENTATION*
|
# *DOCUMENTATION*
|
||||||
|
@ -530,7 +530,7 @@ endif
|
||||||
include $(srctree)/arch/$(ARCH)/Makefile
|
include $(srctree)/arch/$(ARCH)/Makefile
|
||||||
|
|
||||||
# arch Makefile may override CC so keep this after arch Makefile is included
|
# arch Makefile may override CC so keep this after arch Makefile is included
|
||||||
NOSTDINC_FLAGS := -nostdinc -isystem $(shell $(CC) -print-file-name=include)
|
NOSTDINC_FLAGS += -nostdinc -isystem $(shell $(CC) -print-file-name=include)
|
||||||
CHECKFLAGS += $(NOSTDINC_FLAGS)
|
CHECKFLAGS += $(NOSTDINC_FLAGS)
|
||||||
|
|
||||||
# warn about C99 declaration after statement
|
# warn about C99 declaration after statement
|
||||||
|
|
|
@ -1150,16 +1150,13 @@ osf_usleep_thread(struct timeval32 __user *sleep, struct timeval32 __user *remai
|
||||||
if (get_tv32(&tmp, sleep))
|
if (get_tv32(&tmp, sleep))
|
||||||
goto fault;
|
goto fault;
|
||||||
|
|
||||||
ticks = tmp.tv_usec;
|
ticks = timeval_to_jiffies(&tmp);
|
||||||
ticks = (ticks + (1000000 / HZ) - 1) / (1000000 / HZ);
|
|
||||||
ticks += tmp.tv_sec * HZ;
|
|
||||||
|
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
current->state = TASK_INTERRUPTIBLE;
|
||||||
ticks = schedule_timeout(ticks);
|
ticks = schedule_timeout(ticks);
|
||||||
|
|
||||||
if (remain) {
|
if (remain) {
|
||||||
tmp.tv_sec = ticks / HZ;
|
jiffies_to_timeval(ticks, &tmp);
|
||||||
tmp.tv_usec = ticks % HZ;
|
|
||||||
if (put_tv32(remain, &tmp))
|
if (put_tv32(remain, &tmp))
|
||||||
goto fault;
|
goto fault;
|
||||||
}
|
}
|
||||||
|
|
|
@ -85,6 +85,7 @@ choice
|
||||||
config ARCH_CLPS7500
|
config ARCH_CLPS7500
|
||||||
bool "Cirrus-CL-PS7500FE"
|
bool "Cirrus-CL-PS7500FE"
|
||||||
select TIMER_ACORN
|
select TIMER_ACORN
|
||||||
|
select ISA
|
||||||
|
|
||||||
config ARCH_CLPS711X
|
config ARCH_CLPS711X
|
||||||
bool "CLPS711x/EP721x-based"
|
bool "CLPS711x/EP721x-based"
|
||||||
|
@ -96,6 +97,7 @@ config ARCH_CO285
|
||||||
|
|
||||||
config ARCH_EBSA110
|
config ARCH_EBSA110
|
||||||
bool "EBSA-110"
|
bool "EBSA-110"
|
||||||
|
select ISA
|
||||||
help
|
help
|
||||||
This is an evaluation board for the StrongARM processor available
|
This is an evaluation board for the StrongARM processor available
|
||||||
from Digital. It has limited hardware on-board, including an onboard
|
from Digital. It has limited hardware on-board, including an onboard
|
||||||
|
@ -120,13 +122,16 @@ config ARCH_INTEGRATOR
|
||||||
|
|
||||||
config ARCH_IOP3XX
|
config ARCH_IOP3XX
|
||||||
bool "IOP3xx-based"
|
bool "IOP3xx-based"
|
||||||
|
select PCI
|
||||||
|
|
||||||
config ARCH_IXP4XX
|
config ARCH_IXP4XX
|
||||||
bool "IXP4xx-based"
|
bool "IXP4xx-based"
|
||||||
select DMABOUNCE
|
select DMABOUNCE
|
||||||
|
select PCI
|
||||||
|
|
||||||
config ARCH_IXP2000
|
config ARCH_IXP2000
|
||||||
bool "IXP2400/2800-based"
|
bool "IXP2400/2800-based"
|
||||||
|
select PCI
|
||||||
|
|
||||||
config ARCH_L7200
|
config ARCH_L7200
|
||||||
bool "LinkUp-L7200"
|
bool "LinkUp-L7200"
|
||||||
|
@ -155,6 +160,8 @@ config ARCH_RPC
|
||||||
|
|
||||||
config ARCH_SA1100
|
config ARCH_SA1100
|
||||||
bool "SA1100-based"
|
bool "SA1100-based"
|
||||||
|
select ISA
|
||||||
|
select DISCONTIGMEM
|
||||||
|
|
||||||
config ARCH_S3C2410
|
config ARCH_S3C2410
|
||||||
bool "Samsung S3C2410"
|
bool "Samsung S3C2410"
|
||||||
|
@ -165,6 +172,9 @@ config ARCH_S3C2410
|
||||||
|
|
||||||
config ARCH_SHARK
|
config ARCH_SHARK
|
||||||
bool "Shark"
|
bool "Shark"
|
||||||
|
select ISA
|
||||||
|
select ISA_DMA
|
||||||
|
select PCI
|
||||||
|
|
||||||
config ARCH_LH7A40X
|
config ARCH_LH7A40X
|
||||||
bool "Sharp LH7A40X"
|
bool "Sharp LH7A40X"
|
||||||
|
@ -252,8 +262,6 @@ config ARM_AMBA
|
||||||
|
|
||||||
config ISA
|
config ISA
|
||||||
bool
|
bool
|
||||||
depends on FOOTBRIDGE_HOST || ARCH_SHARK || ARCH_CLPS7500 || ARCH_EBSA110 || ARCH_CDB89712 || ARCH_EDB7211 || ARCH_SA1100 || ARCH_MX1ADS
|
|
||||||
default y
|
|
||||||
help
|
help
|
||||||
Find out whether you have ISA slots on your motherboard. ISA is the
|
Find out whether you have ISA slots on your motherboard. ISA is the
|
||||||
name of a bus system, i.e. the way the CPU talks to the other stuff
|
name of a bus system, i.e. the way the CPU talks to the other stuff
|
||||||
|
@ -263,8 +271,6 @@ config ISA
|
||||||
|
|
||||||
config ISA_DMA
|
config ISA_DMA
|
||||||
bool
|
bool
|
||||||
depends on FOOTBRIDGE_HOST || ARCH_SHARK
|
|
||||||
default y
|
|
||||||
|
|
||||||
config ISA_DMA_API
|
config ISA_DMA_API
|
||||||
bool
|
bool
|
||||||
|
@ -272,7 +278,6 @@ config ISA_DMA_API
|
||||||
|
|
||||||
config PCI
|
config PCI
|
||||||
bool "PCI support" if ARCH_INTEGRATOR_AP
|
bool "PCI support" if ARCH_INTEGRATOR_AP
|
||||||
default y if ARCH_SHARK || FOOTBRIDGE_HOST || ARCH_IOP3XX || ARCH_IXP4XX || ARCH_IXP2000
|
|
||||||
help
|
help
|
||||||
Find out whether you have a PCI motherboard. PCI is the name of a
|
Find out whether you have a PCI motherboard. PCI is the name of a
|
||||||
bus system, i.e. the way the CPU talks to the other stuff inside
|
bus system, i.e. the way the CPU talks to the other stuff inside
|
||||||
|
@ -300,7 +305,7 @@ menu "Kernel Features"
|
||||||
|
|
||||||
config SMP
|
config SMP
|
||||||
bool "Symmetric Multi-Processing (EXPERIMENTAL)"
|
bool "Symmetric Multi-Processing (EXPERIMENTAL)"
|
||||||
depends on EXPERIMENTAL && n
|
depends on EXPERIMENTAL #&& n
|
||||||
help
|
help
|
||||||
This enables support for systems with more than one CPU. If you have
|
This enables support for systems with more than one CPU. If you have
|
||||||
a system with only one CPU, like most personal computers, say N. If
|
a system with only one CPU, like most personal computers, say N. If
|
||||||
|
@ -340,8 +345,7 @@ config PREEMPT
|
||||||
|
|
||||||
config DISCONTIGMEM
|
config DISCONTIGMEM
|
||||||
bool
|
bool
|
||||||
depends on ARCH_EDB7211 || ARCH_SA1100 || (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
|
default (ARCH_LH7A40X && !LH7A40X_CONTIGMEM)
|
||||||
default y
|
|
||||||
help
|
help
|
||||||
Say Y to support efficient handling of discontiguous physical memory,
|
Say Y to support efficient handling of discontiguous physical memory,
|
||||||
for architectures which are either NUMA (Non-Uniform Memory Access)
|
for architectures which are either NUMA (Non-Uniform Memory Access)
|
||||||
|
|
|
@ -17,8 +17,8 @@
|
||||||
|
|
||||||
#include <asm/glue.h>
|
#include <asm/glue.h>
|
||||||
#include <asm/vfpmacros.h>
|
#include <asm/vfpmacros.h>
|
||||||
#include <asm/hardware.h> @ should be moved into entry-macro.S
|
#include <asm/hardware.h> /* should be moved into entry-macro.S */
|
||||||
#include <asm/arch/irqs.h> @ should be moved into entry-macro.S
|
#include <asm/arch/irqs.h> /* should be moved into entry-macro.S */
|
||||||
#include <asm/arch/entry-macro.S>
|
#include <asm/arch/entry-macro.S>
|
||||||
|
|
||||||
#include "entry-header.S"
|
#include "entry-header.S"
|
||||||
|
@ -505,9 +505,9 @@ ENTRY(__switch_to)
|
||||||
mra r4, r5, acc0
|
mra r4, r5, acc0
|
||||||
stmia ip, {r4, r5}
|
stmia ip, {r4, r5}
|
||||||
#endif
|
#endif
|
||||||
#ifdef CONFIG_HAS_TLS_REG
|
#if defined(CONFIG_HAS_TLS_REG)
|
||||||
mcr p15, 0, r3, c13, c0, 3 @ set TLS register
|
mcr p15, 0, r3, c13, c0, 3 @ set TLS register
|
||||||
#else
|
#elif !defined(CONFIG_TLS_REG_EMUL)
|
||||||
mov r4, #0xffff0fff
|
mov r4, #0xffff0fff
|
||||||
str r3, [r4, #-15] @ TLS val at 0xffff0ff0
|
str r3, [r4, #-15] @ TLS val at 0xffff0ff0
|
||||||
#endif
|
#endif
|
||||||
|
@ -690,11 +690,7 @@ __kuser_cmpxchg: @ 0xffff0fc0
|
||||||
|
|
||||||
__kuser_get_tls: @ 0xffff0fe0
|
__kuser_get_tls: @ 0xffff0fe0
|
||||||
|
|
||||||
#ifndef CONFIG_HAS_TLS_REG
|
#if !defined(CONFIG_HAS_TLS_REG) && !defined(CONFIG_TLS_REG_EMUL)
|
||||||
|
|
||||||
#ifdef CONFIG_SMP /* sanity check */
|
|
||||||
#error "CONFIG_SMP without CONFIG_HAS_TLS_REG is wrong"
|
|
||||||
#endif
|
|
||||||
|
|
||||||
ldr r0, [pc, #(16 - 8)] @ TLS stored at 0xffff0ff0
|
ldr r0, [pc, #(16 - 8)] @ TLS stored at 0xffff0ff0
|
||||||
mov pc, lr
|
mov pc, lr
|
||||||
|
|
|
@ -19,6 +19,7 @@
|
||||||
#include <asm/procinfo.h>
|
#include <asm/procinfo.h>
|
||||||
#include <asm/ptrace.h>
|
#include <asm/ptrace.h>
|
||||||
#include <asm/constants.h>
|
#include <asm/constants.h>
|
||||||
|
#include <asm/thread_info.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
|
||||||
#define PROCINFO_MMUFLAGS 8
|
#define PROCINFO_MMUFLAGS 8
|
||||||
|
@ -131,7 +132,7 @@ __switch_data:
|
||||||
.long processor_id @ r4
|
.long processor_id @ r4
|
||||||
.long __machine_arch_type @ r5
|
.long __machine_arch_type @ r5
|
||||||
.long cr_alignment @ r6
|
.long cr_alignment @ r6
|
||||||
.long init_thread_union+8192 @ sp
|
.long init_thread_union + THREAD_START_SP @ sp
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* The following fragment of code is executed with the MMU on, and uses
|
* The following fragment of code is executed with the MMU on, and uses
|
||||||
|
|
|
@ -256,8 +256,6 @@ static unsigned long *thread_info_head;
|
||||||
static unsigned int nr_thread_info;
|
static unsigned int nr_thread_info;
|
||||||
|
|
||||||
#define EXTRA_TASK_STRUCT 4
|
#define EXTRA_TASK_STRUCT 4
|
||||||
#define ll_alloc_task_struct() ((struct thread_info *) __get_free_pages(GFP_KERNEL,1))
|
|
||||||
#define ll_free_task_struct(p) free_pages((unsigned long)(p),1)
|
|
||||||
|
|
||||||
struct thread_info *alloc_thread_info(struct task_struct *task)
|
struct thread_info *alloc_thread_info(struct task_struct *task)
|
||||||
{
|
{
|
||||||
|
@ -274,17 +272,16 @@ struct thread_info *alloc_thread_info(struct task_struct *task)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!thread)
|
if (!thread)
|
||||||
thread = ll_alloc_task_struct();
|
thread = (struct thread_info *)
|
||||||
|
__get_free_pages(GFP_KERNEL, THREAD_SIZE_ORDER);
|
||||||
|
|
||||||
#ifdef CONFIG_MAGIC_SYSRQ
|
#ifdef CONFIG_DEBUG_STACK_USAGE
|
||||||
/*
|
/*
|
||||||
* The stack must be cleared if you want SYSRQ-T to
|
* The stack must be cleared if you want SYSRQ-T to
|
||||||
* give sensible stack usage information
|
* give sensible stack usage information
|
||||||
*/
|
*/
|
||||||
if (thread) {
|
if (thread)
|
||||||
char *p = (char *)thread;
|
memzero(thread, THREAD_SIZE);
|
||||||
memzero(p+KERNEL_STACK_SIZE, KERNEL_STACK_SIZE);
|
|
||||||
}
|
|
||||||
#endif
|
#endif
|
||||||
return thread;
|
return thread;
|
||||||
}
|
}
|
||||||
|
@ -297,7 +294,7 @@ void free_thread_info(struct thread_info *thread)
|
||||||
thread_info_head = p;
|
thread_info_head = p;
|
||||||
nr_thread_info += 1;
|
nr_thread_info += 1;
|
||||||
} else
|
} else
|
||||||
ll_free_task_struct(thread);
|
free_pages((unsigned long)thread, THREAD_SIZE_ORDER);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -350,7 +347,7 @@ copy_thread(int nr, unsigned long clone_flags, unsigned long stack_start,
|
||||||
struct thread_info *thread = p->thread_info;
|
struct thread_info *thread = p->thread_info;
|
||||||
struct pt_regs *childregs;
|
struct pt_regs *childregs;
|
||||||
|
|
||||||
childregs = ((struct pt_regs *)((unsigned long)thread + THREAD_SIZE - 8)) - 1;
|
childregs = ((struct pt_regs *)((unsigned long)thread + THREAD_START_SP)) - 1;
|
||||||
*childregs = *regs;
|
*childregs = *regs;
|
||||||
childregs->ARM_r0 = 0;
|
childregs->ARM_r0 = 0;
|
||||||
childregs->ARM_sp = stack_start;
|
childregs->ARM_sp = stack_start;
|
||||||
|
@ -447,15 +444,17 @@ EXPORT_SYMBOL(kernel_thread);
|
||||||
unsigned long get_wchan(struct task_struct *p)
|
unsigned long get_wchan(struct task_struct *p)
|
||||||
{
|
{
|
||||||
unsigned long fp, lr;
|
unsigned long fp, lr;
|
||||||
unsigned long stack_page;
|
unsigned long stack_start, stack_end;
|
||||||
int count = 0;
|
int count = 0;
|
||||||
if (!p || p == current || p->state == TASK_RUNNING)
|
if (!p || p == current || p->state == TASK_RUNNING)
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
stack_page = 4096 + (unsigned long)p->thread_info;
|
stack_start = (unsigned long)(p->thread_info + 1);
|
||||||
|
stack_end = ((unsigned long)p->thread_info) + THREAD_SIZE;
|
||||||
|
|
||||||
fp = thread_saved_fp(p);
|
fp = thread_saved_fp(p);
|
||||||
do {
|
do {
|
||||||
if (fp < stack_page || fp > 4092+stack_page)
|
if (fp < stack_start || fp > stack_end)
|
||||||
return 0;
|
return 0;
|
||||||
lr = pc_pointer (((unsigned long *)fp)[-1]);
|
lr = pc_pointer (((unsigned long *)fp)[-1]);
|
||||||
if (!in_sched_functions(lr))
|
if (!in_sched_functions(lr))
|
||||||
|
|
|
@ -302,7 +302,7 @@ long execve(const char *filename, char **argv, char **envp)
|
||||||
"b ret_to_user"
|
"b ret_to_user"
|
||||||
:
|
:
|
||||||
: "r" (current_thread_info()),
|
: "r" (current_thread_info()),
|
||||||
"Ir" (THREAD_SIZE - 8 - sizeof(regs)),
|
"Ir" (THREAD_START_SP - sizeof(regs)),
|
||||||
"r" (®s),
|
"r" (®s),
|
||||||
"Ir" (sizeof(regs))
|
"Ir" (sizeof(regs))
|
||||||
: "r0", "r1", "r2", "r3", "ip", "memory");
|
: "r0", "r1", "r2", "r3", "ip", "memory");
|
||||||
|
|
|
@ -218,7 +218,8 @@ NORET_TYPE void die(const char *str, struct pt_regs *regs, int err)
|
||||||
tsk->comm, tsk->pid, tsk->thread_info + 1);
|
tsk->comm, tsk->pid, tsk->thread_info + 1);
|
||||||
|
|
||||||
if (!user_mode(regs) || in_interrupt()) {
|
if (!user_mode(regs) || in_interrupt()) {
|
||||||
dump_mem("Stack: ", regs->ARM_sp, 8192+(unsigned long)tsk->thread_info);
|
dump_mem("Stack: ", regs->ARM_sp,
|
||||||
|
THREAD_SIZE + (unsigned long)tsk->thread_info);
|
||||||
dump_backtrace(regs, tsk);
|
dump_backtrace(regs, tsk);
|
||||||
dump_instr(regs);
|
dump_instr(regs);
|
||||||
}
|
}
|
||||||
|
@ -450,9 +451,9 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
||||||
|
|
||||||
case NR(set_tls):
|
case NR(set_tls):
|
||||||
thread->tp_value = regs->ARM_r0;
|
thread->tp_value = regs->ARM_r0;
|
||||||
#ifdef CONFIG_HAS_TLS_REG
|
#if defined(CONFIG_HAS_TLS_REG)
|
||||||
asm ("mcr p15, 0, %0, c13, c0, 3" : : "r" (regs->ARM_r0) );
|
asm ("mcr p15, 0, %0, c13, c0, 3" : : "r" (regs->ARM_r0) );
|
||||||
#else
|
#elif !defined(CONFIG_TLS_REG_EMUL)
|
||||||
/*
|
/*
|
||||||
* User space must never try to access this directly.
|
* User space must never try to access this directly.
|
||||||
* Expect your app to break eventually if you do so.
|
* Expect your app to break eventually if you do so.
|
||||||
|
@ -497,11 +498,14 @@ asmlinkage int arm_syscall(int no, struct pt_regs *regs)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
#if defined(CONFIG_CPU_32v6) && !defined(CONFIG_HAS_TLS_REG)
|
#ifdef CONFIG_TLS_REG_EMUL
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* We might be running on an ARMv6+ processor which should have the TLS
|
* We might be running on an ARMv6+ processor which should have the TLS
|
||||||
* register, but for some reason we can't use it and have to emulate it.
|
* register but for some reason we can't use it, or maybe an SMP system
|
||||||
|
* using a pre-ARMv6 processor (there are apparently a few prototypes like
|
||||||
|
* that in existence) and therefore access to that register must be
|
||||||
|
* emulated.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
static int get_tp_trap(struct pt_regs *regs, unsigned int instr)
|
static int get_tp_trap(struct pt_regs *regs, unsigned int instr)
|
||||||
|
|
|
@ -5,6 +5,7 @@
|
||||||
|
|
||||||
#include <asm-generic/vmlinux.lds.h>
|
#include <asm-generic/vmlinux.lds.h>
|
||||||
#include <linux/config.h>
|
#include <linux/config.h>
|
||||||
|
#include <asm/thread_info.h>
|
||||||
|
|
||||||
OUTPUT_ARCH(arm)
|
OUTPUT_ARCH(arm)
|
||||||
ENTRY(stext)
|
ENTRY(stext)
|
||||||
|
@ -103,7 +104,7 @@ SECTIONS
|
||||||
__data_loc = ALIGN(4); /* location in binary */
|
__data_loc = ALIGN(4); /* location in binary */
|
||||||
. = DATAADDR;
|
. = DATAADDR;
|
||||||
#else
|
#else
|
||||||
. = ALIGN(8192);
|
. = ALIGN(THREAD_SIZE);
|
||||||
__data_loc = .;
|
__data_loc = .;
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
|
@ -10,6 +10,7 @@ config ARCH_AUTCPU12
|
||||||
|
|
||||||
config ARCH_CDB89712
|
config ARCH_CDB89712
|
||||||
bool "CDB89712"
|
bool "CDB89712"
|
||||||
|
select ISA
|
||||||
help
|
help
|
||||||
This is an evaluation board from Cirrus for the CS89712 processor.
|
This is an evaluation board from Cirrus for the CS89712 processor.
|
||||||
The board includes 2 serial ports, Ethernet, IRDA, and expansion
|
The board includes 2 serial ports, Ethernet, IRDA, and expansion
|
||||||
|
@ -26,6 +27,8 @@ config ARCH_CLEP7312
|
||||||
|
|
||||||
config ARCH_EDB7211
|
config ARCH_EDB7211
|
||||||
bool "EDB7211"
|
bool "EDB7211"
|
||||||
|
select ISA
|
||||||
|
select DISCONTIGMEM
|
||||||
help
|
help
|
||||||
Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211
|
Say Y here if you intend to run this kernel on a Cirrus Logic EDB-7211
|
||||||
evaluation board.
|
evaluation board.
|
||||||
|
|
|
@ -5,6 +5,9 @@ menu "Footbridge Implementations"
|
||||||
config ARCH_CATS
|
config ARCH_CATS
|
||||||
bool "CATS"
|
bool "CATS"
|
||||||
select FOOTBRIDGE_HOST
|
select FOOTBRIDGE_HOST
|
||||||
|
select ISA
|
||||||
|
select ISA_DMA
|
||||||
|
select PCI
|
||||||
help
|
help
|
||||||
Say Y here if you intend to run this kernel on the CATS.
|
Say Y here if you intend to run this kernel on the CATS.
|
||||||
|
|
||||||
|
@ -13,6 +16,9 @@ config ARCH_CATS
|
||||||
config ARCH_PERSONAL_SERVER
|
config ARCH_PERSONAL_SERVER
|
||||||
bool "Compaq Personal Server"
|
bool "Compaq Personal Server"
|
||||||
select FOOTBRIDGE_HOST
|
select FOOTBRIDGE_HOST
|
||||||
|
select ISA
|
||||||
|
select ISA_DMA
|
||||||
|
select PCI
|
||||||
---help---
|
---help---
|
||||||
Say Y here if you intend to run this kernel on the Compaq
|
Say Y here if you intend to run this kernel on the Compaq
|
||||||
Personal Server.
|
Personal Server.
|
||||||
|
@ -42,6 +48,9 @@ config ARCH_EBSA285_HOST
|
||||||
bool "EBSA285 (host mode)"
|
bool "EBSA285 (host mode)"
|
||||||
select ARCH_EBSA285
|
select ARCH_EBSA285
|
||||||
select FOOTBRIDGE_HOST
|
select FOOTBRIDGE_HOST
|
||||||
|
select ISA
|
||||||
|
select ISA_DMA
|
||||||
|
select PCI
|
||||||
help
|
help
|
||||||
Say Y here if you intend to run this kernel on the EBSA285 card
|
Say Y here if you intend to run this kernel on the EBSA285 card
|
||||||
in host ("central function") mode.
|
in host ("central function") mode.
|
||||||
|
@ -51,6 +60,9 @@ config ARCH_EBSA285_HOST
|
||||||
config ARCH_NETWINDER
|
config ARCH_NETWINDER
|
||||||
bool "NetWinder"
|
bool "NetWinder"
|
||||||
select FOOTBRIDGE_HOST
|
select FOOTBRIDGE_HOST
|
||||||
|
select ISA
|
||||||
|
select ISA_DMA
|
||||||
|
select PCI
|
||||||
help
|
help
|
||||||
Say Y here if you intend to run this kernel on the Rebel.COM
|
Say Y here if you intend to run this kernel on the Rebel.COM
|
||||||
NetWinder. Information about this machine can be found at:
|
NetWinder. Information about this machine can be found at:
|
||||||
|
|
|
@ -4,6 +4,7 @@ menu "IMX Implementations"
|
||||||
config ARCH_MX1ADS
|
config ARCH_MX1ADS
|
||||||
bool "mx1ads"
|
bool "mx1ads"
|
||||||
depends on ARCH_IMX
|
depends on ARCH_IMX
|
||||||
|
select ISA
|
||||||
help
|
help
|
||||||
Say Y here if you are using the Motorola MX1ADS board
|
Say Y here if you are using the Motorola MX1ADS board
|
||||||
|
|
||||||
|
|
|
@ -478,7 +478,7 @@ static int s3c2440_clk_add(struct sys_device *sysdev)
|
||||||
{
|
{
|
||||||
unsigned long upllcon = __raw_readl(S3C2410_UPLLCON);
|
unsigned long upllcon = __raw_readl(S3C2410_UPLLCON);
|
||||||
|
|
||||||
s3c2440_clk_upll.rate = s3c2410_get_pll(upllcon, clk_xtal.rate) * 2;
|
s3c2440_clk_upll.rate = s3c2410_get_pll(upllcon, clk_xtal.rate);
|
||||||
|
|
||||||
printk("S3C2440: Clock Support, UPLL %ld.%03ld MHz\n",
|
printk("S3C2440: Clock Support, UPLL %ld.%03ld MHz\n",
|
||||||
print_mhz(s3c2440_clk_upll.rate));
|
print_mhz(s3c2440_clk_upll.rate));
|
||||||
|
|
|
@ -192,9 +192,11 @@ void __init s3c2440_map_io(struct map_desc *mach_desc, int size)
|
||||||
|
|
||||||
iotable_init(s3c2440_iodesc, ARRAY_SIZE(s3c2440_iodesc));
|
iotable_init(s3c2440_iodesc, ARRAY_SIZE(s3c2440_iodesc));
|
||||||
iotable_init(mach_desc, size);
|
iotable_init(mach_desc, size);
|
||||||
|
|
||||||
/* rename any peripherals used differing from the s3c2410 */
|
/* rename any peripherals used differing from the s3c2410 */
|
||||||
|
|
||||||
s3c_device_i2c.name = "s3c2440-i2c";
|
s3c_device_i2c.name = "s3c2440-i2c";
|
||||||
|
s3c_device_nand.name = "s3c2440-nand";
|
||||||
|
|
||||||
/* change irq for watchdog */
|
/* change irq for watchdog */
|
||||||
|
|
||||||
|
@ -225,7 +227,7 @@ void __init s3c2440_init_clocks(int xtal)
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S3C2440_CLKDIVN_HDIVN_2:
|
case S3C2440_CLKDIVN_HDIVN_2:
|
||||||
hdiv = 1;
|
hdiv = 2;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case S3C2440_CLKDIVN_HDIVN_4_8:
|
case S3C2440_CLKDIVN_HDIVN_4_8:
|
||||||
|
|
|
@ -410,17 +410,22 @@ config CPU_BPREDICT_DISABLE
|
||||||
help
|
help
|
||||||
Say Y here to disable branch prediction. If unsure, say N.
|
Say Y here to disable branch prediction. If unsure, say N.
|
||||||
|
|
||||||
|
config TLS_REG_EMUL
|
||||||
|
bool
|
||||||
|
default y if SMP && (CPU_32v5 || CPU_32v4 || CPU_32v3)
|
||||||
|
help
|
||||||
|
An SMP system using a pre-ARMv6 processor (there are apparently
|
||||||
|
a few prototypes like that in existence) and therefore access to
|
||||||
|
that required register must be emulated.
|
||||||
|
|
||||||
config HAS_TLS_REG
|
config HAS_TLS_REG
|
||||||
bool
|
bool
|
||||||
depends on CPU_32v6 && !CPU_32v5 && !CPU_32v4 && !CPU_32v3
|
depends on !TLS_REG_EMUL
|
||||||
default y
|
default y if SMP || CPU_32v7
|
||||||
help
|
help
|
||||||
This selects support for the CP15 thread register.
|
This selects support for the CP15 thread register.
|
||||||
It is defined to be available on ARMv6 or later. However
|
It is defined to be available on some ARMv6 processors (including
|
||||||
if the kernel is configured to support multiple CPUs including
|
all SMP capable ARMv6's) or later processors. User space may
|
||||||
a pre-ARMv6 processors, or if a given ARMv6 processor doesn't
|
assume directly accessing that register and always obtain the
|
||||||
implement the thread register for some reason, then access to
|
expected value only on ARMv7 and above.
|
||||||
this register from user space must be trapped and emulated.
|
|
||||||
If user space is relying on the __kuser_get_tls code then
|
|
||||||
there should not be any impact.
|
|
||||||
|
|
||||||
|
|
|
@ -1,80 +0,0 @@
|
||||||
/*
|
|
||||||
* linux/arch/arm/lib/copy_page-armv4mc.S
|
|
||||||
*
|
|
||||||
* Copyright (C) 1995-2001 Russell King
|
|
||||||
*
|
|
||||||
* This program is free software; you can redistribute it and/or modify
|
|
||||||
* it under the terms of the GNU General Public License version 2 as
|
|
||||||
* published by the Free Software Foundation.
|
|
||||||
*
|
|
||||||
* ASM optimised string functions
|
|
||||||
*/
|
|
||||||
#include <linux/linkage.h>
|
|
||||||
#include <linux/init.h>
|
|
||||||
#include <asm/constants.h>
|
|
||||||
|
|
||||||
.text
|
|
||||||
.align 5
|
|
||||||
/*
|
|
||||||
* ARMv4 mini-dcache optimised copy_user_page
|
|
||||||
*
|
|
||||||
* We flush the destination cache lines just before we write the data into the
|
|
||||||
* corresponding address. Since the Dcache is read-allocate, this removes the
|
|
||||||
* Dcache aliasing issue. The writes will be forwarded to the write buffer,
|
|
||||||
* and merged as appropriate.
|
|
||||||
*
|
|
||||||
* Note: We rely on all ARMv4 processors implementing the "invalidate D line"
|
|
||||||
* instruction. If your processor does not supply this, you have to write your
|
|
||||||
* own copy_user_page that does the right thing.
|
|
||||||
*/
|
|
||||||
ENTRY(v4_mc_copy_user_page)
|
|
||||||
stmfd sp!, {r4, lr} @ 2
|
|
||||||
mov r4, r0
|
|
||||||
mov r0, r1
|
|
||||||
bl map_page_minicache
|
|
||||||
mov r1, #PAGE_SZ/64 @ 1
|
|
||||||
ldmia r0!, {r2, r3, ip, lr} @ 4
|
|
||||||
1: mcr p15, 0, r4, c7, c6, 1 @ 1 invalidate D line
|
|
||||||
stmia r4!, {r2, r3, ip, lr} @ 4
|
|
||||||
ldmia r0!, {r2, r3, ip, lr} @ 4+1
|
|
||||||
stmia r4!, {r2, r3, ip, lr} @ 4
|
|
||||||
ldmia r0!, {r2, r3, ip, lr} @ 4
|
|
||||||
mcr p15, 0, r4, c7, c6, 1 @ 1 invalidate D line
|
|
||||||
stmia r4!, {r2, r3, ip, lr} @ 4
|
|
||||||
ldmia r0!, {r2, r3, ip, lr} @ 4
|
|
||||||
subs r1, r1, #1 @ 1
|
|
||||||
stmia r4!, {r2, r3, ip, lr} @ 4
|
|
||||||
ldmneia r0!, {r2, r3, ip, lr} @ 4
|
|
||||||
bne 1b @ 1
|
|
||||||
ldmfd sp!, {r4, pc} @ 3
|
|
||||||
|
|
||||||
.align 5
|
|
||||||
/*
|
|
||||||
* ARMv4 optimised clear_user_page
|
|
||||||
*
|
|
||||||
* Same story as above.
|
|
||||||
*/
|
|
||||||
ENTRY(v4_mc_clear_user_page)
|
|
||||||
str lr, [sp, #-4]!
|
|
||||||
mov r1, #PAGE_SZ/64 @ 1
|
|
||||||
mov r2, #0 @ 1
|
|
||||||
mov r3, #0 @ 1
|
|
||||||
mov ip, #0 @ 1
|
|
||||||
mov lr, #0 @ 1
|
|
||||||
1: mcr p15, 0, r0, c7, c6, 1 @ 1 invalidate D line
|
|
||||||
stmia r0!, {r2, r3, ip, lr} @ 4
|
|
||||||
stmia r0!, {r2, r3, ip, lr} @ 4
|
|
||||||
mcr p15, 0, r0, c7, c6, 1 @ 1 invalidate D line
|
|
||||||
stmia r0!, {r2, r3, ip, lr} @ 4
|
|
||||||
stmia r0!, {r2, r3, ip, lr} @ 4
|
|
||||||
subs r1, r1, #1 @ 1
|
|
||||||
bne 1b @ 1
|
|
||||||
ldr pc, [sp], #4
|
|
||||||
|
|
||||||
__INITDATA
|
|
||||||
|
|
||||||
.type v4_mc_user_fns, #object
|
|
||||||
ENTRY(v4_mc_user_fns)
|
|
||||||
.long v4_mc_clear_user_page
|
|
||||||
.long v4_mc_copy_user_page
|
|
||||||
.size v4_mc_user_fns, . - v4_mc_user_fns
|
|
111
arch/arm/mm/copypage-v4mc.c
Normal file
111
arch/arm/mm/copypage-v4mc.c
Normal file
|
@ -0,0 +1,111 @@
|
||||||
|
/*
|
||||||
|
* linux/arch/arm/lib/copypage-armv4mc.S
|
||||||
|
*
|
||||||
|
* Copyright (C) 1995-2005 Russell King
|
||||||
|
*
|
||||||
|
* This program is free software; you can redistribute it and/or modify
|
||||||
|
* it under the terms of the GNU General Public License version 2 as
|
||||||
|
* published by the Free Software Foundation.
|
||||||
|
*
|
||||||
|
* This handles the mini data cache, as found on SA11x0 and XScale
|
||||||
|
* processors. When we copy a user page page, we map it in such a way
|
||||||
|
* that accesses to this page will not touch the main data cache, but
|
||||||
|
* will be cached in the mini data cache. This prevents us thrashing
|
||||||
|
* the main data cache on page faults.
|
||||||
|
*/
|
||||||
|
#include <linux/init.h>
|
||||||
|
#include <linux/mm.h>
|
||||||
|
|
||||||
|
#include <asm/page.h>
|
||||||
|
#include <asm/pgtable.h>
|
||||||
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 0xffff8000 to 0xffffffff is reserved for any ARM architecture
|
||||||
|
* specific hacks for copying pages efficiently.
|
||||||
|
*/
|
||||||
|
#define minicache_pgprot __pgprot(L_PTE_PRESENT | L_PTE_YOUNG | \
|
||||||
|
L_PTE_CACHEABLE)
|
||||||
|
|
||||||
|
#define TOP_PTE(x) pte_offset_kernel(top_pmd, x)
|
||||||
|
|
||||||
|
static DEFINE_SPINLOCK(minicache_lock);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ARMv4 mini-dcache optimised copy_user_page
|
||||||
|
*
|
||||||
|
* We flush the destination cache lines just before we write the data into the
|
||||||
|
* corresponding address. Since the Dcache is read-allocate, this removes the
|
||||||
|
* Dcache aliasing issue. The writes will be forwarded to the write buffer,
|
||||||
|
* and merged as appropriate.
|
||||||
|
*
|
||||||
|
* Note: We rely on all ARMv4 processors implementing the "invalidate D line"
|
||||||
|
* instruction. If your processor does not supply this, you have to write your
|
||||||
|
* own copy_user_page that does the right thing.
|
||||||
|
*/
|
||||||
|
static void __attribute__((naked))
|
||||||
|
mc_copy_user_page(void *from, void *to)
|
||||||
|
{
|
||||||
|
asm volatile(
|
||||||
|
"stmfd sp!, {r4, lr} @ 2\n\
|
||||||
|
mov r4, %2 @ 1\n\
|
||||||
|
ldmia %0!, {r2, r3, ip, lr} @ 4\n\
|
||||||
|
1: mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line\n\
|
||||||
|
stmia %1!, {r2, r3, ip, lr} @ 4\n\
|
||||||
|
ldmia %0!, {r2, r3, ip, lr} @ 4+1\n\
|
||||||
|
stmia %1!, {r2, r3, ip, lr} @ 4\n\
|
||||||
|
ldmia %0!, {r2, r3, ip, lr} @ 4\n\
|
||||||
|
mcr p15, 0, %1, c7, c6, 1 @ 1 invalidate D line\n\
|
||||||
|
stmia %1!, {r2, r3, ip, lr} @ 4\n\
|
||||||
|
ldmia %0!, {r2, r3, ip, lr} @ 4\n\
|
||||||
|
subs r4, r4, #1 @ 1\n\
|
||||||
|
stmia %1!, {r2, r3, ip, lr} @ 4\n\
|
||||||
|
ldmneia %0!, {r2, r3, ip, lr} @ 4\n\
|
||||||
|
bne 1b @ 1\n\
|
||||||
|
ldmfd sp!, {r4, pc} @ 3"
|
||||||
|
:
|
||||||
|
: "r" (from), "r" (to), "I" (PAGE_SIZE / 64));
|
||||||
|
}
|
||||||
|
|
||||||
|
void v4_mc_copy_user_page(void *kto, const void *kfrom, unsigned long vaddr)
|
||||||
|
{
|
||||||
|
spin_lock(&minicache_lock);
|
||||||
|
|
||||||
|
set_pte(TOP_PTE(0xffff8000), pfn_pte(__pa(kfrom) >> PAGE_SHIFT, minicache_pgprot));
|
||||||
|
flush_tlb_kernel_page(0xffff8000);
|
||||||
|
|
||||||
|
mc_copy_user_page((void *)0xffff8000, kto);
|
||||||
|
|
||||||
|
spin_unlock(&minicache_lock);
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* ARMv4 optimised clear_user_page
|
||||||
|
*/
|
||||||
|
void __attribute__((naked))
|
||||||
|
v4_mc_clear_user_page(void *kaddr, unsigned long vaddr)
|
||||||
|
{
|
||||||
|
asm volatile(
|
||||||
|
"str lr, [sp, #-4]!\n\
|
||||||
|
mov r1, %0 @ 1\n\
|
||||||
|
mov r2, #0 @ 1\n\
|
||||||
|
mov r3, #0 @ 1\n\
|
||||||
|
mov ip, #0 @ 1\n\
|
||||||
|
mov lr, #0 @ 1\n\
|
||||||
|
1: mcr p15, 0, r0, c7, c6, 1 @ 1 invalidate D line\n\
|
||||||
|
stmia r0!, {r2, r3, ip, lr} @ 4\n\
|
||||||
|
stmia r0!, {r2, r3, ip, lr} @ 4\n\
|
||||||
|
mcr p15, 0, r0, c7, c6, 1 @ 1 invalidate D line\n\
|
||||||
|
stmia r0!, {r2, r3, ip, lr} @ 4\n\
|
||||||
|
stmia r0!, {r2, r3, ip, lr} @ 4\n\
|
||||||
|
subs r1, r1, #1 @ 1\n\
|
||||||
|
bne 1b @ 1\n\
|
||||||
|
ldr pc, [sp], #4"
|
||||||
|
:
|
||||||
|
: "I" (PAGE_SIZE / 64));
|
||||||
|
}
|
||||||
|
|
||||||
|
struct cpu_user_fns v4_mc_user_fns __initdata = {
|
||||||
|
.cpu_clear_user_page = v4_mc_clear_user_page,
|
||||||
|
.cpu_copy_user_page = v4_mc_copy_user_page,
|
||||||
|
};
|
|
@ -26,8 +26,8 @@
|
||||||
#define to_address (0xffffc000)
|
#define to_address (0xffffc000)
|
||||||
#define to_pgprot PAGE_KERNEL
|
#define to_pgprot PAGE_KERNEL
|
||||||
|
|
||||||
static pte_t *from_pte;
|
#define TOP_PTE(x) pte_offset_kernel(top_pmd, x)
|
||||||
static pte_t *to_pte;
|
|
||||||
static DEFINE_SPINLOCK(v6_lock);
|
static DEFINE_SPINLOCK(v6_lock);
|
||||||
|
|
||||||
#define DCACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT)
|
#define DCACHE_COLOUR(vaddr) ((vaddr & (SHMLBA - 1)) >> PAGE_SHIFT)
|
||||||
|
@ -74,8 +74,8 @@ void v6_copy_user_page_aliasing(void *kto, const void *kfrom, unsigned long vadd
|
||||||
*/
|
*/
|
||||||
spin_lock(&v6_lock);
|
spin_lock(&v6_lock);
|
||||||
|
|
||||||
set_pte(from_pte + offset, pfn_pte(__pa(kfrom) >> PAGE_SHIFT, from_pgprot));
|
set_pte(TOP_PTE(from_address) + offset, pfn_pte(__pa(kfrom) >> PAGE_SHIFT, from_pgprot));
|
||||||
set_pte(to_pte + offset, pfn_pte(__pa(kto) >> PAGE_SHIFT, to_pgprot));
|
set_pte(TOP_PTE(to_address) + offset, pfn_pte(__pa(kto) >> PAGE_SHIFT, to_pgprot));
|
||||||
|
|
||||||
from = from_address + (offset << PAGE_SHIFT);
|
from = from_address + (offset << PAGE_SHIFT);
|
||||||
to = to_address + (offset << PAGE_SHIFT);
|
to = to_address + (offset << PAGE_SHIFT);
|
||||||
|
@ -114,7 +114,7 @@ void v6_clear_user_page_aliasing(void *kaddr, unsigned long vaddr)
|
||||||
*/
|
*/
|
||||||
spin_lock(&v6_lock);
|
spin_lock(&v6_lock);
|
||||||
|
|
||||||
set_pte(to_pte + offset, pfn_pte(__pa(kaddr) >> PAGE_SHIFT, to_pgprot));
|
set_pte(TOP_PTE(to_address) + offset, pfn_pte(__pa(kaddr) >> PAGE_SHIFT, to_pgprot));
|
||||||
flush_tlb_kernel_page(to);
|
flush_tlb_kernel_page(to);
|
||||||
clear_page((void *)to);
|
clear_page((void *)to);
|
||||||
|
|
||||||
|
@ -129,21 +129,6 @@ struct cpu_user_fns v6_user_fns __initdata = {
|
||||||
static int __init v6_userpage_init(void)
|
static int __init v6_userpage_init(void)
|
||||||
{
|
{
|
||||||
if (cache_is_vipt_aliasing()) {
|
if (cache_is_vipt_aliasing()) {
|
||||||
pgd_t *pgd;
|
|
||||||
pmd_t *pmd;
|
|
||||||
|
|
||||||
pgd = pgd_offset_k(from_address);
|
|
||||||
pmd = pmd_alloc(&init_mm, pgd, from_address);
|
|
||||||
if (!pmd)
|
|
||||||
BUG();
|
|
||||||
from_pte = pte_alloc_kernel(&init_mm, pmd, from_address);
|
|
||||||
if (!from_pte)
|
|
||||||
BUG();
|
|
||||||
|
|
||||||
to_pte = pte_alloc_kernel(&init_mm, pmd, to_address);
|
|
||||||
if (!to_pte)
|
|
||||||
BUG();
|
|
||||||
|
|
||||||
cpu_user.cpu_clear_user_page = v6_clear_user_page_aliasing;
|
cpu_user.cpu_clear_user_page = v6_clear_user_page_aliasing;
|
||||||
cpu_user.cpu_copy_user_page = v6_copy_user_page_aliasing;
|
cpu_user.cpu_copy_user_page = v6_copy_user_page_aliasing;
|
||||||
}
|
}
|
||||||
|
@ -151,5 +136,4 @@ static int __init v6_userpage_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
__initcall(v6_userpage_init);
|
core_initcall(v6_userpage_init);
|
||||||
|
|
||||||
|
|
|
@ -13,6 +13,29 @@
|
||||||
|
|
||||||
#include <asm/cacheflush.h>
|
#include <asm/cacheflush.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
#include <asm/tlbflush.h>
|
||||||
|
|
||||||
|
#ifdef CONFIG_CPU_CACHE_VIPT
|
||||||
|
#define ALIAS_FLUSH_START 0xffff4000
|
||||||
|
|
||||||
|
#define TOP_PTE(x) pte_offset_kernel(top_pmd, x)
|
||||||
|
|
||||||
|
static void flush_pfn_alias(unsigned long pfn, unsigned long vaddr)
|
||||||
|
{
|
||||||
|
unsigned long to = ALIAS_FLUSH_START + (CACHE_COLOUR(vaddr) << PAGE_SHIFT);
|
||||||
|
|
||||||
|
set_pte(TOP_PTE(to), pfn_pte(pfn, PAGE_KERNEL));
|
||||||
|
flush_tlb_kernel_page(to);
|
||||||
|
|
||||||
|
asm( "mcrr p15, 0, %1, %0, c14\n"
|
||||||
|
" mcrr p15, 0, %1, %0, c5\n"
|
||||||
|
:
|
||||||
|
: "r" (to), "r" (to + PAGE_SIZE - L1_CACHE_BYTES)
|
||||||
|
: "cc");
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
#define flush_pfn_alias(pfn,vaddr) do { } while (0)
|
||||||
|
#endif
|
||||||
|
|
||||||
static void __flush_dcache_page(struct address_space *mapping, struct page *page)
|
static void __flush_dcache_page(struct address_space *mapping, struct page *page)
|
||||||
{
|
{
|
||||||
|
@ -36,6 +59,18 @@ static void __flush_dcache_page(struct address_space *mapping, struct page *page
|
||||||
if (!mapping)
|
if (!mapping)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This is a page cache page. If we have a VIPT cache, we
|
||||||
|
* only need to do one flush - which would be at the relevant
|
||||||
|
* userspace colour, which is congruent with page->index.
|
||||||
|
*/
|
||||||
|
if (cache_is_vipt()) {
|
||||||
|
if (cache_is_vipt_aliasing())
|
||||||
|
flush_pfn_alias(page_to_pfn(page),
|
||||||
|
page->index << PAGE_CACHE_SHIFT);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* There are possible user space mappings of this page:
|
* There are possible user space mappings of this page:
|
||||||
* - VIVT cache: we need to also write back and invalidate all user
|
* - VIVT cache: we need to also write back and invalidate all user
|
||||||
|
@ -57,8 +92,6 @@ static void __flush_dcache_page(struct address_space *mapping, struct page *page
|
||||||
continue;
|
continue;
|
||||||
offset = (pgoff - mpnt->vm_pgoff) << PAGE_SHIFT;
|
offset = (pgoff - mpnt->vm_pgoff) << PAGE_SHIFT;
|
||||||
flush_cache_page(mpnt, mpnt->vm_start + offset, page_to_pfn(page));
|
flush_cache_page(mpnt, mpnt->vm_start + offset, page_to_pfn(page));
|
||||||
if (cache_is_vipt())
|
|
||||||
break;
|
|
||||||
}
|
}
|
||||||
flush_dcache_mmap_unlock(mapping);
|
flush_dcache_mmap_unlock(mapping);
|
||||||
}
|
}
|
||||||
|
|
|
@ -37,6 +37,8 @@ pgprot_t pgprot_kernel;
|
||||||
|
|
||||||
EXPORT_SYMBOL(pgprot_kernel);
|
EXPORT_SYMBOL(pgprot_kernel);
|
||||||
|
|
||||||
|
pmd_t *top_pmd;
|
||||||
|
|
||||||
struct cachepolicy {
|
struct cachepolicy {
|
||||||
const char policy[16];
|
const char policy[16];
|
||||||
unsigned int cr_mask;
|
unsigned int cr_mask;
|
||||||
|
@ -142,6 +144,16 @@ __setup("noalign", noalign_setup);
|
||||||
|
|
||||||
#define FIRST_KERNEL_PGD_NR (FIRST_USER_PGD_NR + USER_PTRS_PER_PGD)
|
#define FIRST_KERNEL_PGD_NR (FIRST_USER_PGD_NR + USER_PTRS_PER_PGD)
|
||||||
|
|
||||||
|
static inline pmd_t *pmd_off(pgd_t *pgd, unsigned long virt)
|
||||||
|
{
|
||||||
|
return pmd_offset(pgd, virt);
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline pmd_t *pmd_off_k(unsigned long virt)
|
||||||
|
{
|
||||||
|
return pmd_off(pgd_offset_k(virt), virt);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* need to get a 16k page for level 1
|
* need to get a 16k page for level 1
|
||||||
*/
|
*/
|
||||||
|
@ -220,7 +232,7 @@ void free_pgd_slow(pgd_t *pgd)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
/* pgd is always present and good */
|
/* pgd is always present and good */
|
||||||
pmd = (pmd_t *)pgd;
|
pmd = pmd_off(pgd, 0);
|
||||||
if (pmd_none(*pmd))
|
if (pmd_none(*pmd))
|
||||||
goto free;
|
goto free;
|
||||||
if (pmd_bad(*pmd)) {
|
if (pmd_bad(*pmd)) {
|
||||||
|
@ -246,9 +258,8 @@ void free_pgd_slow(pgd_t *pgd)
|
||||||
static inline void
|
static inline void
|
||||||
alloc_init_section(unsigned long virt, unsigned long phys, int prot)
|
alloc_init_section(unsigned long virt, unsigned long phys, int prot)
|
||||||
{
|
{
|
||||||
pmd_t *pmdp;
|
pmd_t *pmdp = pmd_off_k(virt);
|
||||||
|
|
||||||
pmdp = pmd_offset(pgd_offset_k(virt), virt);
|
|
||||||
if (virt & (1 << 20))
|
if (virt & (1 << 20))
|
||||||
pmdp++;
|
pmdp++;
|
||||||
|
|
||||||
|
@ -283,11 +294,9 @@ alloc_init_supersection(unsigned long virt, unsigned long phys, int prot)
|
||||||
static inline void
|
static inline void
|
||||||
alloc_init_page(unsigned long virt, unsigned long phys, unsigned int prot_l1, pgprot_t prot)
|
alloc_init_page(unsigned long virt, unsigned long phys, unsigned int prot_l1, pgprot_t prot)
|
||||||
{
|
{
|
||||||
pmd_t *pmdp;
|
pmd_t *pmdp = pmd_off_k(virt);
|
||||||
pte_t *ptep;
|
pte_t *ptep;
|
||||||
|
|
||||||
pmdp = pmd_offset(pgd_offset_k(virt), virt);
|
|
||||||
|
|
||||||
if (pmd_none(*pmdp)) {
|
if (pmd_none(*pmdp)) {
|
||||||
unsigned long pmdval;
|
unsigned long pmdval;
|
||||||
ptep = alloc_bootmem_low_pages(2 * PTRS_PER_PTE *
|
ptep = alloc_bootmem_low_pages(2 * PTRS_PER_PTE *
|
||||||
|
@ -310,7 +319,7 @@ alloc_init_page(unsigned long virt, unsigned long phys, unsigned int prot_l1, pg
|
||||||
*/
|
*/
|
||||||
static inline void clear_mapping(unsigned long virt)
|
static inline void clear_mapping(unsigned long virt)
|
||||||
{
|
{
|
||||||
pmd_clear(pmd_offset(pgd_offset_k(virt), virt));
|
pmd_clear(pmd_off_k(virt));
|
||||||
}
|
}
|
||||||
|
|
||||||
struct mem_types {
|
struct mem_types {
|
||||||
|
@ -578,7 +587,7 @@ void setup_mm_for_reboot(char mode)
|
||||||
PMD_TYPE_SECT;
|
PMD_TYPE_SECT;
|
||||||
if (cpu_arch <= CPU_ARCH_ARMv5)
|
if (cpu_arch <= CPU_ARCH_ARMv5)
|
||||||
pmdval |= PMD_BIT4;
|
pmdval |= PMD_BIT4;
|
||||||
pmd = pmd_offset(pgd + i, i << PGDIR_SHIFT);
|
pmd = pmd_off(pgd, i << PGDIR_SHIFT);
|
||||||
pmd[0] = __pmd(pmdval);
|
pmd[0] = __pmd(pmdval);
|
||||||
pmd[1] = __pmd(pmdval + (1 << (PGDIR_SHIFT - 1)));
|
pmd[1] = __pmd(pmdval + (1 << (PGDIR_SHIFT - 1)));
|
||||||
flush_pmd_entry(pmd);
|
flush_pmd_entry(pmd);
|
||||||
|
@ -675,6 +684,8 @@ void __init memtable_init(struct meminfo *mi)
|
||||||
|
|
||||||
flush_cache_all();
|
flush_cache_all();
|
||||||
flush_tlb_all();
|
flush_tlb_all();
|
||||||
|
|
||||||
|
top_pmd = pmd_off_k(0xffff0000);
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
|
@ -54,7 +54,7 @@ asmlinkage void ret_from_fork(void);
|
||||||
void default_idle(void)
|
void default_idle(void)
|
||||||
{
|
{
|
||||||
while(1) {
|
while(1) {
|
||||||
if (need_resched()) {
|
if (!need_resched()) {
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
__asm__("sleep");
|
__asm__("sleep");
|
||||||
local_irq_disable();
|
local_irq_disable();
|
||||||
|
|
|
@ -183,7 +183,7 @@ config M386
|
||||||
- "Winchip-C6" for original IDT Winchip.
|
- "Winchip-C6" for original IDT Winchip.
|
||||||
- "Winchip-2" for IDT Winchip 2.
|
- "Winchip-2" for IDT Winchip 2.
|
||||||
- "Winchip-2A" for IDT Winchips with 3dNow! capabilities.
|
- "Winchip-2A" for IDT Winchips with 3dNow! capabilities.
|
||||||
- "MediaGX/Geode" for Cyrix MediaGX aka Geode.
|
- "GeodeGX1" for Geode GX1 (Cyrix MediaGX).
|
||||||
- "CyrixIII/VIA C3" for VIA Cyrix III or VIA C3.
|
- "CyrixIII/VIA C3" for VIA Cyrix III or VIA C3.
|
||||||
- "VIA C3-2 for VIA C3-2 "Nehemiah" (model 9 and above).
|
- "VIA C3-2 for VIA C3-2 "Nehemiah" (model 9 and above).
|
||||||
|
|
||||||
|
@ -311,12 +311,10 @@ config MWINCHIP3D
|
||||||
stores for this CPU, which can increase performance of some
|
stores for this CPU, which can increase performance of some
|
||||||
operations.
|
operations.
|
||||||
|
|
||||||
config MGEODE
|
config MGEODEGX1
|
||||||
bool "MediaGX/Geode"
|
bool "GeodeGX1"
|
||||||
help
|
help
|
||||||
Select this for a Cyrix MediaGX aka Geode chip. Linux and GCC
|
Select this for a Geode GX1 (Cyrix MediaGX) chip.
|
||||||
treat this chip as a 586TSC with some extended instructions
|
|
||||||
and alignment reqirements.
|
|
||||||
|
|
||||||
config MCYRIXIII
|
config MCYRIXIII
|
||||||
bool "CyrixIII/VIA-C3"
|
bool "CyrixIII/VIA-C3"
|
||||||
|
@ -368,7 +366,7 @@ config X86_L1_CACHE_SHIFT
|
||||||
int
|
int
|
||||||
default "7" if MPENTIUM4 || X86_GENERIC
|
default "7" if MPENTIUM4 || X86_GENERIC
|
||||||
default "4" if X86_ELAN || M486 || M386
|
default "4" if X86_ELAN || M486 || M386
|
||||||
default "5" if MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODE
|
default "5" if MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCRUSOE || MEFFICEON || MCYRIXIII || MK6 || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || M586 || MVIAC3_2 || MGEODEGX1
|
||||||
default "6" if MK7 || MK8 || MPENTIUMM
|
default "6" if MK7 || MK8 || MPENTIUMM
|
||||||
|
|
||||||
config RWSEM_GENERIC_SPINLOCK
|
config RWSEM_GENERIC_SPINLOCK
|
||||||
|
@ -387,7 +385,7 @@ config GENERIC_CALIBRATE_DELAY
|
||||||
|
|
||||||
config X86_PPRO_FENCE
|
config X86_PPRO_FENCE
|
||||||
bool
|
bool
|
||||||
depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 || MGEODE
|
depends on M686 || M586MMX || M586TSC || M586 || M486 || M386 || MGEODEGX1
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config X86_F00F_BUG
|
config X86_F00F_BUG
|
||||||
|
@ -417,7 +415,7 @@ config X86_POPAD_OK
|
||||||
|
|
||||||
config X86_ALIGNMENT_16
|
config X86_ALIGNMENT_16
|
||||||
bool
|
bool
|
||||||
depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || X86_ELAN || MK6 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 || MGEODE
|
depends on MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MCYRIXIII || X86_ELAN || MK6 || M586MMX || M586TSC || M586 || M486 || MVIAC3_2 || MGEODEGX1
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config X86_GOOD_APIC
|
config X86_GOOD_APIC
|
||||||
|
@ -442,7 +440,7 @@ config X86_USE_3DNOW
|
||||||
|
|
||||||
config X86_OOSTORE
|
config X86_OOSTORE
|
||||||
bool
|
bool
|
||||||
depends on (MWINCHIP3D || MWINCHIP2 || MWINCHIPC6 || MGEODE) && MTRR
|
depends on (MWINCHIP3D || MWINCHIP2 || MWINCHIPC6) && MTRR
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config HPET_TIMER
|
config HPET_TIMER
|
||||||
|
@ -578,7 +576,7 @@ config X86_VISWS_APIC
|
||||||
|
|
||||||
config X86_TSC
|
config X86_TSC
|
||||||
bool
|
bool
|
||||||
depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODE) && !X86_NUMAQ
|
depends on (MWINCHIP3D || MWINCHIP2 || MCRUSOE || MEFFICEON || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || M586MMX || M586TSC || MK8 || MVIAC3_2 || MGEODEGX1) && !X86_NUMAQ
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config X86_MCE
|
config X86_MCE
|
||||||
|
@ -1165,7 +1163,7 @@ config PCI_DIRECT
|
||||||
|
|
||||||
config PCI_MMCONFIG
|
config PCI_MMCONFIG
|
||||||
bool
|
bool
|
||||||
depends on PCI && (PCI_GOMMCONFIG || (PCI_GOANY && ACPI))
|
depends on PCI && ACPI && (PCI_GOMMCONFIG || PCI_GOANY)
|
||||||
select ACPI_BOOT
|
select ACPI_BOOT
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
|
|
@ -14,7 +14,7 @@
|
||||||
# 19990713 Artur Skawina <skawina@geocities.com>
|
# 19990713 Artur Skawina <skawina@geocities.com>
|
||||||
# Added '-march' and '-mpreferred-stack-boundary' support
|
# Added '-march' and '-mpreferred-stack-boundary' support
|
||||||
#
|
#
|
||||||
# Kianusch Sayah Karadji <kianusch@sk-tech.net>
|
# 20050320 Kianusch Sayah Karadji <kianusch@sk-tech.net>
|
||||||
# Added support for GEODE CPU
|
# Added support for GEODE CPU
|
||||||
|
|
||||||
LDFLAGS := -m elf_i386
|
LDFLAGS := -m elf_i386
|
||||||
|
@ -54,8 +54,8 @@ cflags-$(CONFIG_MVIAC3_2) += $(call cc-option,-march=c3-2,-march=i686)
|
||||||
# AMD Elan support
|
# AMD Elan support
|
||||||
cflags-$(CONFIG_X86_ELAN) += -march=i486
|
cflags-$(CONFIG_X86_ELAN) += -march=i486
|
||||||
|
|
||||||
# MediaGX aka Geode support
|
# Geode GX1 support
|
||||||
cflags-$(CONFIG_MGEODE) += $(call cc-option,-march=pentium-mmx,-march=i586)
|
cflags-$(CONFIG_MGEODEGX1) += $(call cc-option,-march=pentium-mmx,-march=i486)
|
||||||
|
|
||||||
# -mregparm=3 works ok on gcc-3.0 and later
|
# -mregparm=3 works ok on gcc-3.0 and later
|
||||||
#
|
#
|
||||||
|
|
|
@ -83,7 +83,7 @@ bugger_off_msg:
|
||||||
.ascii "\n"
|
.ascii "\n"
|
||||||
.ascii "Remove disk and press any key to reboot . . .\r\n"
|
.ascii "Remove disk and press any key to reboot . . .\r\n"
|
||||||
.byte 0
|
.byte 0
|
||||||
|
|
||||||
|
|
||||||
# Kernel attributes; used by setup
|
# Kernel attributes; used by setup
|
||||||
|
|
||||||
|
|
|
@ -1924,36 +1924,36 @@ skip10: movb %ah, %al
|
||||||
ret
|
ret
|
||||||
|
|
||||||
store_edid:
|
store_edid:
|
||||||
pushw %es # just save all registers
|
pushw %es # just save all registers
|
||||||
pushw %ax
|
pushw %ax
|
||||||
pushw %bx
|
pushw %bx
|
||||||
pushw %cx
|
pushw %cx
|
||||||
pushw %dx
|
pushw %dx
|
||||||
pushw %di
|
pushw %di
|
||||||
|
|
||||||
pushw %fs
|
pushw %fs
|
||||||
popw %es
|
popw %es
|
||||||
|
|
||||||
movl $0x13131313, %eax # memset block with 0x13
|
movl $0x13131313, %eax # memset block with 0x13
|
||||||
movw $32, %cx
|
movw $32, %cx
|
||||||
movw $0x140, %di
|
movw $0x140, %di
|
||||||
cld
|
cld
|
||||||
rep
|
rep
|
||||||
stosl
|
stosl
|
||||||
|
|
||||||
movw $0x4f15, %ax # do VBE/DDC
|
movw $0x4f15, %ax # do VBE/DDC
|
||||||
movw $0x01, %bx
|
movw $0x01, %bx
|
||||||
movw $0x00, %cx
|
movw $0x00, %cx
|
||||||
movw $0x01, %dx
|
movw $0x01, %dx
|
||||||
movw $0x140, %di
|
movw $0x140, %di
|
||||||
int $0x10
|
int $0x10
|
||||||
|
|
||||||
popw %di # restore all registers
|
popw %di # restore all registers
|
||||||
popw %dx
|
popw %dx
|
||||||
popw %cx
|
popw %cx
|
||||||
popw %bx
|
popw %bx
|
||||||
popw %ax
|
popw %ax
|
||||||
popw %es
|
popw %es
|
||||||
ret
|
ret
|
||||||
|
|
||||||
# VIDEO_SELECT-only variables
|
# VIDEO_SELECT-only variables
|
||||||
|
|
|
@ -650,7 +650,7 @@ acpi_find_rsdp (void)
|
||||||
*/
|
*/
|
||||||
rsdp_phys = acpi_scan_rsdp (0, 0x400);
|
rsdp_phys = acpi_scan_rsdp (0, 0x400);
|
||||||
if (!rsdp_phys)
|
if (!rsdp_phys)
|
||||||
rsdp_phys = acpi_scan_rsdp (0xE0000, 0xFFFFF);
|
rsdp_phys = acpi_scan_rsdp (0xE0000, 0x20000);
|
||||||
|
|
||||||
return rsdp_phys;
|
return rsdp_phys;
|
||||||
}
|
}
|
||||||
|
|
|
@ -24,9 +24,6 @@ __asm__(".align 4\nvide: ret");
|
||||||
|
|
||||||
static void __init init_amd(struct cpuinfo_x86 *c)
|
static void __init init_amd(struct cpuinfo_x86 *c)
|
||||||
{
|
{
|
||||||
#ifdef CONFIG_X86_SMP
|
|
||||||
int cpu = c == &boot_cpu_data ? 0 : c - cpu_data;
|
|
||||||
#endif
|
|
||||||
u32 l, h;
|
u32 l, h;
|
||||||
int mbytes = num_physpages >> (20-PAGE_SHIFT);
|
int mbytes = num_physpages >> (20-PAGE_SHIFT);
|
||||||
int r;
|
int r;
|
||||||
|
@ -198,14 +195,19 @@ static void __init init_amd(struct cpuinfo_x86 *c)
|
||||||
c->x86_num_cores = 1;
|
c->x86_num_cores = 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_X86_SMP
|
#ifdef CONFIG_X86_HT
|
||||||
/*
|
/*
|
||||||
* On a AMD dual core setup the lower bits of the APIC id
|
* On a AMD dual core setup the lower bits of the APIC id
|
||||||
* distingush the cores. Assumes number of cores is a power
|
* distingush the cores. Assumes number of cores is a power
|
||||||
* of two.
|
* of two.
|
||||||
*/
|
*/
|
||||||
if (c->x86_num_cores > 1) {
|
if (c->x86_num_cores > 1) {
|
||||||
cpu_core_id[cpu] = cpu >> hweight32(c->x86_num_cores - 1);
|
int cpu = smp_processor_id();
|
||||||
|
unsigned bits = 0;
|
||||||
|
while ((1 << bits) < c->x86_num_cores)
|
||||||
|
bits++;
|
||||||
|
cpu_core_id[cpu] = phys_proc_id[cpu] & ((1<<bits)-1);
|
||||||
|
phys_proc_id[cpu] >>= bits;
|
||||||
printk(KERN_INFO "CPU %d(%d) -> Core %d\n",
|
printk(KERN_INFO "CPU %d(%d) -> Core %d\n",
|
||||||
cpu, c->x86_num_cores, cpu_core_id[cpu]);
|
cpu, c->x86_num_cores, cpu_core_id[cpu]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -243,6 +243,10 @@ static void __init early_cpu_detect(void)
|
||||||
}
|
}
|
||||||
|
|
||||||
early_intel_workaround(c);
|
early_intel_workaround(c);
|
||||||
|
|
||||||
|
#ifdef CONFIG_X86_HT
|
||||||
|
phys_proc_id[smp_processor_id()] = (cpuid_ebx(1) >> 24) & 0xff;
|
||||||
|
#endif
|
||||||
}
|
}
|
||||||
|
|
||||||
void __init generic_identify(struct cpuinfo_x86 * c)
|
void __init generic_identify(struct cpuinfo_x86 * c)
|
||||||
|
|
|
@ -23,7 +23,7 @@ config X86_ACPI_CPUFREQ
|
||||||
If in doubt, say N.
|
If in doubt, say N.
|
||||||
|
|
||||||
config ELAN_CPUFREQ
|
config ELAN_CPUFREQ
|
||||||
tristate "AMD Elan"
|
tristate "AMD Elan SC400 and SC410"
|
||||||
select CPU_FREQ_TABLE
|
select CPU_FREQ_TABLE
|
||||||
depends on X86_ELAN
|
depends on X86_ELAN
|
||||||
---help---
|
---help---
|
||||||
|
@ -38,6 +38,18 @@ config ELAN_CPUFREQ
|
||||||
|
|
||||||
If in doubt, say N.
|
If in doubt, say N.
|
||||||
|
|
||||||
|
config SC520_CPUFREQ
|
||||||
|
tristate "AMD Elan SC520"
|
||||||
|
select CPU_FREQ_TABLE
|
||||||
|
depends on X86_ELAN
|
||||||
|
---help---
|
||||||
|
This adds the CPUFreq driver for AMD Elan SC520 processor.
|
||||||
|
|
||||||
|
For details, take a look at <file:Documentation/cpu-freq/>.
|
||||||
|
|
||||||
|
If in doubt, say N.
|
||||||
|
|
||||||
|
|
||||||
config X86_POWERNOW_K6
|
config X86_POWERNOW_K6
|
||||||
tristate "AMD Mobile K6-2/K6-3 PowerNow!"
|
tristate "AMD Mobile K6-2/K6-3 PowerNow!"
|
||||||
select CPU_FREQ_TABLE
|
select CPU_FREQ_TABLE
|
||||||
|
|
|
@ -3,6 +3,7 @@ obj-$(CONFIG_X86_POWERNOW_K7) += powernow-k7.o
|
||||||
obj-$(CONFIG_X86_POWERNOW_K8) += powernow-k8.o
|
obj-$(CONFIG_X86_POWERNOW_K8) += powernow-k8.o
|
||||||
obj-$(CONFIG_X86_LONGHAUL) += longhaul.o
|
obj-$(CONFIG_X86_LONGHAUL) += longhaul.o
|
||||||
obj-$(CONFIG_ELAN_CPUFREQ) += elanfreq.o
|
obj-$(CONFIG_ELAN_CPUFREQ) += elanfreq.o
|
||||||
|
obj-$(CONFIG_SC520_CPUFREQ) += sc520_freq.o
|
||||||
obj-$(CONFIG_X86_LONGRUN) += longrun.o
|
obj-$(CONFIG_X86_LONGRUN) += longrun.o
|
||||||
obj-$(CONFIG_X86_GX_SUSPMOD) += gx-suspmod.o
|
obj-$(CONFIG_X86_GX_SUSPMOD) += gx-suspmod.o
|
||||||
obj-$(CONFIG_X86_SPEEDSTEP_ICH) += speedstep-ich.o
|
obj-$(CONFIG_X86_SPEEDSTEP_ICH) += speedstep-ich.o
|
||||||
|
|
|
@ -29,6 +29,7 @@
|
||||||
#include <linux/cpufreq.h>
|
#include <linux/cpufreq.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
#include <linux/pci.h>
|
||||||
|
|
||||||
#include <asm/msr.h>
|
#include <asm/msr.h>
|
||||||
#include <asm/timex.h>
|
#include <asm/timex.h>
|
||||||
|
@ -119,7 +120,13 @@ static int longhaul_get_cpu_mult(void)
|
||||||
static void do_powersaver(union msr_longhaul *longhaul,
|
static void do_powersaver(union msr_longhaul *longhaul,
|
||||||
unsigned int clock_ratio_index)
|
unsigned int clock_ratio_index)
|
||||||
{
|
{
|
||||||
|
struct pci_dev *dev;
|
||||||
|
unsigned long flags;
|
||||||
|
unsigned int tmp_mask;
|
||||||
int version;
|
int version;
|
||||||
|
int i;
|
||||||
|
u16 pci_cmd;
|
||||||
|
u16 cmd_state[64];
|
||||||
|
|
||||||
switch (cpu_model) {
|
switch (cpu_model) {
|
||||||
case CPU_EZRA_T:
|
case CPU_EZRA_T:
|
||||||
|
@ -137,17 +144,58 @@ static void do_powersaver(union msr_longhaul *longhaul,
|
||||||
longhaul->bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4;
|
longhaul->bits.SoftBusRatio4 = (clock_ratio_index & 0x10) >> 4;
|
||||||
longhaul->bits.EnableSoftBusRatio = 1;
|
longhaul->bits.EnableSoftBusRatio = 1;
|
||||||
longhaul->bits.RevisionKey = 0;
|
longhaul->bits.RevisionKey = 0;
|
||||||
local_irq_disable();
|
|
||||||
wrmsrl(MSR_VIA_LONGHAUL, longhaul->val);
|
preempt_disable();
|
||||||
|
local_irq_save(flags);
|
||||||
|
|
||||||
|
/*
|
||||||
|
* get current pci bus master state for all devices
|
||||||
|
* and clear bus master bit
|
||||||
|
*/
|
||||||
|
dev = NULL;
|
||||||
|
i = 0;
|
||||||
|
do {
|
||||||
|
dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev);
|
||||||
|
if (dev != NULL) {
|
||||||
|
pci_read_config_word(dev, PCI_COMMAND, &pci_cmd);
|
||||||
|
cmd_state[i++] = pci_cmd;
|
||||||
|
pci_cmd &= ~PCI_COMMAND_MASTER;
|
||||||
|
pci_write_config_word(dev, PCI_COMMAND, pci_cmd);
|
||||||
|
}
|
||||||
|
} while (dev != NULL);
|
||||||
|
|
||||||
|
tmp_mask=inb(0x21); /* works on C3. save mask. */
|
||||||
|
outb(0xFE,0x21); /* TMR0 only */
|
||||||
|
outb(0xFF,0x80); /* delay */
|
||||||
|
|
||||||
local_irq_enable();
|
local_irq_enable();
|
||||||
|
|
||||||
|
__hlt();
|
||||||
|
wrmsrl(MSR_VIA_LONGHAUL, longhaul->val);
|
||||||
__hlt();
|
__hlt();
|
||||||
|
|
||||||
|
local_irq_disable();
|
||||||
|
|
||||||
|
outb(tmp_mask,0x21); /* restore mask */
|
||||||
|
|
||||||
|
/* restore pci bus master state for all devices */
|
||||||
|
dev = NULL;
|
||||||
|
i = 0;
|
||||||
|
do {
|
||||||
|
dev = pci_get_device(PCI_ANY_ID, PCI_ANY_ID, dev);
|
||||||
|
if (dev != NULL) {
|
||||||
|
pci_cmd = cmd_state[i++];
|
||||||
|
pci_write_config_byte(dev, PCI_COMMAND, pci_cmd);
|
||||||
|
}
|
||||||
|
} while (dev != NULL);
|
||||||
|
local_irq_restore(flags);
|
||||||
|
preempt_enable();
|
||||||
|
|
||||||
|
/* disable bus ratio bit */
|
||||||
rdmsrl(MSR_VIA_LONGHAUL, longhaul->val);
|
rdmsrl(MSR_VIA_LONGHAUL, longhaul->val);
|
||||||
longhaul->bits.EnableSoftBusRatio = 0;
|
longhaul->bits.EnableSoftBusRatio = 0;
|
||||||
longhaul->bits.RevisionKey = version;
|
longhaul->bits.RevisionKey = version;
|
||||||
local_irq_disable();
|
|
||||||
wrmsrl(MSR_VIA_LONGHAUL, longhaul->val);
|
wrmsrl(MSR_VIA_LONGHAUL, longhaul->val);
|
||||||
local_irq_enable();
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -578,7 +626,7 @@ static int __init longhaul_cpu_init(struct cpufreq_policy *policy)
|
||||||
longhaul_setup_voltagescaling();
|
longhaul_setup_voltagescaling();
|
||||||
|
|
||||||
policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
|
policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
|
||||||
policy->cpuinfo.transition_latency = CPUFREQ_ETERNAL;
|
policy->cpuinfo.transition_latency = 200000; /* nsec */
|
||||||
policy->cur = calc_speed(longhaul_get_cpu_mult());
|
policy->cur = calc_speed(longhaul_get_cpu_mult());
|
||||||
|
|
||||||
ret = cpufreq_frequency_table_cpuinfo(policy, longhaul_table);
|
ret = cpufreq_frequency_table_cpuinfo(policy, longhaul_table);
|
||||||
|
|
|
@ -23,6 +23,7 @@
|
||||||
#include <linux/dmi.h>
|
#include <linux/dmi.h>
|
||||||
|
|
||||||
#include <asm/msr.h>
|
#include <asm/msr.h>
|
||||||
|
#include <asm/timer.h>
|
||||||
#include <asm/timex.h>
|
#include <asm/timex.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
@ -586,13 +587,17 @@ static int __init powernow_cpu_init (struct cpufreq_policy *policy)
|
||||||
|
|
||||||
rdmsrl (MSR_K7_FID_VID_STATUS, fidvidstatus.val);
|
rdmsrl (MSR_K7_FID_VID_STATUS, fidvidstatus.val);
|
||||||
|
|
||||||
/* A K7 with powernow technology is set to max frequency by BIOS */
|
/* recalibrate cpu_khz */
|
||||||
fsb = (10 * cpu_khz) / fid_codes[fidvidstatus.bits.MFID];
|
result = recalibrate_cpu_khz();
|
||||||
|
if (result)
|
||||||
|
return result;
|
||||||
|
|
||||||
|
fsb = (10 * cpu_khz) / fid_codes[fidvidstatus.bits.CFID];
|
||||||
if (!fsb) {
|
if (!fsb) {
|
||||||
printk(KERN_WARNING PFX "can not determine bus frequency\n");
|
printk(KERN_WARNING PFX "can not determine bus frequency\n");
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
}
|
}
|
||||||
dprintk("FSB: %3d.%03d MHz\n", fsb/1000, fsb%1000);
|
dprintk("FSB: %3dMHz\n", fsb/1000);
|
||||||
|
|
||||||
if (dmi_check_system(powernow_dmi_table) || acpi_force) {
|
if (dmi_check_system(powernow_dmi_table) || acpi_force) {
|
||||||
printk (KERN_INFO PFX "PSB/PST known to be broken. Trying ACPI instead\n");
|
printk (KERN_INFO PFX "PSB/PST known to be broken. Trying ACPI instead\n");
|
||||||
|
|
|
@ -4,7 +4,7 @@
|
||||||
* GNU general public license version 2. See "COPYING" or
|
* GNU general public license version 2. See "COPYING" or
|
||||||
* http://www.gnu.org/licenses/gpl.html
|
* http://www.gnu.org/licenses/gpl.html
|
||||||
*
|
*
|
||||||
* Support : paul.devriendt@amd.com
|
* Support : mark.langsdorf@amd.com
|
||||||
*
|
*
|
||||||
* Based on the powernow-k7.c module written by Dave Jones.
|
* Based on the powernow-k7.c module written by Dave Jones.
|
||||||
* (C) 2003 Dave Jones <davej@codemonkey.org.uk> on behalf of SuSE Labs
|
* (C) 2003 Dave Jones <davej@codemonkey.org.uk> on behalf of SuSE Labs
|
||||||
|
@ -15,12 +15,13 @@
|
||||||
*
|
*
|
||||||
* Valuable input gratefully received from Dave Jones, Pavel Machek,
|
* Valuable input gratefully received from Dave Jones, Pavel Machek,
|
||||||
* Dominik Brodowski, and others.
|
* Dominik Brodowski, and others.
|
||||||
|
* Originally developed by Paul Devriendt.
|
||||||
* Processor information obtained from Chapter 9 (Power and Thermal Management)
|
* Processor information obtained from Chapter 9 (Power and Thermal Management)
|
||||||
* of the "BIOS and Kernel Developer's Guide for the AMD Athlon 64 and AMD
|
* of the "BIOS and Kernel Developer's Guide for the AMD Athlon 64 and AMD
|
||||||
* Opteron Processors" available for download from www.amd.com
|
* Opteron Processors" available for download from www.amd.com
|
||||||
*
|
*
|
||||||
* Tables for specific CPUs can be infrerred from
|
* Tables for specific CPUs can be infrerred from
|
||||||
* http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/30430.pdf
|
* http://www.amd.com/us-en/assets/content_type/white_papers_and_tech_docs/30430.pdf
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
|
@ -30,6 +31,7 @@
|
||||||
#include <linux/cpufreq.h>
|
#include <linux/cpufreq.h>
|
||||||
#include <linux/slab.h>
|
#include <linux/slab.h>
|
||||||
#include <linux/string.h>
|
#include <linux/string.h>
|
||||||
|
#include <linux/cpumask.h>
|
||||||
|
|
||||||
#include <asm/msr.h>
|
#include <asm/msr.h>
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
|
@ -42,7 +44,7 @@
|
||||||
|
|
||||||
#define PFX "powernow-k8: "
|
#define PFX "powernow-k8: "
|
||||||
#define BFX PFX "BIOS error: "
|
#define BFX PFX "BIOS error: "
|
||||||
#define VERSION "version 1.00.09e"
|
#define VERSION "version 1.40.2"
|
||||||
#include "powernow-k8.h"
|
#include "powernow-k8.h"
|
||||||
|
|
||||||
/* serialize freq changes */
|
/* serialize freq changes */
|
||||||
|
@ -50,6 +52,10 @@ static DECLARE_MUTEX(fidvid_sem);
|
||||||
|
|
||||||
static struct powernow_k8_data *powernow_data[NR_CPUS];
|
static struct powernow_k8_data *powernow_data[NR_CPUS];
|
||||||
|
|
||||||
|
#ifndef CONFIG_SMP
|
||||||
|
static cpumask_t cpu_core_map[1];
|
||||||
|
#endif
|
||||||
|
|
||||||
/* Return a frequency in MHz, given an input fid */
|
/* Return a frequency in MHz, given an input fid */
|
||||||
static u32 find_freq_from_fid(u32 fid)
|
static u32 find_freq_from_fid(u32 fid)
|
||||||
{
|
{
|
||||||
|
@ -274,11 +280,18 @@ static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid
|
||||||
{
|
{
|
||||||
u32 rvosteps = data->rvo;
|
u32 rvosteps = data->rvo;
|
||||||
u32 savefid = data->currfid;
|
u32 savefid = data->currfid;
|
||||||
|
u32 maxvid, lo;
|
||||||
|
|
||||||
dprintk("ph1 (cpu%d): start, currfid 0x%x, currvid 0x%x, reqvid 0x%x, rvo 0x%x\n",
|
dprintk("ph1 (cpu%d): start, currfid 0x%x, currvid 0x%x, reqvid 0x%x, rvo 0x%x\n",
|
||||||
smp_processor_id(),
|
smp_processor_id(),
|
||||||
data->currfid, data->currvid, reqvid, data->rvo);
|
data->currfid, data->currvid, reqvid, data->rvo);
|
||||||
|
|
||||||
|
rdmsr(MSR_FIDVID_STATUS, lo, maxvid);
|
||||||
|
maxvid = 0x1f & (maxvid >> 16);
|
||||||
|
dprintk("ph1 maxvid=0x%x\n", maxvid);
|
||||||
|
if (reqvid < maxvid) /* lower numbers are higher voltages */
|
||||||
|
reqvid = maxvid;
|
||||||
|
|
||||||
while (data->currvid > reqvid) {
|
while (data->currvid > reqvid) {
|
||||||
dprintk("ph1: curr 0x%x, req vid 0x%x\n",
|
dprintk("ph1: curr 0x%x, req vid 0x%x\n",
|
||||||
data->currvid, reqvid);
|
data->currvid, reqvid);
|
||||||
|
@ -286,8 +299,8 @@ static int core_voltage_pre_transition(struct powernow_k8_data *data, u32 reqvid
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
while ((rvosteps > 0) && ((data->rvo + data->currvid) > reqvid)) {
|
while ((rvosteps > 0) && ((data->rvo + data->currvid) > reqvid)) {
|
||||||
if (data->currvid == 0) {
|
if (data->currvid == maxvid) {
|
||||||
rvosteps = 0;
|
rvosteps = 0;
|
||||||
} else {
|
} else {
|
||||||
dprintk("ph1: changing vid for rvo, req 0x%x\n",
|
dprintk("ph1: changing vid for rvo, req 0x%x\n",
|
||||||
|
@ -671,7 +684,7 @@ static int find_psb_table(struct powernow_k8_data *data)
|
||||||
* BIOS and Kernel Developer's Guide, which is available on
|
* BIOS and Kernel Developer's Guide, which is available on
|
||||||
* www.amd.com
|
* www.amd.com
|
||||||
*/
|
*/
|
||||||
printk(KERN_ERR PFX "BIOS error - no PSB\n");
|
printk(KERN_INFO PFX "BIOS error - no PSB or ACPI _PSS objects\n");
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -695,7 +708,7 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
|
||||||
struct cpufreq_frequency_table *powernow_table;
|
struct cpufreq_frequency_table *powernow_table;
|
||||||
|
|
||||||
if (acpi_processor_register_performance(&data->acpi_data, data->cpu)) {
|
if (acpi_processor_register_performance(&data->acpi_data, data->cpu)) {
|
||||||
dprintk("register performance failed\n");
|
dprintk("register performance failed: bad ACPI data\n");
|
||||||
return -EIO;
|
return -EIO;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -746,22 +759,23 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
|
||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (fid < HI_FID_TABLE_BOTTOM) {
|
/* verify only 1 entry from the lo frequency table */
|
||||||
if (cntlofreq) {
|
if (fid < HI_FID_TABLE_BOTTOM) {
|
||||||
/* if both entries are the same, ignore this
|
if (cntlofreq) {
|
||||||
* one...
|
/* if both entries are the same, ignore this
|
||||||
*/
|
* one...
|
||||||
if ((powernow_table[i].frequency != powernow_table[cntlofreq].frequency) ||
|
*/
|
||||||
(powernow_table[i].index != powernow_table[cntlofreq].index)) {
|
if ((powernow_table[i].frequency != powernow_table[cntlofreq].frequency) ||
|
||||||
printk(KERN_ERR PFX "Too many lo freq table entries\n");
|
(powernow_table[i].index != powernow_table[cntlofreq].index)) {
|
||||||
goto err_out_mem;
|
printk(KERN_ERR PFX "Too many lo freq table entries\n");
|
||||||
}
|
goto err_out_mem;
|
||||||
|
}
|
||||||
dprintk("double low frequency table entry, ignoring it.\n");
|
|
||||||
powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
dprintk("double low frequency table entry, ignoring it.\n");
|
||||||
continue;
|
powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
||||||
} else
|
continue;
|
||||||
cntlofreq = i;
|
} else
|
||||||
|
cntlofreq = i;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (powernow_table[i].frequency != (data->acpi_data.states[i].core_frequency * 1000)) {
|
if (powernow_table[i].frequency != (data->acpi_data.states[i].core_frequency * 1000)) {
|
||||||
|
@ -816,7 +830,7 @@ static int transition_frequency(struct powernow_k8_data *data, unsigned int inde
|
||||||
{
|
{
|
||||||
u32 fid;
|
u32 fid;
|
||||||
u32 vid;
|
u32 vid;
|
||||||
int res;
|
int res, i;
|
||||||
struct cpufreq_freqs freqs;
|
struct cpufreq_freqs freqs;
|
||||||
|
|
||||||
dprintk("cpu %d transition to index %u\n", smp_processor_id(), index);
|
dprintk("cpu %d transition to index %u\n", smp_processor_id(), index);
|
||||||
|
@ -841,7 +855,8 @@ static int transition_frequency(struct powernow_k8_data *data, unsigned int inde
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((fid < HI_FID_TABLE_BOTTOM) && (data->currfid < HI_FID_TABLE_BOTTOM)) {
|
if ((fid < HI_FID_TABLE_BOTTOM) && (data->currfid < HI_FID_TABLE_BOTTOM)) {
|
||||||
printk("ignoring illegal change in lo freq table-%x to 0x%x\n",
|
printk(KERN_ERR PFX
|
||||||
|
"ignoring illegal change in lo freq table-%x to 0x%x\n",
|
||||||
data->currfid, fid);
|
data->currfid, fid);
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
@ -850,18 +865,20 @@ static int transition_frequency(struct powernow_k8_data *data, unsigned int inde
|
||||||
smp_processor_id(), fid, vid);
|
smp_processor_id(), fid, vid);
|
||||||
|
|
||||||
freqs.cpu = data->cpu;
|
freqs.cpu = data->cpu;
|
||||||
|
|
||||||
freqs.old = find_khz_freq_from_fid(data->currfid);
|
freqs.old = find_khz_freq_from_fid(data->currfid);
|
||||||
freqs.new = find_khz_freq_from_fid(fid);
|
freqs.new = find_khz_freq_from_fid(fid);
|
||||||
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
for_each_cpu_mask(i, cpu_core_map[data->cpu]) {
|
||||||
|
freqs.cpu = i;
|
||||||
|
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||||
|
}
|
||||||
|
|
||||||
down(&fidvid_sem);
|
|
||||||
res = transition_fid_vid(data, fid, vid);
|
res = transition_fid_vid(data, fid, vid);
|
||||||
up(&fidvid_sem);
|
|
||||||
|
|
||||||
freqs.new = find_khz_freq_from_fid(data->currfid);
|
freqs.new = find_khz_freq_from_fid(data->currfid);
|
||||||
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
for_each_cpu_mask(i, cpu_core_map[data->cpu]) {
|
||||||
|
freqs.cpu = i;
|
||||||
|
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||||
|
}
|
||||||
return res;
|
return res;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -874,6 +891,7 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
|
||||||
u32 checkvid = data->currvid;
|
u32 checkvid = data->currvid;
|
||||||
unsigned int newstate;
|
unsigned int newstate;
|
||||||
int ret = -EIO;
|
int ret = -EIO;
|
||||||
|
int i;
|
||||||
|
|
||||||
/* only run on specific CPU from here on */
|
/* only run on specific CPU from here on */
|
||||||
oldmask = current->cpus_allowed;
|
oldmask = current->cpus_allowed;
|
||||||
|
@ -902,22 +920,41 @@ static int powernowk8_target(struct cpufreq_policy *pol, unsigned targfreq, unsi
|
||||||
data->currfid, data->currvid);
|
data->currfid, data->currvid);
|
||||||
|
|
||||||
if ((checkvid != data->currvid) || (checkfid != data->currfid)) {
|
if ((checkvid != data->currvid) || (checkfid != data->currfid)) {
|
||||||
printk(KERN_ERR PFX
|
printk(KERN_INFO PFX
|
||||||
"error - out of sync, fid 0x%x 0x%x, vid 0x%x 0x%x\n",
|
"error - out of sync, fix 0x%x 0x%x, vid 0x%x 0x%x\n",
|
||||||
checkfid, data->currfid, checkvid, data->currvid);
|
checkfid, data->currfid, checkvid, data->currvid);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (cpufreq_frequency_table_target(pol, data->powernow_table, targfreq, relation, &newstate))
|
if (cpufreq_frequency_table_target(pol, data->powernow_table, targfreq, relation, &newstate))
|
||||||
goto err_out;
|
goto err_out;
|
||||||
|
|
||||||
|
down(&fidvid_sem);
|
||||||
|
|
||||||
|
for_each_cpu_mask(i, cpu_core_map[pol->cpu]) {
|
||||||
|
/* make sure the sibling is initialized */
|
||||||
|
if (!powernow_data[i]) {
|
||||||
|
ret = 0;
|
||||||
|
up(&fidvid_sem);
|
||||||
|
goto err_out;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
powernow_k8_acpi_pst_values(data, newstate);
|
powernow_k8_acpi_pst_values(data, newstate);
|
||||||
|
|
||||||
if (transition_frequency(data, newstate)) {
|
if (transition_frequency(data, newstate)) {
|
||||||
printk(KERN_ERR PFX "transition frequency failed\n");
|
printk(KERN_ERR PFX "transition frequency failed\n");
|
||||||
ret = 1;
|
ret = 1;
|
||||||
|
up(&fidvid_sem);
|
||||||
goto err_out;
|
goto err_out;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/* Update all the fid/vids of our siblings */
|
||||||
|
for_each_cpu_mask(i, cpu_core_map[pol->cpu]) {
|
||||||
|
powernow_data[i]->currvid = data->currvid;
|
||||||
|
powernow_data[i]->currfid = data->currfid;
|
||||||
|
}
|
||||||
|
up(&fidvid_sem);
|
||||||
|
|
||||||
pol->cur = find_khz_freq_from_fid(data->currfid);
|
pol->cur = find_khz_freq_from_fid(data->currfid);
|
||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
|
@ -962,7 +999,7 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
|
||||||
*/
|
*/
|
||||||
|
|
||||||
if ((num_online_cpus() != 1) || (num_possible_cpus() != 1)) {
|
if ((num_online_cpus() != 1) || (num_possible_cpus() != 1)) {
|
||||||
printk(KERN_INFO PFX "MP systems not supported by PSB BIOS structure\n");
|
printk(KERN_ERR PFX "MP systems not supported by PSB BIOS structure\n");
|
||||||
kfree(data);
|
kfree(data);
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
}
|
}
|
||||||
|
@ -1003,6 +1040,7 @@ static int __init powernowk8_cpu_init(struct cpufreq_policy *pol)
|
||||||
schedule();
|
schedule();
|
||||||
|
|
||||||
pol->governor = CPUFREQ_DEFAULT_GOVERNOR;
|
pol->governor = CPUFREQ_DEFAULT_GOVERNOR;
|
||||||
|
pol->cpus = cpu_core_map[pol->cpu];
|
||||||
|
|
||||||
/* Take a crude guess here.
|
/* Take a crude guess here.
|
||||||
* That guess was in microseconds, so multiply with 1000 */
|
* That guess was in microseconds, so multiply with 1000 */
|
||||||
|
@ -1069,7 +1107,7 @@ static unsigned int powernowk8_get (unsigned int cpu)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
preempt_disable();
|
preempt_disable();
|
||||||
|
|
||||||
if (query_current_values_with_pending_wait(data))
|
if (query_current_values_with_pending_wait(data))
|
||||||
goto out;
|
goto out;
|
||||||
|
|
||||||
|
@ -1127,9 +1165,10 @@ static void __exit powernowk8_exit(void)
|
||||||
cpufreq_unregister_driver(&cpufreq_amd64_driver);
|
cpufreq_unregister_driver(&cpufreq_amd64_driver);
|
||||||
}
|
}
|
||||||
|
|
||||||
MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com>");
|
MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com> and Mark Langsdorf <mark.langsdorf@amd.com.");
|
||||||
MODULE_DESCRIPTION("AMD Athlon 64 and Opteron processor frequency driver.");
|
MODULE_DESCRIPTION("AMD Athlon 64 and Opteron processor frequency driver.");
|
||||||
MODULE_LICENSE("GPL");
|
MODULE_LICENSE("GPL");
|
||||||
|
|
||||||
late_initcall(powernowk8_init);
|
late_initcall(powernowk8_init);
|
||||||
module_exit(powernowk8_exit);
|
module_exit(powernowk8_exit);
|
||||||
|
|
||||||
|
|
|
@ -174,3 +174,18 @@ static int core_voltage_post_transition(struct powernow_k8_data *data, u32 reqvi
|
||||||
static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid);
|
static int core_frequency_transition(struct powernow_k8_data *data, u32 reqfid);
|
||||||
|
|
||||||
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index);
|
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index);
|
||||||
|
|
||||||
|
#ifndef for_each_cpu_mask
|
||||||
|
#define for_each_cpu_mask(i,mask) for (i=0;i<1;i++)
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#ifdef CONFIG_SMP
|
||||||
|
static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[])
|
||||||
|
{
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
static inline void define_siblings(int cpu, cpumask_t cpu_sharedcore_mask[])
|
||||||
|
{
|
||||||
|
cpu_set(0, cpu_sharedcore_mask[0]);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
186
arch/i386/kernel/cpu/cpufreq/sc520_freq.c
Normal file
186
arch/i386/kernel/cpu/cpufreq/sc520_freq.c
Normal file
|
@ -0,0 +1,186 @@
|
||||||
|
/*
|
||||||
|
* sc520_freq.c: cpufreq driver for the AMD Elan sc520
|
||||||
|
*
|
||||||
|
* Copyright (C) 2005 Sean Young <sean@mess.org>
|
||||||
|
*
|
||||||
|
* 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.
|
||||||
|
*
|
||||||
|
* Based on elanfreq.c
|
||||||
|
*
|
||||||
|
* 2005-03-30: - initial revision
|
||||||
|
*/
|
||||||
|
|
||||||
|
#include <linux/kernel.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
#include <linux/init.h>
|
||||||
|
|
||||||
|
#include <linux/delay.h>
|
||||||
|
#include <linux/cpufreq.h>
|
||||||
|
|
||||||
|
#include <asm/msr.h>
|
||||||
|
#include <asm/timex.h>
|
||||||
|
#include <asm/io.h>
|
||||||
|
|
||||||
|
#define MMCR_BASE 0xfffef000 /* The default base address */
|
||||||
|
#define OFFS_CPUCTL 0x2 /* CPU Control Register */
|
||||||
|
|
||||||
|
static __u8 __iomem *cpuctl;
|
||||||
|
|
||||||
|
#define dprintk(msg...) cpufreq_debug_printk(CPUFREQ_DEBUG_DRIVER, "sc520_freq", msg)
|
||||||
|
|
||||||
|
static struct cpufreq_frequency_table sc520_freq_table[] = {
|
||||||
|
{0x01, 100000},
|
||||||
|
{0x02, 133000},
|
||||||
|
{0, CPUFREQ_TABLE_END},
|
||||||
|
};
|
||||||
|
|
||||||
|
static unsigned int sc520_freq_get_cpu_frequency(unsigned int cpu)
|
||||||
|
{
|
||||||
|
u8 clockspeed_reg = *cpuctl;
|
||||||
|
|
||||||
|
switch (clockspeed_reg & 0x03) {
|
||||||
|
default:
|
||||||
|
printk(KERN_ERR "sc520_freq: error: cpuctl register has unexpected value %02x\n", clockspeed_reg);
|
||||||
|
case 0x01:
|
||||||
|
return 100000;
|
||||||
|
case 0x02:
|
||||||
|
return 133000;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
static void sc520_freq_set_cpu_state (unsigned int state)
|
||||||
|
{
|
||||||
|
|
||||||
|
struct cpufreq_freqs freqs;
|
||||||
|
u8 clockspeed_reg;
|
||||||
|
|
||||||
|
freqs.old = sc520_freq_get_cpu_frequency(0);
|
||||||
|
freqs.new = sc520_freq_table[state].frequency;
|
||||||
|
freqs.cpu = 0; /* AMD Elan is UP */
|
||||||
|
|
||||||
|
cpufreq_notify_transition(&freqs, CPUFREQ_PRECHANGE);
|
||||||
|
|
||||||
|
dprintk("attempting to set frequency to %i kHz\n",
|
||||||
|
sc520_freq_table[state].frequency);
|
||||||
|
|
||||||
|
local_irq_disable();
|
||||||
|
|
||||||
|
clockspeed_reg = *cpuctl & ~0x03;
|
||||||
|
*cpuctl = clockspeed_reg | sc520_freq_table[state].index;
|
||||||
|
|
||||||
|
local_irq_enable();
|
||||||
|
|
||||||
|
cpufreq_notify_transition(&freqs, CPUFREQ_POSTCHANGE);
|
||||||
|
};
|
||||||
|
|
||||||
|
static int sc520_freq_verify (struct cpufreq_policy *policy)
|
||||||
|
{
|
||||||
|
return cpufreq_frequency_table_verify(policy, &sc520_freq_table[0]);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int sc520_freq_target (struct cpufreq_policy *policy,
|
||||||
|
unsigned int target_freq,
|
||||||
|
unsigned int relation)
|
||||||
|
{
|
||||||
|
unsigned int newstate = 0;
|
||||||
|
|
||||||
|
if (cpufreq_frequency_table_target(policy, sc520_freq_table, target_freq, relation, &newstate))
|
||||||
|
return -EINVAL;
|
||||||
|
|
||||||
|
sc520_freq_set_cpu_state(newstate);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Module init and exit code
|
||||||
|
*/
|
||||||
|
|
||||||
|
static int sc520_freq_cpu_init(struct cpufreq_policy *policy)
|
||||||
|
{
|
||||||
|
struct cpuinfo_x86 *c = cpu_data;
|
||||||
|
int result;
|
||||||
|
|
||||||
|
/* capability check */
|
||||||
|
if (c->x86_vendor != X86_VENDOR_AMD ||
|
||||||
|
c->x86 != 4 || c->x86_model != 9)
|
||||||
|
return -ENODEV;
|
||||||
|
|
||||||
|
/* cpuinfo and default policy values */
|
||||||
|
policy->governor = CPUFREQ_DEFAULT_GOVERNOR;
|
||||||
|
policy->cpuinfo.transition_latency = 1000000; /* 1ms */
|
||||||
|
policy->cur = sc520_freq_get_cpu_frequency(0);
|
||||||
|
|
||||||
|
result = cpufreq_frequency_table_cpuinfo(policy, sc520_freq_table);
|
||||||
|
if (result)
|
||||||
|
return (result);
|
||||||
|
|
||||||
|
cpufreq_frequency_table_get_attr(sc520_freq_table, policy->cpu);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static int sc520_freq_cpu_exit(struct cpufreq_policy *policy)
|
||||||
|
{
|
||||||
|
cpufreq_frequency_table_put_attr(policy->cpu);
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static struct freq_attr* sc520_freq_attr[] = {
|
||||||
|
&cpufreq_freq_attr_scaling_available_freqs,
|
||||||
|
NULL,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static struct cpufreq_driver sc520_freq_driver = {
|
||||||
|
.get = sc520_freq_get_cpu_frequency,
|
||||||
|
.verify = sc520_freq_verify,
|
||||||
|
.target = sc520_freq_target,
|
||||||
|
.init = sc520_freq_cpu_init,
|
||||||
|
.exit = sc520_freq_cpu_exit,
|
||||||
|
.name = "sc520_freq",
|
||||||
|
.owner = THIS_MODULE,
|
||||||
|
.attr = sc520_freq_attr,
|
||||||
|
};
|
||||||
|
|
||||||
|
|
||||||
|
static int __init sc520_freq_init(void)
|
||||||
|
{
|
||||||
|
struct cpuinfo_x86 *c = cpu_data;
|
||||||
|
|
||||||
|
/* Test if we have the right hardware */
|
||||||
|
if(c->x86_vendor != X86_VENDOR_AMD ||
|
||||||
|
c->x86 != 4 || c->x86_model != 9) {
|
||||||
|
dprintk("no Elan SC520 processor found!\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
cpuctl = ioremap((unsigned long)(MMCR_BASE + OFFS_CPUCTL), 1);
|
||||||
|
if(!cpuctl) {
|
||||||
|
printk(KERN_ERR "sc520_freq: error: failed to remap memory\n");
|
||||||
|
return -ENOMEM;
|
||||||
|
}
|
||||||
|
|
||||||
|
return cpufreq_register_driver(&sc520_freq_driver);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
static void __exit sc520_freq_exit(void)
|
||||||
|
{
|
||||||
|
cpufreq_unregister_driver(&sc520_freq_driver);
|
||||||
|
iounmap(cpuctl);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
MODULE_LICENSE("GPL");
|
||||||
|
MODULE_AUTHOR("Sean Young <sean@mess.org>");
|
||||||
|
MODULE_DESCRIPTION("cpufreq driver for AMD's Elan sc520 CPU");
|
||||||
|
|
||||||
|
module_init(sc520_freq_init);
|
||||||
|
module_exit(sc520_freq_exit);
|
||||||
|
|
|
@ -54,6 +54,8 @@ enum {
|
||||||
CPU_DOTHAN_A1,
|
CPU_DOTHAN_A1,
|
||||||
CPU_DOTHAN_A2,
|
CPU_DOTHAN_A2,
|
||||||
CPU_DOTHAN_B0,
|
CPU_DOTHAN_B0,
|
||||||
|
CPU_MP4HT_D0,
|
||||||
|
CPU_MP4HT_E0,
|
||||||
};
|
};
|
||||||
|
|
||||||
static const struct cpu_id cpu_ids[] = {
|
static const struct cpu_id cpu_ids[] = {
|
||||||
|
@ -61,6 +63,8 @@ static const struct cpu_id cpu_ids[] = {
|
||||||
[CPU_DOTHAN_A1] = { 6, 13, 1 },
|
[CPU_DOTHAN_A1] = { 6, 13, 1 },
|
||||||
[CPU_DOTHAN_A2] = { 6, 13, 2 },
|
[CPU_DOTHAN_A2] = { 6, 13, 2 },
|
||||||
[CPU_DOTHAN_B0] = { 6, 13, 6 },
|
[CPU_DOTHAN_B0] = { 6, 13, 6 },
|
||||||
|
[CPU_MP4HT_D0] = {15, 3, 4 },
|
||||||
|
[CPU_MP4HT_E0] = {15, 4, 1 },
|
||||||
};
|
};
|
||||||
#define N_IDS (sizeof(cpu_ids)/sizeof(cpu_ids[0]))
|
#define N_IDS (sizeof(cpu_ids)/sizeof(cpu_ids[0]))
|
||||||
|
|
||||||
|
@ -226,6 +230,8 @@ static struct cpu_model models[] =
|
||||||
{ &cpu_ids[CPU_DOTHAN_A1], NULL, 0, NULL },
|
{ &cpu_ids[CPU_DOTHAN_A1], NULL, 0, NULL },
|
||||||
{ &cpu_ids[CPU_DOTHAN_A2], NULL, 0, NULL },
|
{ &cpu_ids[CPU_DOTHAN_A2], NULL, 0, NULL },
|
||||||
{ &cpu_ids[CPU_DOTHAN_B0], NULL, 0, NULL },
|
{ &cpu_ids[CPU_DOTHAN_B0], NULL, 0, NULL },
|
||||||
|
{ &cpu_ids[CPU_MP4HT_D0], NULL, 0, NULL },
|
||||||
|
{ &cpu_ids[CPU_MP4HT_E0], NULL, 0, NULL },
|
||||||
|
|
||||||
{ NULL, }
|
{ NULL, }
|
||||||
};
|
};
|
||||||
|
|
|
@ -336,7 +336,7 @@ unsigned int speedstep_get_freqs(unsigned int processor,
|
||||||
if (!prev_speed)
|
if (!prev_speed)
|
||||||
return -EIO;
|
return -EIO;
|
||||||
|
|
||||||
dprintk("previous seped is %u\n", prev_speed);
|
dprintk("previous speed is %u\n", prev_speed);
|
||||||
|
|
||||||
local_irq_save(flags);
|
local_irq_save(flags);
|
||||||
|
|
||||||
|
@ -348,7 +348,7 @@ unsigned int speedstep_get_freqs(unsigned int processor,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
dprintk("low seped is %u\n", *low_speed);
|
dprintk("low speed is %u\n", *low_speed);
|
||||||
|
|
||||||
/* switch to high state */
|
/* switch to high state */
|
||||||
set_state(SPEEDSTEP_HIGH);
|
set_state(SPEEDSTEP_HIGH);
|
||||||
|
@ -358,7 +358,7 @@ unsigned int speedstep_get_freqs(unsigned int processor,
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
|
||||||
dprintk("high seped is %u\n", *high_speed);
|
dprintk("high speed is %u\n", *high_speed);
|
||||||
|
|
||||||
if (*low_speed == *high_speed) {
|
if (*low_speed == *high_speed) {
|
||||||
ret = -ENODEV;
|
ret = -ENODEV;
|
||||||
|
|
|
@ -357,6 +357,9 @@ static int __init speedstep_init(void)
|
||||||
case SPEEDSTEP_PROCESSOR_PIII_C:
|
case SPEEDSTEP_PROCESSOR_PIII_C:
|
||||||
case SPEEDSTEP_PROCESSOR_PIII_C_EARLY:
|
case SPEEDSTEP_PROCESSOR_PIII_C_EARLY:
|
||||||
break;
|
break;
|
||||||
|
case SPEEDSTEP_PROCESSOR_P4M:
|
||||||
|
printk(KERN_INFO "speedstep-smi: you're trying to use this cpufreq driver on a Pentium 4-based CPU. Most likely it will not work.\n");
|
||||||
|
break;
|
||||||
default:
|
default:
|
||||||
speedstep_processor = 0;
|
speedstep_processor = 0;
|
||||||
}
|
}
|
||||||
|
|
|
@ -118,7 +118,7 @@ struct _cpuid4_info {
|
||||||
};
|
};
|
||||||
|
|
||||||
#define MAX_CACHE_LEAVES 4
|
#define MAX_CACHE_LEAVES 4
|
||||||
static unsigned short __devinitdata num_cache_leaves;
|
static unsigned short num_cache_leaves;
|
||||||
|
|
||||||
static int __devinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf)
|
static int __devinit cpuid4_cache_lookup(int index, struct _cpuid4_info *this_leaf)
|
||||||
{
|
{
|
||||||
|
|
|
@ -218,12 +218,12 @@ typedef struct {
|
||||||
mtrr_type type;
|
mtrr_type type;
|
||||||
} arr_state_t;
|
} arr_state_t;
|
||||||
|
|
||||||
static arr_state_t arr_state[8] __initdata = {
|
static arr_state_t arr_state[8] __devinitdata = {
|
||||||
{0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL},
|
{0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL},
|
||||||
{0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}
|
{0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}, {0UL, 0UL, 0UL}
|
||||||
};
|
};
|
||||||
|
|
||||||
static unsigned char ccr_state[7] __initdata = { 0, 0, 0, 0, 0, 0, 0 };
|
static unsigned char ccr_state[7] __devinitdata = { 0, 0, 0, 0, 0, 0, 0 };
|
||||||
|
|
||||||
static void cyrix_set_all(void)
|
static void cyrix_set_all(void)
|
||||||
{
|
{
|
||||||
|
|
|
@ -169,10 +169,6 @@ EXPORT_SYMBOL(rtc_lock);
|
||||||
EXPORT_SYMBOL_GPL(set_nmi_callback);
|
EXPORT_SYMBOL_GPL(set_nmi_callback);
|
||||||
EXPORT_SYMBOL_GPL(unset_nmi_callback);
|
EXPORT_SYMBOL_GPL(unset_nmi_callback);
|
||||||
|
|
||||||
#undef memcmp
|
|
||||||
extern int memcmp(const void *,const void *,__kernel_size_t);
|
|
||||||
EXPORT_SYMBOL(memcmp);
|
|
||||||
|
|
||||||
EXPORT_SYMBOL(register_die_notifier);
|
EXPORT_SYMBOL(register_die_notifier);
|
||||||
#ifdef CONFIG_HAVE_DEC_LOCK
|
#ifdef CONFIG_HAVE_DEC_LOCK
|
||||||
EXPORT_SYMBOL(_atomic_dec_and_lock);
|
EXPORT_SYMBOL(_atomic_dec_and_lock);
|
||||||
|
|
|
@ -217,6 +217,13 @@ static void resume_execution(struct kprobe *p, struct pt_regs *regs)
|
||||||
*tos &= ~(TF_MASK | IF_MASK);
|
*tos &= ~(TF_MASK | IF_MASK);
|
||||||
*tos |= kprobe_old_eflags;
|
*tos |= kprobe_old_eflags;
|
||||||
break;
|
break;
|
||||||
|
case 0xc3: /* ret/lret */
|
||||||
|
case 0xcb:
|
||||||
|
case 0xc2:
|
||||||
|
case 0xca:
|
||||||
|
regs->eflags &= ~TF_MASK;
|
||||||
|
/* eip is already adjusted, no more changes required*/
|
||||||
|
return;
|
||||||
case 0xe8: /* call relative - Fix return addr */
|
case 0xe8: /* call relative - Fix return addr */
|
||||||
*tos = orig_eip + (*tos - copy_eip);
|
*tos = orig_eip + (*tos - copy_eip);
|
||||||
break;
|
break;
|
||||||
|
|
|
@ -400,11 +400,6 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p->thread_info)) - 1;
|
childregs = ((struct pt_regs *) (THREAD_SIZE + (unsigned long) p->thread_info)) - 1;
|
||||||
*childregs = *regs;
|
|
||||||
childregs->eax = 0;
|
|
||||||
childregs->esp = esp;
|
|
||||||
|
|
||||||
p->thread.esp = (unsigned long) childregs;
|
|
||||||
/*
|
/*
|
||||||
* The below -8 is to reserve 8 bytes on top of the ring0 stack.
|
* The below -8 is to reserve 8 bytes on top of the ring0 stack.
|
||||||
* This is necessary to guarantee that the entire "struct pt_regs"
|
* This is necessary to guarantee that the entire "struct pt_regs"
|
||||||
|
@ -415,7 +410,13 @@ int copy_thread(int nr, unsigned long clone_flags, unsigned long esp,
|
||||||
* "struct pt_regs" is possible, but they may contain the
|
* "struct pt_regs" is possible, but they may contain the
|
||||||
* completely wrong values.
|
* completely wrong values.
|
||||||
*/
|
*/
|
||||||
p->thread.esp0 = (unsigned long) (childregs+1) - 8;
|
childregs = (struct pt_regs *) ((unsigned long) childregs - 8);
|
||||||
|
*childregs = *regs;
|
||||||
|
childregs->eax = 0;
|
||||||
|
childregs->esp = esp;
|
||||||
|
|
||||||
|
p->thread.esp = (unsigned long) childregs;
|
||||||
|
p->thread.esp0 = (unsigned long) (childregs+1);
|
||||||
|
|
||||||
p->thread.eip = (unsigned long) ret_from_fork;
|
p->thread.eip = (unsigned long) ret_from_fork;
|
||||||
|
|
||||||
|
|
|
@ -1502,11 +1502,13 @@ void __init setup_arch(char **cmdline_p)
|
||||||
if (efi_enabled)
|
if (efi_enabled)
|
||||||
efi_map_memmap();
|
efi_map_memmap();
|
||||||
|
|
||||||
|
#ifdef CONFIG_ACPI_BOOT
|
||||||
/*
|
/*
|
||||||
* Parse the ACPI tables for possible boot-time SMP configuration.
|
* Parse the ACPI tables for possible boot-time SMP configuration.
|
||||||
*/
|
*/
|
||||||
acpi_boot_table_init();
|
acpi_boot_table_init();
|
||||||
acpi_boot_init();
|
acpi_boot_init();
|
||||||
|
#endif
|
||||||
|
|
||||||
#ifdef CONFIG_X86_LOCAL_APIC
|
#ifdef CONFIG_X86_LOCAL_APIC
|
||||||
if (smp_found_config)
|
if (smp_found_config)
|
||||||
|
|
|
@ -888,6 +888,7 @@ void *xquad_portio;
|
||||||
|
|
||||||
cpumask_t cpu_sibling_map[NR_CPUS] __cacheline_aligned;
|
cpumask_t cpu_sibling_map[NR_CPUS] __cacheline_aligned;
|
||||||
cpumask_t cpu_core_map[NR_CPUS] __cacheline_aligned;
|
cpumask_t cpu_core_map[NR_CPUS] __cacheline_aligned;
|
||||||
|
EXPORT_SYMBOL(cpu_core_map);
|
||||||
|
|
||||||
static void __init smp_boot_cpus(unsigned int max_cpus)
|
static void __init smp_boot_cpus(unsigned int max_cpus)
|
||||||
{
|
{
|
||||||
|
@ -1073,8 +1074,10 @@ static void __init smp_boot_cpus(unsigned int max_cpus)
|
||||||
cpu_set(cpu, cpu_sibling_map[cpu]);
|
cpu_set(cpu, cpu_sibling_map[cpu]);
|
||||||
}
|
}
|
||||||
|
|
||||||
if (siblings != smp_num_siblings)
|
if (siblings != smp_num_siblings) {
|
||||||
printk(KERN_WARNING "WARNING: %d siblings found for CPU%d, should be %d\n", siblings, cpu, smp_num_siblings);
|
printk(KERN_WARNING "WARNING: %d siblings found for CPU%d, should be %d\n", siblings, cpu, smp_num_siblings);
|
||||||
|
smp_num_siblings = siblings;
|
||||||
|
}
|
||||||
|
|
||||||
if (c->x86_num_cores > 1) {
|
if (c->x86_num_cores > 1) {
|
||||||
for (i = 0; i < NR_CPUS; i++) {
|
for (i = 0; i < NR_CPUS; i++) {
|
||||||
|
|
|
@ -6,6 +6,7 @@
|
||||||
#include <linux/timex.h>
|
#include <linux/timex.h>
|
||||||
#include <linux/errno.h>
|
#include <linux/errno.h>
|
||||||
#include <linux/jiffies.h>
|
#include <linux/jiffies.h>
|
||||||
|
#include <linux/module.h>
|
||||||
|
|
||||||
#include <asm/io.h>
|
#include <asm/io.h>
|
||||||
#include <asm/timer.h>
|
#include <asm/timer.h>
|
||||||
|
@ -24,7 +25,7 @@
|
||||||
|
|
||||||
#define CALIBRATE_TIME (5 * 1000020/HZ)
|
#define CALIBRATE_TIME (5 * 1000020/HZ)
|
||||||
|
|
||||||
unsigned long __init calibrate_tsc(void)
|
unsigned long calibrate_tsc(void)
|
||||||
{
|
{
|
||||||
mach_prepare_counter();
|
mach_prepare_counter();
|
||||||
|
|
||||||
|
@ -139,7 +140,7 @@ unsigned long __init calibrate_tsc_hpet(unsigned long *tsc_hpet_quotient_ptr)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* calculate cpu_khz */
|
/* calculate cpu_khz */
|
||||||
void __init init_cpu_khz(void)
|
void init_cpu_khz(void)
|
||||||
{
|
{
|
||||||
if (cpu_has_tsc) {
|
if (cpu_has_tsc) {
|
||||||
unsigned long tsc_quotient = calibrate_tsc();
|
unsigned long tsc_quotient = calibrate_tsc();
|
||||||
|
@ -158,3 +159,4 @@ void __init init_cpu_khz(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -320,6 +320,26 @@ core_initcall(cpufreq_tsc);
|
||||||
static inline void cpufreq_delayed_get(void) { return; }
|
static inline void cpufreq_delayed_get(void) { return; }
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
int recalibrate_cpu_khz(void)
|
||||||
|
{
|
||||||
|
#ifndef CONFIG_SMP
|
||||||
|
unsigned long cpu_khz_old = cpu_khz;
|
||||||
|
|
||||||
|
if (cpu_has_tsc) {
|
||||||
|
init_cpu_khz();
|
||||||
|
cpu_data[0].loops_per_jiffy =
|
||||||
|
cpufreq_scale(cpu_data[0].loops_per_jiffy,
|
||||||
|
cpu_khz_old,
|
||||||
|
cpu_khz);
|
||||||
|
return 0;
|
||||||
|
} else
|
||||||
|
return -ENODEV;
|
||||||
|
#else
|
||||||
|
return -ENODEV;
|
||||||
|
#endif
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL(recalibrate_cpu_khz);
|
||||||
|
|
||||||
static void mark_offset_tsc(void)
|
static void mark_offset_tsc(void)
|
||||||
{
|
{
|
||||||
unsigned long lost,delay;
|
unsigned long lost,delay;
|
||||||
|
|
|
@ -97,7 +97,6 @@ static void ack_vic_irq(unsigned int irq);
|
||||||
static void vic_enable_cpi(void);
|
static void vic_enable_cpi(void);
|
||||||
static void do_boot_cpu(__u8 cpuid);
|
static void do_boot_cpu(__u8 cpuid);
|
||||||
static void do_quad_bootstrap(void);
|
static void do_quad_bootstrap(void);
|
||||||
static inline void wrapper_smp_local_timer_interrupt(struct pt_regs *);
|
|
||||||
|
|
||||||
int hard_smp_processor_id(void);
|
int hard_smp_processor_id(void);
|
||||||
|
|
||||||
|
@ -125,6 +124,14 @@ send_QIC_CPI(__u32 cpuset, __u8 cpi)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
static inline void
|
||||||
|
wrapper_smp_local_timer_interrupt(struct pt_regs *regs)
|
||||||
|
{
|
||||||
|
irq_enter();
|
||||||
|
smp_local_timer_interrupt(regs);
|
||||||
|
irq_exit();
|
||||||
|
}
|
||||||
|
|
||||||
static inline void
|
static inline void
|
||||||
send_one_CPI(__u8 cpu, __u8 cpi)
|
send_one_CPI(__u8 cpu, __u8 cpi)
|
||||||
{
|
{
|
||||||
|
@ -1249,14 +1256,6 @@ smp_vic_timer_interrupt(struct pt_regs *regs)
|
||||||
smp_local_timer_interrupt(regs);
|
smp_local_timer_interrupt(regs);
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void
|
|
||||||
wrapper_smp_local_timer_interrupt(struct pt_regs *regs)
|
|
||||||
{
|
|
||||||
irq_enter();
|
|
||||||
smp_local_timer_interrupt(regs);
|
|
||||||
irq_exit();
|
|
||||||
}
|
|
||||||
|
|
||||||
/* local (per CPU) timer interrupt. It does both profiling and
|
/* local (per CPU) timer interrupt. It does both profiling and
|
||||||
* process statistics/rescheduling.
|
* process statistics/rescheduling.
|
||||||
*
|
*
|
||||||
|
|
|
@ -238,19 +238,21 @@ void iounmap(volatile void __iomem *addr)
|
||||||
addr < phys_to_virt(ISA_END_ADDRESS))
|
addr < phys_to_virt(ISA_END_ADDRESS))
|
||||||
return;
|
return;
|
||||||
|
|
||||||
p = remove_vm_area((void *) (PAGE_MASK & (unsigned long __force) addr));
|
write_lock(&vmlist_lock);
|
||||||
|
p = __remove_vm_area((void *) (PAGE_MASK & (unsigned long __force) addr));
|
||||||
if (!p) {
|
if (!p) {
|
||||||
printk("__iounmap: bad address %p\n", addr);
|
printk("iounmap: bad address %p\n", addr);
|
||||||
return;
|
goto out_unlock;
|
||||||
}
|
}
|
||||||
|
|
||||||
if ((p->flags >> 20) && p->phys_addr < virt_to_phys(high_memory) - 1) {
|
if ((p->flags >> 20) && p->phys_addr < virt_to_phys(high_memory) - 1) {
|
||||||
/* p->size includes the guard page, but cpa doesn't like that */
|
|
||||||
change_page_attr(virt_to_page(__va(p->phys_addr)),
|
change_page_attr(virt_to_page(__va(p->phys_addr)),
|
||||||
p->size >> PAGE_SHIFT,
|
p->size >> PAGE_SHIFT,
|
||||||
PAGE_KERNEL);
|
PAGE_KERNEL);
|
||||||
global_flush_tlb();
|
global_flush_tlb();
|
||||||
}
|
}
|
||||||
|
out_unlock:
|
||||||
|
write_unlock(&vmlist_lock);
|
||||||
kfree(p);
|
kfree(p);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -253,7 +253,7 @@ DECLARE_PCI_FIXUP_HEADER(PCI_VENDOR_ID_NVIDIA, PCI_DEVICE_ID_NVIDIA_NFORCE2, pci
|
||||||
#define MAX_PCIEROOT 6
|
#define MAX_PCIEROOT 6
|
||||||
static int quirk_aspm_offset[MAX_PCIEROOT << 3];
|
static int quirk_aspm_offset[MAX_PCIEROOT << 3];
|
||||||
|
|
||||||
#define GET_INDEX(a, b) (((a - PCI_DEVICE_ID_INTEL_MCH_PA) << 3) + b)
|
#define GET_INDEX(a, b) ((((a) - PCI_DEVICE_ID_INTEL_MCH_PA) << 3) + ((b) & 7))
|
||||||
|
|
||||||
static int quirk_pcie_aspm_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value)
|
static int quirk_pcie_aspm_read(struct pci_bus *bus, unsigned int devfn, int where, int size, u32 *value)
|
||||||
{
|
{
|
||||||
|
|
|
@ -1029,7 +1029,6 @@ void pcibios_penalize_isa_irq(int irq)
|
||||||
static int pirq_enable_irq(struct pci_dev *dev)
|
static int pirq_enable_irq(struct pci_dev *dev)
|
||||||
{
|
{
|
||||||
u8 pin;
|
u8 pin;
|
||||||
extern int via_interrupt_line_quirk;
|
|
||||||
struct pci_dev *temp_dev;
|
struct pci_dev *temp_dev;
|
||||||
|
|
||||||
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
|
pci_read_config_byte(dev, PCI_INTERRUPT_PIN, &pin);
|
||||||
|
@ -1084,10 +1083,6 @@ static int pirq_enable_irq(struct pci_dev *dev)
|
||||||
printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of device %s.%s\n",
|
printk(KERN_WARNING "PCI: No IRQ known for interrupt pin %c of device %s.%s\n",
|
||||||
'A' + pin, pci_name(dev), msg);
|
'A' + pin, pci_name(dev), msg);
|
||||||
}
|
}
|
||||||
/* VIA bridges use interrupt line for apic/pci steering across
|
|
||||||
the V-Link */
|
|
||||||
else if (via_interrupt_line_quirk)
|
|
||||||
pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq & 15);
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -46,6 +46,10 @@ config GENERIC_IOMAP
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
config SCHED_NO_NO_OMIT_FRAME_POINTER
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
|
||||||
choice
|
choice
|
||||||
prompt "System type"
|
prompt "System type"
|
||||||
default IA64_GENERIC
|
default IA64_GENERIC
|
||||||
|
|
|
@ -13,7 +13,6 @@
|
||||||
|
|
||||||
#define INCLUDES
|
#define INCLUDES
|
||||||
#include "compat_ioctl.c"
|
#include "compat_ioctl.c"
|
||||||
#include <asm/ioctl32.h>
|
|
||||||
|
|
||||||
#define IOCTL_NR(a) ((a) & ~(_IOC_SIZEMASK << _IOC_SIZESHIFT))
|
#define IOCTL_NR(a) ((a) & ~(_IOC_SIZEMASK << _IOC_SIZESHIFT))
|
||||||
|
|
||||||
|
|
|
@ -2427,7 +2427,7 @@ sys32_epoll_wait(int epfd, struct epoll_event32 __user * events, int maxevents,
|
||||||
{
|
{
|
||||||
struct epoll_event *events64 = NULL;
|
struct epoll_event *events64 = NULL;
|
||||||
mm_segment_t old_fs = get_fs();
|
mm_segment_t old_fs = get_fs();
|
||||||
int error, numevents, size;
|
int numevents, size;
|
||||||
int evt_idx;
|
int evt_idx;
|
||||||
int do_free_pages = 0;
|
int do_free_pages = 0;
|
||||||
|
|
||||||
|
|
|
@ -1182,7 +1182,7 @@ ENTRY(notify_resume_user)
|
||||||
;;
|
;;
|
||||||
(pNonSys) mov out2=0 // out2==0 => not a syscall
|
(pNonSys) mov out2=0 // out2==0 => not a syscall
|
||||||
.fframe 16
|
.fframe 16
|
||||||
.spillpsp ar.unat, 16 // (note that offset is relative to psp+0x10!)
|
.spillsp ar.unat, 16
|
||||||
st8 [sp]=r9,-16 // allocate space for ar.unat and save it
|
st8 [sp]=r9,-16 // allocate space for ar.unat and save it
|
||||||
st8 [out1]=loc1,-8 // save ar.pfs, out1=&sigscratch
|
st8 [out1]=loc1,-8 // save ar.pfs, out1=&sigscratch
|
||||||
.body
|
.body
|
||||||
|
@ -1208,7 +1208,7 @@ GLOBAL_ENTRY(sys_rt_sigsuspend)
|
||||||
adds out2=8,sp // out2=&sigscratch->ar_pfs
|
adds out2=8,sp // out2=&sigscratch->ar_pfs
|
||||||
;;
|
;;
|
||||||
.fframe 16
|
.fframe 16
|
||||||
.spillpsp ar.unat, 16 // (note that offset is relative to psp+0x10!)
|
.spillsp ar.unat, 16
|
||||||
st8 [sp]=r9,-16 // allocate space for ar.unat and save it
|
st8 [sp]=r9,-16 // allocate space for ar.unat and save it
|
||||||
st8 [out2]=loc1,-8 // save ar.pfs, out2=&sigscratch
|
st8 [out2]=loc1,-8 // save ar.pfs, out2=&sigscratch
|
||||||
.body
|
.body
|
||||||
|
|
|
@ -1103,8 +1103,6 @@ ia64_mca_cpe_int_caller(int cpe_irq, void *arg, struct pt_regs *ptregs)
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
|
||||||
#endif /* CONFIG_ACPI */
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* ia64_mca_cpe_poll
|
* ia64_mca_cpe_poll
|
||||||
*
|
*
|
||||||
|
@ -1122,6 +1120,8 @@ ia64_mca_cpe_poll (unsigned long dummy)
|
||||||
platform_send_ipi(first_cpu(cpu_online_map), IA64_CPEP_VECTOR, IA64_IPI_DM_INT, 0);
|
platform_send_ipi(first_cpu(cpu_online_map), IA64_CPEP_VECTOR, IA64_IPI_DM_INT, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
#endif /* CONFIG_ACPI */
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* C portion of the OS INIT handler
|
* C portion of the OS INIT handler
|
||||||
*
|
*
|
||||||
|
@ -1390,8 +1390,7 @@ ia64_mca_init(void)
|
||||||
register_percpu_irq(IA64_MCA_WAKEUP_VECTOR, &mca_wkup_irqaction);
|
register_percpu_irq(IA64_MCA_WAKEUP_VECTOR, &mca_wkup_irqaction);
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
/* Setup the CPEI/P vector and handler */
|
/* Setup the CPEI/P handler */
|
||||||
cpe_vector = acpi_request_vector(ACPI_INTERRUPT_CPEI);
|
|
||||||
register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction);
|
register_percpu_irq(IA64_CPEP_VECTOR, &mca_cpep_irqaction);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -1436,6 +1435,7 @@ ia64_mca_late_init(void)
|
||||||
|
|
||||||
#ifdef CONFIG_ACPI
|
#ifdef CONFIG_ACPI
|
||||||
/* Setup the CPEI/P vector and handler */
|
/* Setup the CPEI/P vector and handler */
|
||||||
|
cpe_vector = acpi_request_vector(ACPI_INTERRUPT_CPEI);
|
||||||
init_timer(&cpe_poll_timer);
|
init_timer(&cpe_poll_timer);
|
||||||
cpe_poll_timer.function = ia64_mca_cpe_poll;
|
cpe_poll_timer.function = ia64_mca_cpe_poll;
|
||||||
|
|
||||||
|
|
|
@ -41,7 +41,7 @@
|
||||||
(pKStk) addl r3=THIS_CPU(ia64_mca_data),r3;; \
|
(pKStk) addl r3=THIS_CPU(ia64_mca_data),r3;; \
|
||||||
(pKStk) ld8 r3 = [r3];; \
|
(pKStk) ld8 r3 = [r3];; \
|
||||||
(pKStk) addl r3=IA64_MCA_CPU_INIT_STACK_OFFSET,r3;; \
|
(pKStk) addl r3=IA64_MCA_CPU_INIT_STACK_OFFSET,r3;; \
|
||||||
(pKStk) addl sp=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r3; \
|
(pKStk) addl r1=IA64_STK_OFFSET-IA64_PT_REGS_SIZE,r3; \
|
||||||
(pUStk) mov ar.rsc=0; /* set enforced lazy mode, pl 0, little-endian, loadrs=0 */ \
|
(pUStk) mov ar.rsc=0; /* set enforced lazy mode, pl 0, little-endian, loadrs=0 */ \
|
||||||
(pUStk) addl r22=IA64_RBS_OFFSET,r1; /* compute base of register backing store */ \
|
(pUStk) addl r22=IA64_RBS_OFFSET,r1; /* compute base of register backing store */ \
|
||||||
;; \
|
;; \
|
||||||
|
@ -50,7 +50,6 @@
|
||||||
(pUStk) mov r23=ar.bspstore; /* save ar.bspstore */ \
|
(pUStk) mov r23=ar.bspstore; /* save ar.bspstore */ \
|
||||||
(pUStk) dep r22=-1,r22,61,3; /* compute kernel virtual addr of RBS */ \
|
(pUStk) dep r22=-1,r22,61,3; /* compute kernel virtual addr of RBS */ \
|
||||||
;; \
|
;; \
|
||||||
(pKStk) addl r1=-IA64_PT_REGS_SIZE,r1; /* if in kernel mode, use sp (r12) */ \
|
|
||||||
(pUStk) mov ar.bspstore=r22; /* switch to kernel RBS */ \
|
(pUStk) mov ar.bspstore=r22; /* switch to kernel RBS */ \
|
||||||
;; \
|
;; \
|
||||||
(pUStk) mov r18=ar.bsp; \
|
(pUStk) mov r18=ar.bsp; \
|
||||||
|
|
|
@ -11,7 +11,7 @@
|
||||||
* Version Perfmon-2.x is a rewrite of perfmon-1.x
|
* Version Perfmon-2.x is a rewrite of perfmon-1.x
|
||||||
* by Stephane Eranian, Hewlett Packard Co.
|
* by Stephane Eranian, Hewlett Packard Co.
|
||||||
*
|
*
|
||||||
* Copyright (C) 1999-2003, 2005 Hewlett Packard Co
|
* Copyright (C) 1999-2005 Hewlett Packard Co
|
||||||
* Stephane Eranian <eranian@hpl.hp.com>
|
* Stephane Eranian <eranian@hpl.hp.com>
|
||||||
* David Mosberger-Tang <davidm@hpl.hp.com>
|
* David Mosberger-Tang <davidm@hpl.hp.com>
|
||||||
*
|
*
|
||||||
|
@ -497,6 +497,9 @@ typedef struct {
|
||||||
static pfm_stats_t pfm_stats[NR_CPUS];
|
static pfm_stats_t pfm_stats[NR_CPUS];
|
||||||
static pfm_session_t pfm_sessions; /* global sessions information */
|
static pfm_session_t pfm_sessions; /* global sessions information */
|
||||||
|
|
||||||
|
static spinlock_t pfm_alt_install_check = SPIN_LOCK_UNLOCKED;
|
||||||
|
static pfm_intr_handler_desc_t *pfm_alt_intr_handler;
|
||||||
|
|
||||||
static struct proc_dir_entry *perfmon_dir;
|
static struct proc_dir_entry *perfmon_dir;
|
||||||
static pfm_uuid_t pfm_null_uuid = {0,};
|
static pfm_uuid_t pfm_null_uuid = {0,};
|
||||||
|
|
||||||
|
@ -606,6 +609,7 @@ DEFINE_PER_CPU(unsigned long, pfm_syst_info);
|
||||||
DEFINE_PER_CPU(struct task_struct *, pmu_owner);
|
DEFINE_PER_CPU(struct task_struct *, pmu_owner);
|
||||||
DEFINE_PER_CPU(pfm_context_t *, pmu_ctx);
|
DEFINE_PER_CPU(pfm_context_t *, pmu_ctx);
|
||||||
DEFINE_PER_CPU(unsigned long, pmu_activation_number);
|
DEFINE_PER_CPU(unsigned long, pmu_activation_number);
|
||||||
|
EXPORT_PER_CPU_SYMBOL_GPL(pfm_syst_info);
|
||||||
|
|
||||||
|
|
||||||
/* forward declaration */
|
/* forward declaration */
|
||||||
|
@ -1325,7 +1329,7 @@ pfm_reserve_session(struct task_struct *task, int is_syswide, unsigned int cpu)
|
||||||
error_conflict:
|
error_conflict:
|
||||||
DPRINT(("system wide not possible, conflicting session [%d] on CPU%d\n",
|
DPRINT(("system wide not possible, conflicting session [%d] on CPU%d\n",
|
||||||
pfm_sessions.pfs_sys_session[cpu]->pid,
|
pfm_sessions.pfs_sys_session[cpu]->pid,
|
||||||
smp_processor_id()));
|
cpu));
|
||||||
abort:
|
abort:
|
||||||
UNLOCK_PFS(flags);
|
UNLOCK_PFS(flags);
|
||||||
|
|
||||||
|
@ -5555,26 +5559,32 @@ pfm_interrupt_handler(int irq, void *arg, struct pt_regs *regs)
|
||||||
int ret;
|
int ret;
|
||||||
|
|
||||||
this_cpu = get_cpu();
|
this_cpu = get_cpu();
|
||||||
min = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_min;
|
if (likely(!pfm_alt_intr_handler)) {
|
||||||
max = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_max;
|
min = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_min;
|
||||||
|
max = pfm_stats[this_cpu].pfm_ovfl_intr_cycles_max;
|
||||||
|
|
||||||
start_cycles = ia64_get_itc();
|
start_cycles = ia64_get_itc();
|
||||||
|
|
||||||
ret = pfm_do_interrupt_handler(irq, arg, regs);
|
ret = pfm_do_interrupt_handler(irq, arg, regs);
|
||||||
|
|
||||||
total_cycles = ia64_get_itc();
|
total_cycles = ia64_get_itc();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* don't measure spurious interrupts
|
* don't measure spurious interrupts
|
||||||
*/
|
*/
|
||||||
if (likely(ret == 0)) {
|
if (likely(ret == 0)) {
|
||||||
total_cycles -= start_cycles;
|
total_cycles -= start_cycles;
|
||||||
|
|
||||||
if (total_cycles < min) pfm_stats[this_cpu].pfm_ovfl_intr_cycles_min = total_cycles;
|
if (total_cycles < min) pfm_stats[this_cpu].pfm_ovfl_intr_cycles_min = total_cycles;
|
||||||
if (total_cycles > max) pfm_stats[this_cpu].pfm_ovfl_intr_cycles_max = total_cycles;
|
if (total_cycles > max) pfm_stats[this_cpu].pfm_ovfl_intr_cycles_max = total_cycles;
|
||||||
|
|
||||||
pfm_stats[this_cpu].pfm_ovfl_intr_cycles += total_cycles;
|
pfm_stats[this_cpu].pfm_ovfl_intr_cycles += total_cycles;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
else {
|
||||||
|
(*pfm_alt_intr_handler->handler)(irq, arg, regs);
|
||||||
|
}
|
||||||
|
|
||||||
put_cpu_no_resched();
|
put_cpu_no_resched();
|
||||||
return IRQ_HANDLED;
|
return IRQ_HANDLED;
|
||||||
}
|
}
|
||||||
|
@ -6425,6 +6435,141 @@ static struct irqaction perfmon_irqaction = {
|
||||||
.name = "perfmon"
|
.name = "perfmon"
|
||||||
};
|
};
|
||||||
|
|
||||||
|
static void
|
||||||
|
pfm_alt_save_pmu_state(void *data)
|
||||||
|
{
|
||||||
|
struct pt_regs *regs;
|
||||||
|
|
||||||
|
regs = ia64_task_regs(current);
|
||||||
|
|
||||||
|
DPRINT(("called\n"));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* should not be necessary but
|
||||||
|
* let's take not risk
|
||||||
|
*/
|
||||||
|
pfm_clear_psr_up();
|
||||||
|
pfm_clear_psr_pp();
|
||||||
|
ia64_psr(regs)->pp = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* This call is required
|
||||||
|
* May cause a spurious interrupt on some processors
|
||||||
|
*/
|
||||||
|
pfm_freeze_pmu();
|
||||||
|
|
||||||
|
ia64_srlz_d();
|
||||||
|
}
|
||||||
|
|
||||||
|
void
|
||||||
|
pfm_alt_restore_pmu_state(void *data)
|
||||||
|
{
|
||||||
|
struct pt_regs *regs;
|
||||||
|
|
||||||
|
regs = ia64_task_regs(current);
|
||||||
|
|
||||||
|
DPRINT(("called\n"));
|
||||||
|
|
||||||
|
/*
|
||||||
|
* put PMU back in state expected
|
||||||
|
* by perfmon
|
||||||
|
*/
|
||||||
|
pfm_clear_psr_up();
|
||||||
|
pfm_clear_psr_pp();
|
||||||
|
ia64_psr(regs)->pp = 0;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* perfmon runs with PMU unfrozen at all times
|
||||||
|
*/
|
||||||
|
pfm_unfreeze_pmu();
|
||||||
|
|
||||||
|
ia64_srlz_d();
|
||||||
|
}
|
||||||
|
|
||||||
|
int
|
||||||
|
pfm_install_alt_pmu_interrupt(pfm_intr_handler_desc_t *hdl)
|
||||||
|
{
|
||||||
|
int ret, i;
|
||||||
|
int reserve_cpu;
|
||||||
|
|
||||||
|
/* some sanity checks */
|
||||||
|
if (hdl == NULL || hdl->handler == NULL) return -EINVAL;
|
||||||
|
|
||||||
|
/* do the easy test first */
|
||||||
|
if (pfm_alt_intr_handler) return -EBUSY;
|
||||||
|
|
||||||
|
/* one at a time in the install or remove, just fail the others */
|
||||||
|
if (!spin_trylock(&pfm_alt_install_check)) {
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* reserve our session */
|
||||||
|
for_each_online_cpu(reserve_cpu) {
|
||||||
|
ret = pfm_reserve_session(NULL, 1, reserve_cpu);
|
||||||
|
if (ret) goto cleanup_reserve;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* save the current system wide pmu states */
|
||||||
|
ret = on_each_cpu(pfm_alt_save_pmu_state, NULL, 0, 1);
|
||||||
|
if (ret) {
|
||||||
|
DPRINT(("on_each_cpu() failed: %d\n", ret));
|
||||||
|
goto cleanup_reserve;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* officially change to the alternate interrupt handler */
|
||||||
|
pfm_alt_intr_handler = hdl;
|
||||||
|
|
||||||
|
spin_unlock(&pfm_alt_install_check);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
|
||||||
|
cleanup_reserve:
|
||||||
|
for_each_online_cpu(i) {
|
||||||
|
/* don't unreserve more than we reserved */
|
||||||
|
if (i >= reserve_cpu) break;
|
||||||
|
|
||||||
|
pfm_unreserve_session(NULL, 1, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
spin_unlock(&pfm_alt_install_check);
|
||||||
|
|
||||||
|
return ret;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pfm_install_alt_pmu_interrupt);
|
||||||
|
|
||||||
|
int
|
||||||
|
pfm_remove_alt_pmu_interrupt(pfm_intr_handler_desc_t *hdl)
|
||||||
|
{
|
||||||
|
int i;
|
||||||
|
int ret;
|
||||||
|
|
||||||
|
if (hdl == NULL) return -EINVAL;
|
||||||
|
|
||||||
|
/* cannot remove someone else's handler! */
|
||||||
|
if (pfm_alt_intr_handler != hdl) return -EINVAL;
|
||||||
|
|
||||||
|
/* one at a time in the install or remove, just fail the others */
|
||||||
|
if (!spin_trylock(&pfm_alt_install_check)) {
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
|
pfm_alt_intr_handler = NULL;
|
||||||
|
|
||||||
|
ret = on_each_cpu(pfm_alt_restore_pmu_state, NULL, 0, 1);
|
||||||
|
if (ret) {
|
||||||
|
DPRINT(("on_each_cpu() failed: %d\n", ret));
|
||||||
|
}
|
||||||
|
|
||||||
|
for_each_online_cpu(i) {
|
||||||
|
pfm_unreserve_session(NULL, 1, i);
|
||||||
|
}
|
||||||
|
|
||||||
|
spin_unlock(&pfm_alt_install_check);
|
||||||
|
|
||||||
|
return 0;
|
||||||
|
}
|
||||||
|
EXPORT_SYMBOL_GPL(pfm_remove_alt_pmu_interrupt);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* perfmon initialization routine, called from the initcall() table
|
* perfmon initialization routine, called from the initcall() table
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -692,16 +692,30 @@ convert_to_non_syscall (struct task_struct *child, struct pt_regs *pt,
|
||||||
unsigned long cfm)
|
unsigned long cfm)
|
||||||
{
|
{
|
||||||
struct unw_frame_info info, prev_info;
|
struct unw_frame_info info, prev_info;
|
||||||
unsigned long ip, pr;
|
unsigned long ip, sp, pr;
|
||||||
|
|
||||||
unw_init_from_blocked_task(&info, child);
|
unw_init_from_blocked_task(&info, child);
|
||||||
while (1) {
|
while (1) {
|
||||||
prev_info = info;
|
prev_info = info;
|
||||||
if (unw_unwind(&info) < 0)
|
if (unw_unwind(&info) < 0)
|
||||||
return;
|
return;
|
||||||
if (unw_get_rp(&info, &ip) < 0)
|
|
||||||
|
unw_get_sp(&info, &sp);
|
||||||
|
if ((long)((unsigned long)child + IA64_STK_OFFSET - sp)
|
||||||
|
< IA64_PT_REGS_SIZE) {
|
||||||
|
dprintk("ptrace.%s: ran off the top of the kernel "
|
||||||
|
"stack\n", __FUNCTION__);
|
||||||
return;
|
return;
|
||||||
if (ip < FIXADDR_USER_END)
|
}
|
||||||
|
if (unw_get_pr (&prev_info, &pr) < 0) {
|
||||||
|
unw_get_rp(&prev_info, &ip);
|
||||||
|
dprintk("ptrace.%s: failed to read "
|
||||||
|
"predicate register (ip=0x%lx)\n",
|
||||||
|
__FUNCTION__, ip);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (unw_is_intr_frame(&info)
|
||||||
|
&& (pr & (1UL << PRED_USER_STACK)))
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -624,7 +624,7 @@ static struct {
|
||||||
__u16 thread_id;
|
__u16 thread_id;
|
||||||
__u16 proc_fixed_addr;
|
__u16 proc_fixed_addr;
|
||||||
__u8 valid;
|
__u8 valid;
|
||||||
}mt_info[NR_CPUS] __devinit;
|
} mt_info[NR_CPUS] __devinitdata;
|
||||||
|
|
||||||
#ifdef CONFIG_HOTPLUG_CPU
|
#ifdef CONFIG_HOTPLUG_CPU
|
||||||
static inline void
|
static inline void
|
||||||
|
|
|
@ -182,13 +182,6 @@ do_mmap2 (unsigned long addr, unsigned long len, int prot, int flags, int fd, un
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
|
||||||
* A zero mmap always succeeds in Linux, independent of whether or not the
|
|
||||||
* remaining arguments are valid.
|
|
||||||
*/
|
|
||||||
if (len == 0)
|
|
||||||
goto out;
|
|
||||||
|
|
||||||
/* Careful about overflows.. */
|
/* Careful about overflows.. */
|
||||||
len = PAGE_ALIGN(len);
|
len = PAGE_ALIGN(len);
|
||||||
if (!len || len > TASK_SIZE) {
|
if (!len || len > TASK_SIZE) {
|
||||||
|
|
|
@ -271,6 +271,8 @@ void __init sn_setup(char **cmdline_p)
|
||||||
int major = sn_sal_rev_major(), minor = sn_sal_rev_minor();
|
int major = sn_sal_rev_major(), minor = sn_sal_rev_minor();
|
||||||
extern void sn_cpu_init(void);
|
extern void sn_cpu_init(void);
|
||||||
|
|
||||||
|
ia64_sn_plat_set_error_handling_features();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* If the generic code has enabled vga console support - lets
|
* If the generic code has enabled vga console support - lets
|
||||||
* get rid of it again. This is a kludge for the fact that ACPI
|
* get rid of it again. This is a kludge for the fact that ACPI
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
/*
|
/*
|
||||||
* pmu.c, Power Management Unit routines for NEC VR4100 series.
|
* pmu.c, Power Management Unit routines for NEC VR4100 series.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2003-2004 Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
|
* Copyright (C) 2003-2005 Yoichi Yuasa <yuasa@hh.iij4u.or.jp>
|
||||||
*
|
*
|
||||||
* This program is free software; you can redistribute it and/or modify
|
* 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
|
* it under the terms of the GNU General Public License as published by
|
||||||
|
@ -17,7 +17,9 @@
|
||||||
* along with this program; if not, write to the Free Software
|
* along with this program; if not, write to the Free Software
|
||||||
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
|
||||||
*/
|
*/
|
||||||
|
#include <linux/errno.h>
|
||||||
#include <linux/init.h>
|
#include <linux/init.h>
|
||||||
|
#include <linux/ioport.h>
|
||||||
#include <linux/kernel.h>
|
#include <linux/kernel.h>
|
||||||
#include <linux/smp.h>
|
#include <linux/smp.h>
|
||||||
#include <linux/types.h>
|
#include <linux/types.h>
|
||||||
|
@ -27,20 +29,31 @@
|
||||||
#include <asm/reboot.h>
|
#include <asm/reboot.h>
|
||||||
#include <asm/system.h>
|
#include <asm/system.h>
|
||||||
|
|
||||||
#define PMUCNT2REG KSEG1ADDR(0x0f0000c6)
|
#define PMU_TYPE1_BASE 0x0b0000a0UL
|
||||||
|
#define PMU_TYPE1_SIZE 0x0eUL
|
||||||
|
|
||||||
|
#define PMU_TYPE2_BASE 0x0f0000c0UL
|
||||||
|
#define PMU_TYPE2_SIZE 0x10UL
|
||||||
|
|
||||||
|
#define PMUCNT2REG 0x06
|
||||||
#define SOFTRST 0x0010
|
#define SOFTRST 0x0010
|
||||||
|
|
||||||
|
static void __iomem *pmu_base;
|
||||||
|
|
||||||
|
#define pmu_read(offset) readw(pmu_base + (offset))
|
||||||
|
#define pmu_write(offset, value) writew((value), pmu_base + (offset))
|
||||||
|
|
||||||
static inline void software_reset(void)
|
static inline void software_reset(void)
|
||||||
{
|
{
|
||||||
uint16_t val;
|
uint16_t pmucnt2;
|
||||||
|
|
||||||
switch (current_cpu_data.cputype) {
|
switch (current_cpu_data.cputype) {
|
||||||
case CPU_VR4122:
|
case CPU_VR4122:
|
||||||
case CPU_VR4131:
|
case CPU_VR4131:
|
||||||
case CPU_VR4133:
|
case CPU_VR4133:
|
||||||
val = readw(PMUCNT2REG);
|
pmucnt2 = pmu_read(PMUCNT2REG);
|
||||||
val |= SOFTRST;
|
pmucnt2 |= SOFTRST;
|
||||||
writew(val, PMUCNT2REG);
|
pmu_write(PMUCNT2REG, pmucnt2);
|
||||||
break;
|
break;
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
|
@ -71,6 +84,34 @@ static void vr41xx_power_off(void)
|
||||||
|
|
||||||
static int __init vr41xx_pmu_init(void)
|
static int __init vr41xx_pmu_init(void)
|
||||||
{
|
{
|
||||||
|
unsigned long start, size;
|
||||||
|
|
||||||
|
switch (current_cpu_data.cputype) {
|
||||||
|
case CPU_VR4111:
|
||||||
|
case CPU_VR4121:
|
||||||
|
start = PMU_TYPE1_BASE;
|
||||||
|
size = PMU_TYPE1_SIZE;
|
||||||
|
break;
|
||||||
|
case CPU_VR4122:
|
||||||
|
case CPU_VR4131:
|
||||||
|
case CPU_VR4133:
|
||||||
|
start = PMU_TYPE2_BASE;
|
||||||
|
size = PMU_TYPE2_SIZE;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
printk("Unexpected CPU of NEC VR4100 series\n");
|
||||||
|
return -ENODEV;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (request_mem_region(start, size, "PMU") == NULL)
|
||||||
|
return -EBUSY;
|
||||||
|
|
||||||
|
pmu_base = ioremap(start, size);
|
||||||
|
if (pmu_base == NULL) {
|
||||||
|
release_mem_region(start, size);
|
||||||
|
return -EBUSY;
|
||||||
|
}
|
||||||
|
|
||||||
_machine_restart = vr41xx_restart;
|
_machine_restart = vr41xx_restart;
|
||||||
_machine_halt = vr41xx_halt;
|
_machine_halt = vr41xx_halt;
|
||||||
_machine_power_off = vr41xx_power_off;
|
_machine_power_off = vr41xx_power_off;
|
||||||
|
@ -78,4 +119,4 @@ static int __init vr41xx_pmu_init(void)
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
early_initcall(vr41xx_pmu_init);
|
core_initcall(vr41xx_pmu_init);
|
||||||
|
|
|
@ -43,6 +43,10 @@ config GENERIC_NVRAM
|
||||||
bool
|
bool
|
||||||
default y
|
default y
|
||||||
|
|
||||||
|
config SCHED_NO_NO_OMIT_FRAME_POINTER
|
||||||
|
bool
|
||||||
|
default y
|
||||||
|
|
||||||
source "init/Kconfig"
|
source "init/Kconfig"
|
||||||
|
|
||||||
menu "Processor"
|
menu "Processor"
|
||||||
|
@ -73,9 +77,11 @@ config 44x
|
||||||
bool "44x"
|
bool "44x"
|
||||||
|
|
||||||
config POWER3
|
config POWER3
|
||||||
|
select PPC_FPU
|
||||||
bool "POWER3"
|
bool "POWER3"
|
||||||
|
|
||||||
config POWER4
|
config POWER4
|
||||||
|
select PPC_FPU
|
||||||
bool "POWER4 and 970 (G5)"
|
bool "POWER4 and 970 (G5)"
|
||||||
|
|
||||||
config 8xx
|
config 8xx
|
||||||
|
@ -1137,12 +1143,12 @@ config PCI_QSPAN
|
||||||
|
|
||||||
config PCI_8260
|
config PCI_8260
|
||||||
bool
|
bool
|
||||||
depends on PCI && 8260 && !8272
|
depends on PCI && 8260
|
||||||
default y
|
default y
|
||||||
|
|
||||||
config 8260_PCI9
|
config 8260_PCI9
|
||||||
bool " Enable workaround for MPC826x erratum PCI 9"
|
bool " Enable workaround for MPC826x erratum PCI 9"
|
||||||
depends on PCI_8260
|
depends on PCI_8260 && !ADS8272
|
||||||
default y
|
default y
|
||||||
|
|
||||||
choice
|
choice
|
||||||
|
|
|
@ -22,7 +22,8 @@ targets += uImage
|
||||||
$(obj)/uImage: $(obj)/vmlinux.gz
|
$(obj)/uImage: $(obj)/vmlinux.gz
|
||||||
$(Q)rm -f $@
|
$(Q)rm -f $@
|
||||||
$(call if_changed,uimage)
|
$(call if_changed,uimage)
|
||||||
@echo ' Image: $@' $(if $(wildcard $@),'is ready','not made')
|
@echo -n ' Image: $@ '
|
||||||
|
@if [ -f $@ ]; then echo 'is ready' ; else echo 'not made'; fi
|
||||||
|
|
||||||
# Files generated that shall be removed upon make clean
|
# Files generated that shall be removed upon make clean
|
||||||
clean-files := sImage vmapus vmlinux* miboot* zImage* uImage
|
clean-files := sImage vmapus vmlinux* miboot* zImage* uImage
|
||||||
|
|
|
@ -1,7 +1,7 @@
|
||||||
#
|
#
|
||||||
# Automatically generated make config: don't edit
|
# Automatically generated make config: don't edit
|
||||||
# Linux kernel version: 2.6.11-rc1
|
# Linux kernel version: 2.6.12-rc4
|
||||||
# Thu Jan 20 01:25:35 2005
|
# Tue May 17 11:56:01 2005
|
||||||
#
|
#
|
||||||
CONFIG_MMU=y
|
CONFIG_MMU=y
|
||||||
CONFIG_GENERIC_HARDIRQS=y
|
CONFIG_GENERIC_HARDIRQS=y
|
||||||
|
@ -11,6 +11,7 @@ CONFIG_HAVE_DEC_LOCK=y
|
||||||
CONFIG_PPC=y
|
CONFIG_PPC=y
|
||||||
CONFIG_PPC32=y
|
CONFIG_PPC32=y
|
||||||
CONFIG_GENERIC_NVRAM=y
|
CONFIG_GENERIC_NVRAM=y
|
||||||
|
CONFIG_SCHED_NO_NO_OMIT_FRAME_POINTER=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Code maturity level options
|
# Code maturity level options
|
||||||
|
@ -18,6 +19,7 @@ CONFIG_GENERIC_NVRAM=y
|
||||||
CONFIG_EXPERIMENTAL=y
|
CONFIG_EXPERIMENTAL=y
|
||||||
CONFIG_CLEAN_COMPILE=y
|
CONFIG_CLEAN_COMPILE=y
|
||||||
CONFIG_BROKEN_ON_SMP=y
|
CONFIG_BROKEN_ON_SMP=y
|
||||||
|
CONFIG_INIT_ENV_ARG_LIMIT=32
|
||||||
|
|
||||||
#
|
#
|
||||||
# General setup
|
# General setup
|
||||||
|
@ -29,12 +31,14 @@ CONFIG_SYSVIPC=y
|
||||||
# CONFIG_BSD_PROCESS_ACCT is not set
|
# CONFIG_BSD_PROCESS_ACCT is not set
|
||||||
CONFIG_SYSCTL=y
|
CONFIG_SYSCTL=y
|
||||||
# CONFIG_AUDIT is not set
|
# CONFIG_AUDIT is not set
|
||||||
CONFIG_LOG_BUF_SHIFT=14
|
|
||||||
# CONFIG_HOTPLUG is not set
|
# CONFIG_HOTPLUG is not set
|
||||||
CONFIG_KOBJECT_UEVENT=y
|
CONFIG_KOBJECT_UEVENT=y
|
||||||
# CONFIG_IKCONFIG is not set
|
# CONFIG_IKCONFIG is not set
|
||||||
CONFIG_EMBEDDED=y
|
CONFIG_EMBEDDED=y
|
||||||
# CONFIG_KALLSYMS is not set
|
# CONFIG_KALLSYMS is not set
|
||||||
|
CONFIG_PRINTK=y
|
||||||
|
CONFIG_BUG=y
|
||||||
|
CONFIG_BASE_FULL=y
|
||||||
CONFIG_FUTEX=y
|
CONFIG_FUTEX=y
|
||||||
# CONFIG_EPOLL is not set
|
# CONFIG_EPOLL is not set
|
||||||
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
# CONFIG_CC_OPTIMIZE_FOR_SIZE is not set
|
||||||
|
@ -44,6 +48,7 @@ CONFIG_CC_ALIGN_LABELS=0
|
||||||
CONFIG_CC_ALIGN_LOOPS=0
|
CONFIG_CC_ALIGN_LOOPS=0
|
||||||
CONFIG_CC_ALIGN_JUMPS=0
|
CONFIG_CC_ALIGN_JUMPS=0
|
||||||
# CONFIG_TINY_SHMEM is not set
|
# CONFIG_TINY_SHMEM is not set
|
||||||
|
CONFIG_BASE_SMALL=0
|
||||||
|
|
||||||
#
|
#
|
||||||
# Loadable module support
|
# Loadable module support
|
||||||
|
@ -62,10 +67,12 @@ CONFIG_CC_ALIGN_JUMPS=0
|
||||||
CONFIG_E500=y
|
CONFIG_E500=y
|
||||||
CONFIG_BOOKE=y
|
CONFIG_BOOKE=y
|
||||||
CONFIG_FSL_BOOKE=y
|
CONFIG_FSL_BOOKE=y
|
||||||
|
# CONFIG_PHYS_64BIT is not set
|
||||||
CONFIG_SPE=y
|
CONFIG_SPE=y
|
||||||
CONFIG_MATH_EMULATION=y
|
CONFIG_MATH_EMULATION=y
|
||||||
# CONFIG_CPU_FREQ is not set
|
# CONFIG_CPU_FREQ is not set
|
||||||
CONFIG_PPC_GEN550=y
|
CONFIG_PPC_GEN550=y
|
||||||
|
# CONFIG_PM is not set
|
||||||
CONFIG_85xx=y
|
CONFIG_85xx=y
|
||||||
CONFIG_PPC_INDIRECT_PCI_BE=y
|
CONFIG_PPC_INDIRECT_PCI_BE=y
|
||||||
|
|
||||||
|
@ -76,6 +83,7 @@ CONFIG_PPC_INDIRECT_PCI_BE=y
|
||||||
CONFIG_MPC8555_CDS=y
|
CONFIG_MPC8555_CDS=y
|
||||||
# CONFIG_MPC8560_ADS is not set
|
# CONFIG_MPC8560_ADS is not set
|
||||||
# CONFIG_SBC8560 is not set
|
# CONFIG_SBC8560 is not set
|
||||||
|
# CONFIG_STX_GP3 is not set
|
||||||
CONFIG_MPC8555=y
|
CONFIG_MPC8555=y
|
||||||
CONFIG_85xx_PCI2=y
|
CONFIG_85xx_PCI2=y
|
||||||
|
|
||||||
|
@ -90,6 +98,7 @@ CONFIG_CPM2=y
|
||||||
CONFIG_BINFMT_ELF=y
|
CONFIG_BINFMT_ELF=y
|
||||||
# CONFIG_BINFMT_MISC is not set
|
# CONFIG_BINFMT_MISC is not set
|
||||||
# CONFIG_CMDLINE_BOOL is not set
|
# CONFIG_CMDLINE_BOOL is not set
|
||||||
|
CONFIG_ISA_DMA_API=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Bus options
|
# Bus options
|
||||||
|
@ -104,10 +113,6 @@ CONFIG_PCI_NAMES=y
|
||||||
#
|
#
|
||||||
# CONFIG_PCCARD is not set
|
# CONFIG_PCCARD is not set
|
||||||
|
|
||||||
#
|
|
||||||
# PC-card bridges
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Advanced setup
|
# Advanced setup
|
||||||
#
|
#
|
||||||
|
@ -180,7 +185,59 @@ CONFIG_IOSCHED_CFQ=y
|
||||||
#
|
#
|
||||||
# ATA/ATAPI/MFM/RLL support
|
# ATA/ATAPI/MFM/RLL support
|
||||||
#
|
#
|
||||||
# CONFIG_IDE is not set
|
CONFIG_IDE=y
|
||||||
|
CONFIG_BLK_DEV_IDE=y
|
||||||
|
|
||||||
|
#
|
||||||
|
# Please see Documentation/ide.txt for help/info on IDE drives
|
||||||
|
#
|
||||||
|
# CONFIG_BLK_DEV_IDE_SATA is not set
|
||||||
|
CONFIG_BLK_DEV_IDEDISK=y
|
||||||
|
# CONFIG_IDEDISK_MULTI_MODE is not set
|
||||||
|
# CONFIG_BLK_DEV_IDECD is not set
|
||||||
|
# CONFIG_BLK_DEV_IDETAPE is not set
|
||||||
|
# CONFIG_BLK_DEV_IDEFLOPPY is not set
|
||||||
|
# CONFIG_IDE_TASK_IOCTL is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# IDE chipset support/bugfixes
|
||||||
|
#
|
||||||
|
CONFIG_IDE_GENERIC=y
|
||||||
|
CONFIG_BLK_DEV_IDEPCI=y
|
||||||
|
CONFIG_IDEPCI_SHARE_IRQ=y
|
||||||
|
# CONFIG_BLK_DEV_OFFBOARD is not set
|
||||||
|
CONFIG_BLK_DEV_GENERIC=y
|
||||||
|
# CONFIG_BLK_DEV_OPTI621 is not set
|
||||||
|
# CONFIG_BLK_DEV_SL82C105 is not set
|
||||||
|
CONFIG_BLK_DEV_IDEDMA_PCI=y
|
||||||
|
# CONFIG_BLK_DEV_IDEDMA_FORCED is not set
|
||||||
|
CONFIG_IDEDMA_PCI_AUTO=y
|
||||||
|
# CONFIG_IDEDMA_ONLYDISK is not set
|
||||||
|
# CONFIG_BLK_DEV_AEC62XX is not set
|
||||||
|
# CONFIG_BLK_DEV_ALI15X3 is not set
|
||||||
|
# CONFIG_BLK_DEV_AMD74XX is not set
|
||||||
|
# CONFIG_BLK_DEV_CMD64X is not set
|
||||||
|
# CONFIG_BLK_DEV_TRIFLEX is not set
|
||||||
|
# CONFIG_BLK_DEV_CY82C693 is not set
|
||||||
|
# CONFIG_BLK_DEV_CS5520 is not set
|
||||||
|
# CONFIG_BLK_DEV_CS5530 is not set
|
||||||
|
# CONFIG_BLK_DEV_HPT34X is not set
|
||||||
|
# CONFIG_BLK_DEV_HPT366 is not set
|
||||||
|
# CONFIG_BLK_DEV_SC1200 is not set
|
||||||
|
# CONFIG_BLK_DEV_PIIX is not set
|
||||||
|
# CONFIG_BLK_DEV_NS87415 is not set
|
||||||
|
# CONFIG_BLK_DEV_PDC202XX_OLD is not set
|
||||||
|
# CONFIG_BLK_DEV_PDC202XX_NEW is not set
|
||||||
|
# CONFIG_BLK_DEV_SVWKS is not set
|
||||||
|
# CONFIG_BLK_DEV_SIIMAGE is not set
|
||||||
|
# CONFIG_BLK_DEV_SLC90E66 is not set
|
||||||
|
# CONFIG_BLK_DEV_TRM290 is not set
|
||||||
|
CONFIG_BLK_DEV_VIA82CXXX=y
|
||||||
|
# CONFIG_IDE_ARM is not set
|
||||||
|
CONFIG_BLK_DEV_IDEDMA=y
|
||||||
|
# CONFIG_IDEDMA_IVB is not set
|
||||||
|
CONFIG_IDEDMA_AUTO=y
|
||||||
|
# CONFIG_BLK_DEV_HD is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# SCSI device support
|
# SCSI device support
|
||||||
|
@ -220,7 +277,6 @@ CONFIG_NET=y
|
||||||
#
|
#
|
||||||
CONFIG_PACKET=y
|
CONFIG_PACKET=y
|
||||||
# CONFIG_PACKET_MMAP is not set
|
# CONFIG_PACKET_MMAP is not set
|
||||||
# CONFIG_NETLINK_DEV is not set
|
|
||||||
CONFIG_UNIX=y
|
CONFIG_UNIX=y
|
||||||
# CONFIG_NET_KEY is not set
|
# CONFIG_NET_KEY is not set
|
||||||
CONFIG_INET=y
|
CONFIG_INET=y
|
||||||
|
@ -369,14 +425,6 @@ CONFIG_INPUT=y
|
||||||
# CONFIG_INPUT_EVDEV is not set
|
# CONFIG_INPUT_EVDEV is not set
|
||||||
# CONFIG_INPUT_EVBUG is not set
|
# CONFIG_INPUT_EVBUG is not set
|
||||||
|
|
||||||
#
|
|
||||||
# Input I/O drivers
|
|
||||||
#
|
|
||||||
# CONFIG_GAMEPORT is not set
|
|
||||||
CONFIG_SOUND_GAMEPORT=y
|
|
||||||
# CONFIG_SERIO is not set
|
|
||||||
# CONFIG_SERIO_I8042 is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Input Device Drivers
|
# Input Device Drivers
|
||||||
#
|
#
|
||||||
|
@ -386,6 +434,13 @@ CONFIG_SOUND_GAMEPORT=y
|
||||||
# CONFIG_INPUT_TOUCHSCREEN is not set
|
# CONFIG_INPUT_TOUCHSCREEN is not set
|
||||||
# CONFIG_INPUT_MISC is not set
|
# CONFIG_INPUT_MISC is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# Hardware I/O ports
|
||||||
|
#
|
||||||
|
# CONFIG_SERIO is not set
|
||||||
|
# CONFIG_GAMEPORT is not set
|
||||||
|
CONFIG_SOUND_GAMEPORT=y
|
||||||
|
|
||||||
#
|
#
|
||||||
# Character devices
|
# Character devices
|
||||||
#
|
#
|
||||||
|
@ -406,6 +461,7 @@ CONFIG_SERIAL_8250_NR_UARTS=4
|
||||||
CONFIG_SERIAL_CORE=y
|
CONFIG_SERIAL_CORE=y
|
||||||
CONFIG_SERIAL_CORE_CONSOLE=y
|
CONFIG_SERIAL_CORE_CONSOLE=y
|
||||||
# CONFIG_SERIAL_CPM is not set
|
# CONFIG_SERIAL_CPM is not set
|
||||||
|
# CONFIG_SERIAL_JSM is not set
|
||||||
CONFIG_UNIX98_PTYS=y
|
CONFIG_UNIX98_PTYS=y
|
||||||
CONFIG_LEGACY_PTYS=y
|
CONFIG_LEGACY_PTYS=y
|
||||||
CONFIG_LEGACY_PTY_COUNT=256
|
CONFIG_LEGACY_PTY_COUNT=256
|
||||||
|
@ -433,6 +489,11 @@ CONFIG_GEN_RTC=y
|
||||||
# CONFIG_DRM is not set
|
# CONFIG_DRM is not set
|
||||||
# CONFIG_RAW_DRIVER is not set
|
# CONFIG_RAW_DRIVER is not set
|
||||||
|
|
||||||
|
#
|
||||||
|
# TPM devices
|
||||||
|
#
|
||||||
|
# CONFIG_TCG_TPM is not set
|
||||||
|
|
||||||
#
|
#
|
||||||
# I2C support
|
# I2C support
|
||||||
#
|
#
|
||||||
|
@ -456,11 +517,11 @@ CONFIG_I2C_CHARDEV=y
|
||||||
# CONFIG_I2C_AMD8111 is not set
|
# CONFIG_I2C_AMD8111 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_ISA is not set
|
# CONFIG_I2C_ISA is not set
|
||||||
CONFIG_I2C_MPC=y
|
CONFIG_I2C_MPC=y
|
||||||
# CONFIG_I2C_NFORCE2 is not set
|
# CONFIG_I2C_NFORCE2 is not set
|
||||||
# CONFIG_I2C_PARPORT_LIGHT is not set
|
# CONFIG_I2C_PARPORT_LIGHT is not set
|
||||||
# CONFIG_I2C_PIIX4 is not set
|
|
||||||
# CONFIG_I2C_PROSAVAGE is not set
|
# CONFIG_I2C_PROSAVAGE is not set
|
||||||
# CONFIG_I2C_SAVAGE4 is not set
|
# CONFIG_I2C_SAVAGE4 is not set
|
||||||
# CONFIG_SCx200_ACB is not set
|
# CONFIG_SCx200_ACB is not set
|
||||||
|
@ -483,7 +544,9 @@ CONFIG_I2C_MPC=y
|
||||||
# CONFIG_SENSORS_ASB100 is not set
|
# CONFIG_SENSORS_ASB100 is not set
|
||||||
# CONFIG_SENSORS_DS1621 is not set
|
# CONFIG_SENSORS_DS1621 is not set
|
||||||
# CONFIG_SENSORS_FSCHER is not set
|
# CONFIG_SENSORS_FSCHER is not set
|
||||||
|
# CONFIG_SENSORS_FSCPOS is not set
|
||||||
# CONFIG_SENSORS_GL518SM is not set
|
# CONFIG_SENSORS_GL518SM is not set
|
||||||
|
# CONFIG_SENSORS_GL520SM is not set
|
||||||
# CONFIG_SENSORS_IT87 is not set
|
# CONFIG_SENSORS_IT87 is not set
|
||||||
# CONFIG_SENSORS_LM63 is not set
|
# CONFIG_SENSORS_LM63 is not set
|
||||||
# CONFIG_SENSORS_LM75 is not set
|
# CONFIG_SENSORS_LM75 is not set
|
||||||
|
@ -494,9 +557,11 @@ CONFIG_I2C_MPC=y
|
||||||
# CONFIG_SENSORS_LM85 is not set
|
# CONFIG_SENSORS_LM85 is not set
|
||||||
# CONFIG_SENSORS_LM87 is not set
|
# CONFIG_SENSORS_LM87 is not set
|
||||||
# CONFIG_SENSORS_LM90 is not set
|
# CONFIG_SENSORS_LM90 is not set
|
||||||
|
# CONFIG_SENSORS_LM92 is not set
|
||||||
# CONFIG_SENSORS_MAX1619 is not set
|
# CONFIG_SENSORS_MAX1619 is not set
|
||||||
# CONFIG_SENSORS_PC87360 is not set
|
# CONFIG_SENSORS_PC87360 is not set
|
||||||
# CONFIG_SENSORS_SMSC47B397 is not set
|
# CONFIG_SENSORS_SMSC47B397 is not set
|
||||||
|
# CONFIG_SENSORS_SIS5595 is not set
|
||||||
# CONFIG_SENSORS_SMSC47M1 is not set
|
# CONFIG_SENSORS_SMSC47M1 is not set
|
||||||
# CONFIG_SENSORS_VIA686A is not set
|
# CONFIG_SENSORS_VIA686A is not set
|
||||||
# CONFIG_SENSORS_W83781D is not set
|
# CONFIG_SENSORS_W83781D is not set
|
||||||
|
@ -506,10 +571,12 @@ CONFIG_I2C_MPC=y
|
||||||
#
|
#
|
||||||
# Other I2C Chip support
|
# Other I2C Chip support
|
||||||
#
|
#
|
||||||
|
# CONFIG_SENSORS_DS1337 is not set
|
||||||
# CONFIG_SENSORS_EEPROM is not set
|
# CONFIG_SENSORS_EEPROM is not set
|
||||||
# CONFIG_SENSORS_PCF8574 is not set
|
# CONFIG_SENSORS_PCF8574 is not set
|
||||||
# CONFIG_SENSORS_PCF8591 is not set
|
# CONFIG_SENSORS_PCF8591 is not set
|
||||||
# CONFIG_SENSORS_RTC8564 is not set
|
# CONFIG_SENSORS_RTC8564 is not set
|
||||||
|
# CONFIG_SENSORS_M41T00 is not set
|
||||||
# CONFIG_I2C_DEBUG_CORE is not set
|
# CONFIG_I2C_DEBUG_CORE is not set
|
||||||
# CONFIG_I2C_DEBUG_ALGO is not set
|
# CONFIG_I2C_DEBUG_ALGO is not set
|
||||||
# CONFIG_I2C_DEBUG_BUS is not set
|
# CONFIG_I2C_DEBUG_BUS is not set
|
||||||
|
@ -538,7 +605,6 @@ CONFIG_I2C_MPC=y
|
||||||
# Graphics support
|
# Graphics support
|
||||||
#
|
#
|
||||||
# CONFIG_FB is not set
|
# CONFIG_FB is not set
|
||||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# Sound
|
# Sound
|
||||||
|
@ -548,13 +614,9 @@ CONFIG_I2C_MPC=y
|
||||||
#
|
#
|
||||||
# USB support
|
# USB support
|
||||||
#
|
#
|
||||||
# CONFIG_USB is not set
|
|
||||||
CONFIG_USB_ARCH_HAS_HCD=y
|
CONFIG_USB_ARCH_HAS_HCD=y
|
||||||
CONFIG_USB_ARCH_HAS_OHCI=y
|
CONFIG_USB_ARCH_HAS_OHCI=y
|
||||||
|
# CONFIG_USB is not set
|
||||||
#
|
|
||||||
# NOTE: USB_STORAGE enables SCSI, and 'SCSI disk support' may also be needed; see USB_STORAGE Help for more information
|
|
||||||
#
|
|
||||||
|
|
||||||
#
|
#
|
||||||
# USB Gadget Support
|
# USB Gadget Support
|
||||||
|
@ -585,6 +647,10 @@ CONFIG_JBD=y
|
||||||
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
|
||||||
|
|
||||||
|
#
|
||||||
|
# XFS support
|
||||||
|
#
|
||||||
# CONFIG_XFS_FS is not set
|
# CONFIG_XFS_FS is not set
|
||||||
# CONFIG_MINIX_FS is not set
|
# CONFIG_MINIX_FS is not set
|
||||||
# CONFIG_ROMFS_FS is not set
|
# CONFIG_ROMFS_FS is not set
|
||||||
|
@ -646,7 +712,6 @@ CONFIG_NFS_FS=y
|
||||||
# CONFIG_NFSD is not set
|
# CONFIG_NFSD is not set
|
||||||
CONFIG_ROOT_NFS=y
|
CONFIG_ROOT_NFS=y
|
||||||
CONFIG_LOCKD=y
|
CONFIG_LOCKD=y
|
||||||
# CONFIG_EXPORTFS is not set
|
|
||||||
CONFIG_SUNRPC=y
|
CONFIG_SUNRPC=y
|
||||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||||
|
@ -698,7 +763,9 @@ CONFIG_CRC32=y
|
||||||
#
|
#
|
||||||
# Kernel hacking
|
# Kernel hacking
|
||||||
#
|
#
|
||||||
|
# CONFIG_PRINTK_TIME is not set
|
||||||
# CONFIG_DEBUG_KERNEL is not set
|
# CONFIG_DEBUG_KERNEL is not set
|
||||||
|
CONFIG_LOG_BUF_SHIFT=14
|
||||||
# CONFIG_KGDB_CONSOLE is not set
|
# CONFIG_KGDB_CONSOLE is not set
|
||||||
# CONFIG_SERIAL_TEXT_DEBUG is not set
|
# CONFIG_SERIAL_TEXT_DEBUG is not set
|
||||||
|
|
||||||
|
|
|
@ -330,8 +330,9 @@ interrupt_base:
|
||||||
/* If we are faulting a kernel address, we have to use the
|
/* If we are faulting a kernel address, we have to use the
|
||||||
* kernel page tables.
|
* kernel page tables.
|
||||||
*/
|
*/
|
||||||
andis. r11, r10, 0x8000
|
lis r11, TASK_SIZE@h
|
||||||
beq 3f
|
cmplw r10, r11
|
||||||
|
blt+ 3f
|
||||||
lis r11, swapper_pg_dir@h
|
lis r11, swapper_pg_dir@h
|
||||||
ori r11, r11, swapper_pg_dir@l
|
ori r11, r11, swapper_pg_dir@l
|
||||||
|
|
||||||
|
@ -464,8 +465,9 @@ interrupt_base:
|
||||||
/* If we are faulting a kernel address, we have to use the
|
/* If we are faulting a kernel address, we have to use the
|
||||||
* kernel page tables.
|
* kernel page tables.
|
||||||
*/
|
*/
|
||||||
andis. r11, r10, 0x8000
|
lis r11, TASK_SIZE@h
|
||||||
beq 3f
|
cmplw r10, r11
|
||||||
|
blt+ 3f
|
||||||
lis r11, swapper_pg_dir@h
|
lis r11, swapper_pg_dir@h
|
||||||
ori r11, r11, swapper_pg_dir@l
|
ori r11, r11, swapper_pg_dir@l
|
||||||
|
|
||||||
|
@ -533,8 +535,9 @@ interrupt_base:
|
||||||
/* If we are faulting a kernel address, we have to use the
|
/* If we are faulting a kernel address, we have to use the
|
||||||
* kernel page tables.
|
* kernel page tables.
|
||||||
*/
|
*/
|
||||||
andis. r11, r10, 0x8000
|
lis r11, TASK_SIZE@h
|
||||||
beq 3f
|
cmplw r10, r11
|
||||||
|
blt+ 3f
|
||||||
lis r11, swapper_pg_dir@h
|
lis r11, swapper_pg_dir@h
|
||||||
ori r11, r11, swapper_pg_dir@l
|
ori r11, r11, swapper_pg_dir@l
|
||||||
|
|
||||||
|
|
|
@ -232,7 +232,8 @@ skpinv: addi r6,r6,1 /* Increment */
|
||||||
tlbwe
|
tlbwe
|
||||||
|
|
||||||
/* 7. Jump to KERNELBASE mapping */
|
/* 7. Jump to KERNELBASE mapping */
|
||||||
li r7,0
|
lis r7,MSR_KERNEL@h
|
||||||
|
ori r7,r7,MSR_KERNEL@l
|
||||||
bl 1f /* Find our address */
|
bl 1f /* Find our address */
|
||||||
1: mflr r9
|
1: mflr r9
|
||||||
rlwimi r6,r9,0,20,31
|
rlwimi r6,r9,0,20,31
|
||||||
|
@ -293,6 +294,18 @@ skpinv: addi r6,r6,1 /* Increment */
|
||||||
mtspr SPRN_HID0, r2
|
mtspr SPRN_HID0, r2
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#if !defined(CONFIG_BDI_SWITCH)
|
||||||
|
/*
|
||||||
|
* The Abatron BDI JTAG debugger does not tolerate others
|
||||||
|
* mucking with the debug registers.
|
||||||
|
*/
|
||||||
|
lis r2,DBCR0_IDM@h
|
||||||
|
mtspr SPRN_DBCR0,r2
|
||||||
|
/* clear any residual debug events */
|
||||||
|
li r2,-1
|
||||||
|
mtspr SPRN_DBSR,r2
|
||||||
|
#endif
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* This is where the main kernel code starts.
|
* This is where the main kernel code starts.
|
||||||
*/
|
*/
|
||||||
|
|
|
@ -221,27 +221,26 @@ int show_cpuinfo(struct seq_file *m, void *v)
|
||||||
return err;
|
return err;
|
||||||
}
|
}
|
||||||
|
|
||||||
switch (PVR_VER(pvr)) {
|
/* If we are a Freescale core do a simple check so
|
||||||
case 0x0020: /* 403 family */
|
* we dont have to keep adding cases in the future */
|
||||||
maj = PVR_MAJ(pvr) + 1;
|
if ((PVR_VER(pvr) & 0x8000) == 0x8000) {
|
||||||
min = PVR_MIN(pvr);
|
|
||||||
break;
|
|
||||||
case 0x1008: /* 740P/750P ?? */
|
|
||||||
maj = ((pvr >> 8) & 0xFF) - 1;
|
|
||||||
min = pvr & 0xFF;
|
|
||||||
break;
|
|
||||||
case 0x8083: /* e300 */
|
|
||||||
maj = PVR_MAJ(pvr);
|
maj = PVR_MAJ(pvr);
|
||||||
min = PVR_MIN(pvr);
|
min = PVR_MIN(pvr);
|
||||||
break;
|
} else {
|
||||||
case 0x8020: /* e500 */
|
switch (PVR_VER(pvr)) {
|
||||||
maj = PVR_MAJ(pvr);
|
case 0x0020: /* 403 family */
|
||||||
min = PVR_MIN(pvr);
|
maj = PVR_MAJ(pvr) + 1;
|
||||||
break;
|
min = PVR_MIN(pvr);
|
||||||
default:
|
break;
|
||||||
maj = (pvr >> 8) & 0xFF;
|
case 0x1008: /* 740P/750P ?? */
|
||||||
min = pvr & 0xFF;
|
maj = ((pvr >> 8) & 0xFF) - 1;
|
||||||
break;
|
min = pvr & 0xFF;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
maj = (pvr >> 8) & 0xFF;
|
||||||
|
min = pvr & 0xFF;
|
||||||
|
break;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
seq_printf(m, "revision\t: %hd.%hd (pvr %04x %04x)\n",
|
seq_printf(m, "revision\t: %hd.%hd (pvr %04x %04x)\n",
|
||||||
|
@ -500,7 +499,7 @@ static int __init set_preferred_console(void)
|
||||||
{
|
{
|
||||||
struct device_node *prom_stdout;
|
struct device_node *prom_stdout;
|
||||||
char *name;
|
char *name;
|
||||||
int offset;
|
int offset = 0;
|
||||||
|
|
||||||
if (of_stdout_device == NULL)
|
if (of_stdout_device == NULL)
|
||||||
return -ENODEV;
|
return -ENODEV;
|
||||||
|
@ -754,6 +753,8 @@ void __init setup_arch(char **cmdline_p)
|
||||||
strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);
|
strlcpy(saved_command_line, cmd_line, COMMAND_LINE_SIZE);
|
||||||
*cmdline_p = cmd_line;
|
*cmdline_p = cmd_line;
|
||||||
|
|
||||||
|
parse_early_param();
|
||||||
|
|
||||||
/* set up the bootmem stuff with available memory */
|
/* set up the bootmem stuff with available memory */
|
||||||
do_init_bootmem();
|
do_init_bootmem();
|
||||||
if ( ppc_md.progress ) ppc_md.progress("setup_arch: bootmem", 0x3eab);
|
if ( ppc_md.progress ) ppc_md.progress("setup_arch: bootmem", 0x3eab);
|
||||||
|
|
|
@ -408,12 +408,7 @@ static int emulate_string_inst(struct pt_regs *regs, u32 instword)
|
||||||
|
|
||||||
/* Early out if we are an invalid form of lswx */
|
/* Early out if we are an invalid form of lswx */
|
||||||
if ((instword & INST_STRING_MASK) == INST_LSWX)
|
if ((instword & INST_STRING_MASK) == INST_LSWX)
|
||||||
if ((rA >= rT) || (NB_RB >= rT) || (rT == rA) || (rT == NB_RB))
|
if ((rT == rA) || (rT == NB_RB))
|
||||||
return -EINVAL;
|
|
||||||
|
|
||||||
/* Early out if we are an invalid form of lswi */
|
|
||||||
if ((instword & INST_STRING_MASK) == INST_LSWI)
|
|
||||||
if ((rA >= rT) || (rT == rA))
|
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
EA = (rA == 0) ? 0 : regs->gpr[rA];
|
EA = (rA == 0) ? 0 : regs->gpr[rA];
|
||||||
|
|
|
@ -145,6 +145,7 @@ SECTIONS
|
||||||
__init_end = .;
|
__init_end = .;
|
||||||
|
|
||||||
. = ALIGN(4096);
|
. = ALIGN(4096);
|
||||||
|
_sextratext = .;
|
||||||
__pmac_begin = .;
|
__pmac_begin = .;
|
||||||
.pmac.text : { *(.pmac.text) }
|
.pmac.text : { *(.pmac.text) }
|
||||||
.pmac.data : { *(.pmac.data) }
|
.pmac.data : { *(.pmac.data) }
|
||||||
|
@ -171,6 +172,7 @@ SECTIONS
|
||||||
.openfirmware.data : { *(.openfirmware.data) }
|
.openfirmware.data : { *(.openfirmware.data) }
|
||||||
. = ALIGN(4096);
|
. = ALIGN(4096);
|
||||||
__openfirmware_end = .;
|
__openfirmware_end = .;
|
||||||
|
_eextratext = .;
|
||||||
|
|
||||||
__bss_start = .;
|
__bss_start = .;
|
||||||
.bss :
|
.bss :
|
||||||
|
|
|
@ -446,6 +446,7 @@ _GLOBAL(__copy_tofrom_user)
|
||||||
#ifdef CONFIG_8xx
|
#ifdef CONFIG_8xx
|
||||||
/* Don't use prefetch on 8xx */
|
/* Don't use prefetch on 8xx */
|
||||||
mtctr r0
|
mtctr r0
|
||||||
|
li r0,0
|
||||||
53: COPY_16_BYTES_WITHEX(0)
|
53: COPY_16_BYTES_WITHEX(0)
|
||||||
bdnz 53b
|
bdnz 53b
|
||||||
|
|
||||||
|
@ -564,7 +565,9 @@ _GLOBAL(__copy_tofrom_user)
|
||||||
/* or write fault in cacheline loop */
|
/* or write fault in cacheline loop */
|
||||||
105: li r9,1
|
105: li r9,1
|
||||||
92: li r3,LG_CACHELINE_BYTES
|
92: li r3,LG_CACHELINE_BYTES
|
||||||
b 99f
|
mfctr r8
|
||||||
|
add r0,r0,r8
|
||||||
|
b 106f
|
||||||
/* read fault in final word loop */
|
/* read fault in final word loop */
|
||||||
108: li r9,0
|
108: li r9,0
|
||||||
b 93f
|
b 93f
|
||||||
|
@ -585,7 +588,7 @@ _GLOBAL(__copy_tofrom_user)
|
||||||
* r5 + (ctr << r3), and r9 is 0 for read or 1 for write.
|
* r5 + (ctr << r3), and r9 is 0 for read or 1 for write.
|
||||||
*/
|
*/
|
||||||
99: mfctr r0
|
99: mfctr r0
|
||||||
slw r3,r0,r3
|
106: slw r3,r0,r3
|
||||||
add. r3,r3,r5
|
add. r3,r3,r5
|
||||||
beq 120f /* shouldn't happen */
|
beq 120f /* shouldn't happen */
|
||||||
cmpwi 0,r9,0
|
cmpwi 0,r9,0
|
||||||
|
|
|
@ -179,6 +179,7 @@ void free_initmem(void)
|
||||||
if (!have_of)
|
if (!have_of)
|
||||||
FREESEC(openfirmware);
|
FREESEC(openfirmware);
|
||||||
printk("\n");
|
printk("\n");
|
||||||
|
ppc_md.progress = NULL;
|
||||||
#undef FREESEC
|
#undef FREESEC
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -127,7 +127,6 @@ mpc834x_sys_map_io(void)
|
||||||
{
|
{
|
||||||
/* we steal the lowest ioremap addr for virt space */
|
/* we steal the lowest ioremap addr for virt space */
|
||||||
io_block_mapping(VIRT_IMMRBAR, immrbar, 1024*1024, _PAGE_IO);
|
io_block_mapping(VIRT_IMMRBAR, immrbar, 1024*1024, _PAGE_IO);
|
||||||
io_block_mapping(BCSR_VIRT_ADDR, BCSR_PHYS_ADDR, BCSR_SIZE, _PAGE_IO);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
int
|
int
|
||||||
|
|
Some files were not shown because too many files have changed in this diff Show more
Loading…
Reference in a new issue