mirror of
https://github.com/edk2-porting/linux-next.git
synced 2024-12-30 08:04:13 +08:00
Merge branch 'master' of /pub/scm/linux/kernel/git/torvalds/linux-2.6
This commit is contained in:
commit
3dae49abef
@ -26,6 +26,12 @@ Mailing list: linux-ext4@vger.kernel.org
|
||||
|
||||
git://git.kernel.org/pub/scm/fs/ext2/e2fsprogs.git
|
||||
|
||||
- Note that it is highly important to install the mke2fs.conf file
|
||||
that comes with the e2fsprogs 1.41.x sources in /etc/mke2fs.conf. If
|
||||
you have edited the /etc/mke2fs.conf file installed on your system,
|
||||
you will need to merge your changes with the version from e2fsprogs
|
||||
1.41.x.
|
||||
|
||||
- Create a new filesystem using the ext4dev filesystem type:
|
||||
|
||||
# mke2fs -t ext4dev /dev/hda1
|
||||
|
@ -11,14 +11,14 @@ for non English (read: Japanese) speakers and is not intended as a
|
||||
fork. So if you have any comments or updates for this file, please try
|
||||
to update the original English file first.
|
||||
|
||||
Last Updated: 2007/11/16
|
||||
Last Updated: 2008/08/21
|
||||
==================================
|
||||
これは、
|
||||
linux-2.6.24/Documentation/HOWTO
|
||||
linux-2.6.27/Documentation/HOWTO
|
||||
の和訳です。
|
||||
|
||||
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
|
||||
翻訳日: 2007/11/10
|
||||
翻訳日: 2008/8/5
|
||||
翻訳者: Tsugikazu Shibata <tshibata at ab dot jp dot nec dot com>
|
||||
校正者: 松倉さん <nbh--mats at nifty dot com>
|
||||
小林 雅典さん (Masanori Kobayasi) <zap03216 at nifty dot ne dot jp>
|
||||
@ -287,13 +287,15 @@ Linux カーネルの開発プロセスは現在幾つかの異なるメイン
|
||||
に安定した状態にあると判断したときにリリースされます。目標は毎週新
|
||||
しい -rc カーネルをリリースすることです。
|
||||
|
||||
- 以下の URL で各 -rc リリースに存在する既知の後戻り問題のリスト
|
||||
が追跡されます-
|
||||
http://kernelnewbies.org/known_regressions
|
||||
|
||||
- このプロセスはカーネルが 「準備ができた」と考えられるまで継続しま
|
||||
す。このプロセスはだいたい 6週間継続します。
|
||||
|
||||
- 各リリースでの既知の後戻り問題(regression: このリリースの中で新規
|
||||
に作り込まれた問題を指す) はその都度 Linux-kernel メーリングリスト
|
||||
に投稿されます。ゴールとしては、カーネルが 「準備ができた」と宣言
|
||||
する前にこのリストの長さをゼロに減らすことですが、現実には、数個の
|
||||
後戻り問題がリリース時にたびたび残ってしまいます。
|
||||
|
||||
Andrew Morton が Linux-kernel メーリングリストにカーネルリリースについ
|
||||
て書いたことをここで言っておくことは価値があります-
|
||||
「カーネルがいつリリースされるかは誰も知りません。なぜなら、これは現
|
||||
@ -303,18 +305,20 @@ Andrew Morton が Linux-kernel メーリングリストにカーネルリリー
|
||||
2.6.x.y -stable カーネルツリー
|
||||
---------------------------
|
||||
|
||||
バージョンに4つ目の数字がついたカーネルは -stable カーネルです。これに
|
||||
は、2.6.x カーネルで見つかったセキュリティ問題や重大な後戻りに対する比
|
||||
較的小さい重要な修正が含まれます。
|
||||
バージョン番号が4つの数字に分かれているカーネルは -stable カーネルです。
|
||||
これには、2.6.x カーネルで見つかったセキュリティ問題や重大な後戻りに対
|
||||
する比較的小さい重要な修正が含まれます。
|
||||
|
||||
これは、開発/実験的バージョンのテストに協力することに興味が無く、
|
||||
最新の安定したカーネルを使いたいユーザに推奨するブランチです。
|
||||
|
||||
もし、2.6.x.y カーネルが存在しない場合には、番号が一番大きい 2.6.x
|
||||
が最新の安定版カーネルです。
|
||||
もし、2.6.x.y カーネルが存在しない場合には、番号が一番大きい 2.6.x が
|
||||
最新の安定版カーネルです。
|
||||
|
||||
2.6.x.y は "stable" チーム <stable@kernel.org> でメンテされており、だ
|
||||
いたい隔週でリリースされています。
|
||||
2.6.x.y は "stable" チーム <stable@kernel.org> でメンテされており、必
|
||||
要に応じてリリースされます。通常のリリース期間は 2週間毎ですが、差し迫っ
|
||||
た問題がなければもう少し長くなることもあります。セキュリティ関連の問題
|
||||
の場合はこれに対してだいたいの場合、すぐにリリースがされます。
|
||||
|
||||
カーネルツリーに入っている、Documentation/stable_kernel_rules.txt ファ
|
||||
イルにはどのような種類の変更が -stable ツリーに受け入れ可能か、またリ
|
||||
@ -341,7 +345,9 @@ linux-kernel メーリングリストで収集された多数のパッチと同
|
||||
メインラインへ入れるように Linus にプッシュします。
|
||||
|
||||
メインカーネルツリーに含めるために Linus に送る前に、すべての新しいパッ
|
||||
チが -mm ツリーでテストされることが強く推奨されます。
|
||||
チが -mm ツリーでテストされることが強く推奨されています。マージウィン
|
||||
ドウが開く前に -mm ツリーに現れなかったパッチはメインラインにマージさ
|
||||
れることは困難になります。
|
||||
|
||||
これらのカーネルは安定して動作すべきシステムとして使うのには適切ではあ
|
||||
りませんし、カーネルブランチの中でももっとも動作にリスクが高いものです。
|
||||
@ -395,13 +401,15 @@ linux-kernel メーリングリストで収集された多数のパッチと同
|
||||
- pcmcia, Dominik Brodowski <linux@dominikbrodowski.net>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/brodo/pcmcia-2.6.git
|
||||
|
||||
- SCSI, James Bottomley <James.Bottomley@SteelEye.com>
|
||||
- SCSI, James Bottomley <James.Bottomley@hansenpartnership.com>
|
||||
git.kernel.org:/pub/scm/linux/kernel/git/jejb/scsi-misc-2.6.git
|
||||
|
||||
- x86, Ingo Molnar <mingo@elte.hu>
|
||||
git://git.kernel.org/pub/scm/linux/kernel/git/x86/linux-2.6-x86.git
|
||||
|
||||
quilt ツリー-
|
||||
- USB, PCI ドライバコアと I2C, Greg Kroah-Hartman <gregkh@suse.de>
|
||||
- USB, ドライバコアと I2C, Greg Kroah-Hartman <gregkh@suse.de>
|
||||
kernel.org/pub/linux/kernel/people/gregkh/gregkh-2.6/
|
||||
- x86-64 と i386 の仲間 Andi Kleen <ak@suse.de>
|
||||
|
||||
その他のカーネルツリーは http://git.kernel.org/ と MAINTAINERS ファ
|
||||
イルに一覧表があります。
|
||||
@ -412,13 +420,32 @@ linux-kernel メーリングリストで収集された多数のパッチと同
|
||||
bugzilla.kernel.org は Linux カーネル開発者がカーネルのバグを追跡する
|
||||
場所です。ユーザは見つけたバグの全てをこのツールで報告すべきです。
|
||||
どう kernel bugzilla を使うかの詳細は、以下を参照してください-
|
||||
http://test.kernel.org/bugzilla/faq.html
|
||||
|
||||
http://bugzilla.kernel.org/page.cgi?id=faq.html
|
||||
メインカーネルソースディレクトリにあるファイル REPORTING-BUGS はカーネ
|
||||
ルバグらしいものについてどうレポートするかの良いテンプレートであり、問
|
||||
題の追跡を助けるためにカーネル開発者にとってどんな情報が必要なのかの詳
|
||||
細が書かれています。
|
||||
|
||||
バグレポートの管理
|
||||
-------------------
|
||||
|
||||
あなたのハッキングのスキルを訓練する最高の方法のひとつに、他人がレポー
|
||||
トしたバグを修正することがあります。あなたがカーネルをより安定化させる
|
||||
こに寄与するということだけでなく、あなたは 現実の問題を修正することを
|
||||
学び、自分のスキルも強化でき、また他の開発者があなたの存在に気がつき
|
||||
ます。バグを修正することは、多くの開発者の中から自分が功績をあげる最善
|
||||
の道です、なぜなら多くの人は他人のバグの修正に時間を浪費することを好ま
|
||||
ないからです。
|
||||
|
||||
すでにレポートされたバグのために仕事をするためには、
|
||||
http://bugzilla.kernel.org に行ってください。もし今後のバグレポートに
|
||||
ついてアドバイスを受けたいのであれば、bugme-new メーリングリスト(新し
|
||||
いバグレポートだけがここにメールされる) または bugme-janitor メーリン
|
||||
グリスト(bugzilla の変更毎にここにメールされる)を購読できます。
|
||||
|
||||
http://lists.linux-foundation.org/mailman/listinfo/bugme-new
|
||||
http://lists.linux-foundation.org/mailman/listinfo/bugme-janitors
|
||||
|
||||
メーリングリスト
|
||||
-------------
|
||||
|
||||
|
111
Documentation/ja_JP/SubmitChecklist
Normal file
111
Documentation/ja_JP/SubmitChecklist
Normal file
@ -0,0 +1,111 @@
|
||||
NOTE:
|
||||
This is a version of Documentation/SubmitChecklist into Japanese.
|
||||
This document is maintained by Takenori Nagano <t-nagano@ah.jp.nec.com>
|
||||
and the JF Project team <http://www.linux.or.jp/JF/>.
|
||||
If you find any difference between this document and the original file
|
||||
or a problem with the translation,
|
||||
please contact the maintainer of this file or JF project.
|
||||
|
||||
Please also note that the purpose of this file is to be easier to read
|
||||
for non English (read: Japanese) speakers and is not intended as a
|
||||
fork. So if you have any comments or updates of this file, please try
|
||||
to update the original English file first.
|
||||
|
||||
Last Updated: 2008/07/14
|
||||
==================================
|
||||
これは、
|
||||
linux-2.6.26/Documentation/SubmitChecklist の和訳です。
|
||||
|
||||
翻訳団体: JF プロジェクト < http://www.linux.or.jp/JF/ >
|
||||
翻訳日: 2008/07/14
|
||||
翻訳者: Takenori Nagano <t-nagano at ah dot jp dot nec dot com>
|
||||
校正者: Masanori Kobayashi さん <zap03216 at nifty dot ne dot jp>
|
||||
==================================
|
||||
|
||||
|
||||
Linux カーネルパッチ投稿者向けチェックリスト
|
||||
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
|
||||
|
||||
本書では、パッチをより素早く取り込んでもらいたい開発者が実践すべき基本的な事柄
|
||||
をいくつか紹介します。ここにある全ての事柄は、Documentation/SubmittingPatches
|
||||
などのLinuxカーネルパッチ投稿に際しての心得を補足するものです。
|
||||
|
||||
1: 妥当なCONFIGオプションや変更されたCONFIGオプション、つまり =y, =m, =n
|
||||
全てで正しくビルドできることを確認してください。その際、gcc及びリンカが
|
||||
warningやerrorを出していないことも確認してください。
|
||||
|
||||
2: allnoconfig, allmodconfig オプションを用いて正しくビルドできることを
|
||||
確認してください。
|
||||
|
||||
3: 手許のクロスコンパイルツールやOSDLのPLMのようなものを用いて、複数の
|
||||
アーキテクチャにおいても正しくビルドできることを確認してください。
|
||||
|
||||
4: 64bit長の'unsigned long'を使用しているppc64は、クロスコンパイルでの
|
||||
チェックに適当なアーキテクチャです。
|
||||
|
||||
5: カーネルコーディングスタイルに準拠しているかどうか確認してください(!)
|
||||
|
||||
6: CONFIGオプションの追加・変更をした場合には、CONFIGメニューが壊れていない
|
||||
ことを確認してください。
|
||||
|
||||
7: 新しくKconfigのオプションを追加する際には、必ずそのhelpも記述してください。
|
||||
|
||||
8: 適切なKconfigの依存関係を考えながら慎重にチェックしてください。
|
||||
ただし、この作業はマシンを使ったテストできちんと行うのがとても困難です。
|
||||
うまくやるには、自分の頭で考えることです。
|
||||
|
||||
9: sparseを利用してちゃんとしたコードチェックをしてください。
|
||||
|
||||
10: 'make checkstack' と 'make namespacecheck' を利用し、問題が発見されたら
|
||||
修正してください。'make checkstack' は明示的に問題を示しませんが、どれか
|
||||
1つの関数が512バイトより大きいスタックを使っていれば、修正すべき候補と
|
||||
なります。
|
||||
|
||||
11: グローバルなkernel API を説明する kernel-doc をソースの中に含めてください。
|
||||
( staticな関数においては必須ではありませんが、含めてもらっても結構です )
|
||||
そして、'make htmldocs' もしくは 'make mandocs' を利用して追記した
|
||||
ドキュメントのチェックを行い、問題が見つかった場合には修正を行ってください。
|
||||
|
||||
12: CONFIG_PREEMPT, CONFIG_DEBUG_PREEMPT, CONFIG_DEBUG_SLAB,
|
||||
CONFIG_DEBUG_PAGEALLOC, CONFIG_DEBUG_MUTEXES, CONFIG_DEBUG_SPINLOCK,
|
||||
CONFIG_DEBUG_SPINLOCK_SLEEP これら全てを同時に有効にして動作確認を
|
||||
行ってください。
|
||||
|
||||
13: CONFIG_SMP, CONFIG_PREEMPT を有効にした場合と無効にした場合の両方で
|
||||
ビルドした上、動作確認を行ってください。
|
||||
|
||||
14: もしパッチがディスクのI/O性能などに影響を与えるようであれば、
|
||||
'CONFIG_LBD'オプションを有効にした場合と無効にした場合の両方で
|
||||
テストを実施してみてください。
|
||||
|
||||
15: lockdepの機能を全て有効にした上で、全てのコードパスを評価してください。
|
||||
|
||||
16: /proc に新しいエントリを追加した場合には、Documentation/ 配下に
|
||||
必ずドキュメントを追加してください。
|
||||
|
||||
17: 新しいブートパラメータを追加した場合には、
|
||||
必ずDocumentation/kernel-parameters.txt に説明を追加してください。
|
||||
|
||||
18: 新しくmoduleにパラメータを追加した場合には、MODULE_PARM_DESC()を
|
||||
利用して必ずその説明を記述してください。
|
||||
|
||||
19: 新しいuserspaceインタフェースを作成した場合には、Documentation/ABI/ に
|
||||
Documentation/ABI/README を参考にして必ずドキュメントを追加してください。
|
||||
|
||||
20: 'make headers_check'を実行して全く問題がないことを確認してください。
|
||||
|
||||
21: 少なくともslabアロケーションとpageアロケーションに失敗した場合の
|
||||
挙動について、fault-injectionを利用して確認してください。
|
||||
Documentation/fault-injection/ を参照してください。
|
||||
|
||||
追加したコードがかなりの量であったならば、サブシステム特有の
|
||||
fault-injectionを追加したほうが良いかもしれません。
|
||||
|
||||
22: 新たに追加したコードは、`gcc -W'でコンパイルしてください。
|
||||
このオプションは大量の不要なメッセージを出力しますが、
|
||||
"warning: comparison between signed and unsigned" のようなメッセージは、
|
||||
バグを見つけるのに役に立ちます。
|
||||
|
||||
23: 投稿したパッチが -mm パッチセットにマージされた後、全ての既存のパッチや
|
||||
VM, VFS およびその他のサブシステムに関する様々な変更と、現時点でも共存
|
||||
できることを確認するテストを行ってください。
|
@ -365,6 +365,8 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
no delay (0).
|
||||
Format: integer
|
||||
|
||||
bootmem_debug [KNL] Enable bootmem allocator debug messages.
|
||||
|
||||
bttv.card= [HW,V4L] bttv (bt848 + bt878 based grabber cards)
|
||||
bttv.radio= Most important insmod options are available as
|
||||
kernel args too.
|
||||
@ -1072,6 +1074,9 @@ and is between 256 and 4096 characters. It is defined in the file
|
||||
|
||||
* [no]ncq: Turn on or off NCQ.
|
||||
|
||||
* nohrst, nosrst, norst: suppress hard, soft
|
||||
and both resets.
|
||||
|
||||
If there are multiple matching configurations changing
|
||||
the same attribute, the last one is used.
|
||||
|
||||
|
@ -895,6 +895,9 @@ static void handle_console_output(int fd, struct virtqueue *vq, bool timeout)
|
||||
}
|
||||
}
|
||||
|
||||
/* This is called when we no longer want to hear about Guest changes to a
|
||||
* virtqueue. This is more efficient in high-traffic cases, but it means we
|
||||
* have to set a timer to check if any more changes have occurred. */
|
||||
static void block_vq(struct virtqueue *vq)
|
||||
{
|
||||
struct itimerval itm;
|
||||
@ -939,6 +942,11 @@ static void handle_net_output(int fd, struct virtqueue *vq, bool timeout)
|
||||
if (!timeout && num)
|
||||
block_vq(vq);
|
||||
|
||||
/* We never quite know how long should we wait before we check the
|
||||
* queue again for more packets. We start at 500 microseconds, and if
|
||||
* we get fewer packets than last time, we assume we made the timeout
|
||||
* too small and increase it by 10 microseconds. Otherwise, we drop it
|
||||
* by one microsecond every time. It seems to work well enough. */
|
||||
if (timeout) {
|
||||
if (num < last_timeout_num)
|
||||
timeout_usec += 10;
|
||||
|
@ -363,6 +363,11 @@ This rule exists because users of the rfkill subsystem expect to get (and set,
|
||||
when possible) the overall transmitter rfkill state, not of a particular rfkill
|
||||
line.
|
||||
|
||||
5. During suspend, the rfkill class will attempt to soft-block the radio
|
||||
through a call to rfkill->toggle_radio, and will try to restore its previous
|
||||
state during resume. After a rfkill class is suspended, it will *not* call
|
||||
rfkill->toggle_radio until it is resumed.
|
||||
|
||||
Example of a WLAN wireless driver connected to the rfkill subsystem:
|
||||
--------------------------------------------------------------------
|
||||
|
||||
|
@ -1,3 +1,26 @@
|
||||
|
||||
1 Release Date : Thur.July. 24 11:41:51 PST 2008 -
|
||||
(emaild-id:megaraidlinux@lsi.com)
|
||||
Sumant Patro
|
||||
Bo Yang
|
||||
|
||||
2 Current Version : 00.00.04.01
|
||||
3 Older Version : 00.00.03.22
|
||||
|
||||
1. Add the new controller (0078, 0079) support to the driver
|
||||
Those controllers are LSI's next generatation(gen2) SAS controllers.
|
||||
|
||||
1 Release Date : Mon.June. 23 10:12:45 PST 2008 -
|
||||
(emaild-id:megaraidlinux@lsi.com)
|
||||
Sumant Patro
|
||||
Bo Yang
|
||||
|
||||
2 Current Version : 00.00.03.22
|
||||
3 Older Version : 00.00.03.20
|
||||
|
||||
1. Add shutdown DCMD cmd to the shutdown routine to make FW shutdown proper.
|
||||
2. Unexpected interrupt occurs in HWR Linux driver, add the dumy readl pci flush will fix this issue.
|
||||
|
||||
1 Release Date : Mon. March 10 11:02:31 PDT 2008 -
|
||||
(emaild-id:megaraidlinux@lsi.com)
|
||||
Sumant Patro
|
||||
|
91
MAINTAINERS
91
MAINTAINERS
@ -942,96 +942,21 @@ M: joern@lazybastard.org
|
||||
L: linux-mtd@lists.infradead.org
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH DRIVERS
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
L: linux-bluetooth@vger.kernel.org
|
||||
W: http://www.bluez.org/
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH SUBSYSTEM
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
P: Maxim Krasnyansky
|
||||
M: maxk@qualcomm.com
|
||||
L: linux-bluetooth@vger.kernel.org
|
||||
W: http://bluez.sf.net
|
||||
W: http://www.bluez.org
|
||||
W: http://www.holtmann.org/linux/bluetooth/
|
||||
W: http://www.bluez.org/
|
||||
T: git kernel.org:/pub/scm/linux/kernel/git/holtmann/bluetooth-2.6.git
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH RFCOMM LAYER
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
P: Maxim Krasnyansky
|
||||
M: maxk@qualcomm.com
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH BNEP LAYER
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
P: Maxim Krasnyansky
|
||||
M: maxk@qualcomm.com
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH CMTP LAYER
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH HIDP LAYER
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH HCI UART DRIVER
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
P: Maxim Krasnyansky
|
||||
M: maxk@qualcomm.com
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH HCI USB DRIVER
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
P: Maxim Krasnyansky
|
||||
M: maxk@qualcomm.com
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH HCI BCM203X DRIVER
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH HCI BPA10X DRIVER
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH HCI BFUSB DRIVER
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH HCI DTL1 DRIVER
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH HCI BLUECARD DRIVER
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH HCI BT3C DRIVER
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH HCI BTUART DRIVER
|
||||
P: Marcel Holtmann
|
||||
M: marcel@holtmann.org
|
||||
S: Maintained
|
||||
|
||||
BLUETOOTH HCI VHCI DRIVER
|
||||
P: Maxim Krasnyansky
|
||||
M: maxk@qualcomm.com
|
||||
S: Maintained
|
||||
|
||||
BONDING DRIVER
|
||||
P: Jay Vosburgh
|
||||
M: fubar@us.ibm.com
|
||||
|
2
Makefile
2
Makefile
@ -1,7 +1,7 @@
|
||||
VERSION = 2
|
||||
PATCHLEVEL = 6
|
||||
SUBLEVEL = 27
|
||||
EXTRAVERSION = -rc3
|
||||
EXTRAVERSION = -rc4
|
||||
NAME = Rotary Wombat
|
||||
|
||||
# *DOCUMENTATION*
|
||||
|
@ -405,7 +405,7 @@ static int impd1_probe(struct lm_device *dev)
|
||||
|
||||
ret = amba_device_register(d, &dev->resource);
|
||||
if (ret) {
|
||||
dev_err(&d->dev, "unable to register device: %d\n");
|
||||
dev_err(&d->dev, "unable to register device: %d\n", ret);
|
||||
kfree(d);
|
||||
}
|
||||
}
|
||||
|
@ -64,7 +64,7 @@ static struct platform_device fsg_i2c_gpio = {
|
||||
|
||||
static struct i2c_board_info __initdata fsg_i2c_board_info [] = {
|
||||
{
|
||||
I2C_BOARD_INFO("rtc-isl1208", 0x6f),
|
||||
I2C_BOARD_INFO("isl1208", 0x6f),
|
||||
},
|
||||
};
|
||||
|
||||
@ -179,7 +179,6 @@ static void __init fsg_init(void)
|
||||
{
|
||||
DECLARE_MAC_BUF(mac_buf);
|
||||
uint8_t __iomem *f;
|
||||
int i;
|
||||
|
||||
ixp4xx_sys_init();
|
||||
|
||||
@ -228,6 +227,7 @@ static void __init fsg_init(void)
|
||||
f = ioremap(IXP4XX_EXP_BUS_BASE(0), 0x400000);
|
||||
if (f) {
|
||||
#ifdef __ARMEB__
|
||||
int i;
|
||||
for (i = 0; i < 6; i++) {
|
||||
fsg_plat_eth[0].hwaddr[i] = readb(f + 0x3C0422 + i);
|
||||
fsg_plat_eth[1].hwaddr[i] = readb(f + 0x3C043B + i);
|
||||
|
@ -125,3 +125,28 @@ void clks_register(struct clk *clks, size_t num)
|
||||
list_add(&clks[i].node, &clocks);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
}
|
||||
|
||||
int clk_add_alias(char *alias, struct device *alias_dev, char *id,
|
||||
struct device *dev)
|
||||
{
|
||||
struct clk *r = clk_lookup(dev, id);
|
||||
struct clk *new;
|
||||
|
||||
if (!r)
|
||||
return -ENODEV;
|
||||
|
||||
new = kzalloc(sizeof(struct clk), GFP_KERNEL);
|
||||
|
||||
if (!new)
|
||||
return -ENOMEM;
|
||||
|
||||
new->name = alias;
|
||||
new->dev = alias_dev;
|
||||
new->other = r;
|
||||
|
||||
mutex_lock(&clocks_mutex);
|
||||
list_add(&new->node, &clocks);
|
||||
mutex_unlock(&clocks_mutex);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
@ -1,3 +1,5 @@
|
||||
#include <linux/list.h>
|
||||
|
||||
struct clk;
|
||||
|
||||
struct clkops {
|
||||
@ -86,3 +88,6 @@ extern void clk_pxa3xx_cken_disable(struct clk *);
|
||||
#endif
|
||||
|
||||
void clks_register(struct clk *clks, size_t num);
|
||||
int clk_add_alias(char *alias, struct device *alias_dev, char *id,
|
||||
struct device *dev);
|
||||
|
||||
|
@ -10,18 +10,78 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
|
||||
#include <asm/setup.h>
|
||||
#include <asm/mach/arch.h>
|
||||
#include <mach/hardware.h>
|
||||
#include <asm/mach-types.h>
|
||||
|
||||
#include <mach/mfp-pxa25x.h>
|
||||
#include <mach/hardware.h>
|
||||
|
||||
#include "generic.h"
|
||||
|
||||
static unsigned long e740_pin_config[] __initdata = {
|
||||
/* Chip selects */
|
||||
GPIO15_nCS_1, /* CS1 - Flash */
|
||||
GPIO79_nCS_3, /* CS3 - IMAGEON */
|
||||
GPIO80_nCS_4, /* CS4 - TMIO */
|
||||
|
||||
/* Clocks */
|
||||
GPIO12_32KHz,
|
||||
|
||||
/* BTUART */
|
||||
GPIO42_BTUART_RXD,
|
||||
GPIO43_BTUART_TXD,
|
||||
GPIO44_BTUART_CTS,
|
||||
GPIO45_GPIO, /* Used by TMIO for #SUSPEND */
|
||||
|
||||
/* PC Card */
|
||||
GPIO8_GPIO, /* CD0 */
|
||||
GPIO44_GPIO, /* CD1 */
|
||||
GPIO11_GPIO, /* IRQ0 */
|
||||
GPIO6_GPIO, /* IRQ1 */
|
||||
GPIO27_GPIO, /* RST0 */
|
||||
GPIO24_GPIO, /* RST1 */
|
||||
GPIO20_GPIO, /* PWR0 */
|
||||
GPIO23_GPIO, /* PWR1 */
|
||||
GPIO48_nPOE,
|
||||
GPIO49_nPWE,
|
||||
GPIO50_nPIOR,
|
||||
GPIO51_nPIOW,
|
||||
GPIO52_nPCE_1,
|
||||
GPIO53_nPCE_2,
|
||||
GPIO54_nPSKTSEL,
|
||||
GPIO55_nPREG,
|
||||
GPIO56_nPWAIT,
|
||||
GPIO57_nIOIS16,
|
||||
|
||||
/* wakeup */
|
||||
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
|
||||
};
|
||||
|
||||
static unsigned long e400_pin_config[] __initdata = {
|
||||
/* Chip selects */
|
||||
GPIO15_nCS_1, /* CS1 - Flash */
|
||||
GPIO80_nCS_4, /* CS4 - TMIO */
|
||||
|
||||
/* Clocks */
|
||||
GPIO12_32KHz,
|
||||
|
||||
/* BTUART */
|
||||
GPIO42_BTUART_RXD,
|
||||
GPIO43_BTUART_TXD,
|
||||
GPIO44_BTUART_CTS,
|
||||
GPIO45_GPIO, /* Used by TMIO for #SUSPEND */
|
||||
|
||||
/* wakeup */
|
||||
GPIO0_GPIO | WAKEUP_ON_EDGE_RISE,
|
||||
};
|
||||
|
||||
/* Only e800 has 128MB RAM */
|
||||
static void __init eseries_fixup(struct machine_desc *desc,
|
||||
struct tag *tags, char **cmdline, struct meminfo *mi)
|
||||
struct tag *tags, char **cmdline, struct meminfo *mi)
|
||||
{
|
||||
mi->nr_banks=1;
|
||||
mi->bank[0].start = 0xa0000000;
|
||||
@ -32,83 +92,95 @@ static void __init eseries_fixup(struct machine_desc *desc,
|
||||
mi->bank[0].size = (64*1024*1024);
|
||||
}
|
||||
|
||||
static void __init e740_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(e740_pin_config));
|
||||
}
|
||||
|
||||
static void __init e400_init(void)
|
||||
{
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(e400_pin_config));
|
||||
}
|
||||
|
||||
/* e-series machine definitions */
|
||||
|
||||
#ifdef CONFIG_MACH_E330
|
||||
MACHINE_START(E330, "Toshiba e330")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.timer = &pxa_timer,
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_E350
|
||||
MACHINE_START(E350, "Toshiba e350")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.timer = &pxa_timer,
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_E740
|
||||
MACHINE_START(E740, "Toshiba e740")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.timer = &pxa_timer,
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e740_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_E750
|
||||
MACHINE_START(E750, "Toshiba e750")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.timer = &pxa_timer,
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_E400
|
||||
MACHINE_START(E400, "Toshiba e400")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.timer = &pxa_timer,
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.init_machine = e400_init,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_MACH_E800
|
||||
MACHINE_START(E800, "Toshiba e800")
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.timer = &pxa_timer,
|
||||
/* Maintainer: Ian Molton (spyro@f2s.com) */
|
||||
.phys_io = 0x40000000,
|
||||
.io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
|
||||
.boot_params = 0xa0000100,
|
||||
.map_io = pxa_map_io,
|
||||
.init_irq = pxa25x_init_irq,
|
||||
.fixup = eseries_fixup,
|
||||
.timer = &pxa_timer,
|
||||
MACHINE_END
|
||||
#endif
|
||||
|
||||
|
@ -183,6 +183,7 @@
|
||||
defined(CONFIG_MACH_TOSA) || \
|
||||
defined(CONFIG_MACH_MAINSTONE) || \
|
||||
defined(CONFIG_MACH_PCM027) || \
|
||||
defined(CONFIG_ARCH_PXA_ESERIES) || \
|
||||
defined(CONFIG_MACH_MAGICIAN)
|
||||
#define NR_IRQS (IRQ_BOARD_END)
|
||||
#elif defined(CONFIG_MACH_ZYLONITE)
|
||||
|
@ -52,6 +52,7 @@
|
||||
#include <mach/mmc.h>
|
||||
|
||||
#include "generic.h"
|
||||
#include "clock.h"
|
||||
#include "devices.h"
|
||||
|
||||
static unsigned long lubbock_pin_config[] __initdata = {
|
||||
@ -485,6 +486,7 @@ static void __init lubbock_init(void)
|
||||
|
||||
pxa2xx_mfp_config(ARRAY_AND_SIZE(lubbock_pin_config));
|
||||
|
||||
clk_add_alias("SA1111_CLK", NULL, "GPIO11_CLK", NULL);
|
||||
pxa_set_udc_info(&udc_info);
|
||||
set_pxa_fb_info(&sharp_lm8v31);
|
||||
pxa_set_mci_info(&lubbock_mci_platform_data);
|
||||
|
@ -166,8 +166,7 @@ static struct clk pxa25x_hwuart_clk =
|
||||
;
|
||||
|
||||
/*
|
||||
* PXA 2xx clock declarations. Order is important (see aliases below)
|
||||
* Please be careful not to disrupt the ordering.
|
||||
* PXA 2xx clock declarations.
|
||||
*/
|
||||
static struct clk pxa25x_clks[] = {
|
||||
INIT_CK("LCDCLK", LCD, &clk_pxa25x_lcd_ops, &pxa_device_fb.dev),
|
||||
@ -194,11 +193,6 @@ static struct clk pxa25x_clks[] = {
|
||||
INIT_CKEN("FICPCLK", FICP, 47923000, 0, NULL),
|
||||
};
|
||||
|
||||
static struct clk pxa2xx_clk_aliases[] = {
|
||||
INIT_CKOTHER("GPIO7_CLK", &pxa25x_clks[4], NULL),
|
||||
INIT_CKOTHER("SA1111_CLK", &pxa25x_clks[5], NULL),
|
||||
};
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
#define SAVE(x) sleep_save[SLEEP_SAVE_##x] = x
|
||||
@ -375,8 +369,6 @@ static int __init pxa25x_init(void)
|
||||
if (cpu_is_pxa255())
|
||||
ret = platform_device_register(&pxa_device_hwuart);
|
||||
|
||||
clks_register(pxa2xx_clk_aliases, ARRAY_SIZE(pxa2xx_clk_aliases));
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
|
@ -90,7 +90,9 @@ static struct clk common_clks[] = {
|
||||
};
|
||||
|
||||
static struct clk pxa310_clks[] = {
|
||||
#ifdef CONFIG_CPU_PXA310
|
||||
PXA3xx_CKEN("MMCCLK", MMC3, 19500000, 0, &pxa3xx_device_mci3.dev),
|
||||
#endif
|
||||
};
|
||||
|
||||
static int __init pxa300_init(void)
|
||||
|
@ -10,7 +10,6 @@
|
||||
* it under the terms of the GNU General Public License version 2 as
|
||||
* published by the Free Software Foundation.
|
||||
*/
|
||||
#include <linux/version.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/module.h>
|
||||
|
@ -19,8 +19,6 @@
|
||||
#include <asm/irq.h>
|
||||
#include <asm/system.h>
|
||||
|
||||
#include <linux/version.h>
|
||||
|
||||
#include <hwregs/reg_map.h>
|
||||
#include <hwregs/reg_rdwr.h>
|
||||
#include <hwregs/timer_defs.h>
|
||||
|
@ -17,7 +17,6 @@ static const char serial_revdate[] = "2007-11-06";
|
||||
#define SUPPORT_SYSRQ
|
||||
#endif
|
||||
|
||||
#include <linux/version.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/serial.h>
|
||||
#include <linux/circ_buf.h>
|
||||
|
@ -86,6 +86,19 @@ static int __init parse_savemaxmem(char *p)
|
||||
}
|
||||
__setup("savemaxmem=", parse_savemaxmem);
|
||||
|
||||
|
||||
static size_t copy_oldmem_vaddr(void *vaddr, char *buf, size_t csize,
|
||||
unsigned long offset, int userbuf)
|
||||
{
|
||||
if (userbuf) {
|
||||
if (copy_to_user((char __user *)buf, (vaddr + offset), csize))
|
||||
return -EFAULT;
|
||||
} else
|
||||
memcpy(buf, (vaddr + offset), csize);
|
||||
|
||||
return csize;
|
||||
}
|
||||
|
||||
/**
|
||||
* copy_oldmem_page - copy one page from "oldmem"
|
||||
* @pfn: page frame number to be copied
|
||||
@ -107,16 +120,16 @@ ssize_t copy_oldmem_page(unsigned long pfn, char *buf,
|
||||
if (!csize)
|
||||
return 0;
|
||||
|
||||
vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0);
|
||||
csize = min(csize, PAGE_SIZE);
|
||||
|
||||
if (userbuf) {
|
||||
if (copy_to_user((char __user *)buf, (vaddr + offset), csize)) {
|
||||
iounmap(vaddr);
|
||||
return -EFAULT;
|
||||
}
|
||||
} else
|
||||
memcpy(buf, (vaddr + offset), csize);
|
||||
if (pfn < max_pfn) {
|
||||
vaddr = __va(pfn << PAGE_SHIFT);
|
||||
csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
|
||||
} else {
|
||||
vaddr = __ioremap(pfn << PAGE_SHIFT, PAGE_SIZE, 0);
|
||||
csize = copy_oldmem_vaddr(vaddr, buf, csize, offset, userbuf);
|
||||
iounmap(vaddr);
|
||||
}
|
||||
|
||||
iounmap(vaddr);
|
||||
return csize;
|
||||
}
|
||||
|
@ -233,17 +233,6 @@ void ibmebus_free_irq(u32 ist, void *dev_id)
|
||||
}
|
||||
EXPORT_SYMBOL(ibmebus_free_irq);
|
||||
|
||||
static ssize_t name_show(struct device *dev,
|
||||
struct device_attribute *attr, char *buf)
|
||||
{
|
||||
return sprintf(buf, "%s\n", to_of_device(dev)->node->name);
|
||||
}
|
||||
|
||||
static struct device_attribute ibmebus_dev_attrs[] = {
|
||||
__ATTR_RO(name),
|
||||
__ATTR_NULL
|
||||
};
|
||||
|
||||
static char *ibmebus_chomp(const char *in, size_t count)
|
||||
{
|
||||
char *out = kmalloc(count + 1, GFP_KERNEL);
|
||||
@ -327,7 +316,6 @@ static struct bus_attribute ibmebus_bus_attrs[] = {
|
||||
|
||||
struct bus_type ibmebus_bus_type = {
|
||||
.uevent = of_device_uevent,
|
||||
.dev_attrs = ibmebus_dev_attrs,
|
||||
.bus_attrs = ibmebus_bus_attrs
|
||||
};
|
||||
EXPORT_SYMBOL(ibmebus_bus_type);
|
||||
|
@ -1113,7 +1113,7 @@ static int vio_bus_probe(struct device *dev)
|
||||
return error;
|
||||
}
|
||||
error = viodrv->probe(viodev, id);
|
||||
if (error)
|
||||
if (error && firmware_has_feature(FW_FEATURE_CMO))
|
||||
vio_cmo_bus_remove(viodev);
|
||||
}
|
||||
|
||||
|
@ -206,11 +206,6 @@ static int spu_run_init(struct spu_context *ctx, u32 *npc)
|
||||
(SPU_RUNCNTL_RUNNABLE | SPU_RUNCNTL_ISOLATE);
|
||||
if (runcntl == 0)
|
||||
runcntl = SPU_RUNCNTL_RUNNABLE;
|
||||
}
|
||||
|
||||
if (ctx->flags & SPU_CREATE_NOSCHED) {
|
||||
spuctx_switch_state(ctx, SPU_UTIL_USER);
|
||||
ctx->ops->runcntl_write(ctx, runcntl);
|
||||
} else {
|
||||
unsigned long privcntl;
|
||||
|
||||
@ -219,9 +214,15 @@ static int spu_run_init(struct spu_context *ctx, u32 *npc)
|
||||
else
|
||||
privcntl = SPU_PRIVCNTL_MODE_NORMAL;
|
||||
|
||||
ctx->ops->npc_write(ctx, *npc);
|
||||
ctx->ops->privcntl_write(ctx, privcntl);
|
||||
ctx->ops->runcntl_write(ctx, runcntl);
|
||||
ctx->ops->npc_write(ctx, *npc);
|
||||
}
|
||||
|
||||
ctx->ops->runcntl_write(ctx, runcntl);
|
||||
|
||||
if (ctx->flags & SPU_CREATE_NOSCHED) {
|
||||
spuctx_switch_state(ctx, SPU_UTIL_USER);
|
||||
} else {
|
||||
|
||||
if (ctx->state == SPU_STATE_SAVED) {
|
||||
ret = spu_activate(ctx, 0);
|
||||
|
@ -641,8 +641,10 @@ static struct spu *find_victim(struct spu_context *ctx)
|
||||
|
||||
if (tmp && tmp->prio > ctx->prio &&
|
||||
!(tmp->flags & SPU_CREATE_NOSCHED) &&
|
||||
(!victim || tmp->prio > victim->prio))
|
||||
(!victim || tmp->prio > victim->prio)) {
|
||||
victim = spu->ctx;
|
||||
get_spu_context(victim);
|
||||
}
|
||||
}
|
||||
mutex_unlock(&cbe_spu_info[node].list_mutex);
|
||||
|
||||
@ -658,6 +660,7 @@ static struct spu *find_victim(struct spu_context *ctx)
|
||||
* look at another context or give up after X retries.
|
||||
*/
|
||||
if (!mutex_trylock(&victim->state_mutex)) {
|
||||
put_spu_context(victim);
|
||||
victim = NULL;
|
||||
goto restart;
|
||||
}
|
||||
@ -670,6 +673,7 @@ static struct spu *find_victim(struct spu_context *ctx)
|
||||
* restart the search.
|
||||
*/
|
||||
mutex_unlock(&victim->state_mutex);
|
||||
put_spu_context(victim);
|
||||
victim = NULL;
|
||||
goto restart;
|
||||
}
|
||||
@ -687,6 +691,7 @@ static struct spu *find_victim(struct spu_context *ctx)
|
||||
spu_add_to_rq(victim);
|
||||
|
||||
mutex_unlock(&victim->state_mutex);
|
||||
put_spu_context(victim);
|
||||
|
||||
return spu;
|
||||
}
|
||||
@ -985,9 +990,11 @@ static int spusched_thread(void *unused)
|
||||
struct spu_context *ctx = spu->ctx;
|
||||
|
||||
if (ctx) {
|
||||
get_spu_context(ctx);
|
||||
mutex_unlock(mtx);
|
||||
spusched_tick(ctx);
|
||||
mutex_lock(mtx);
|
||||
put_spu_context(ctx);
|
||||
}
|
||||
}
|
||||
mutex_unlock(mtx);
|
||||
@ -1030,7 +1037,7 @@ void spuctx_switch_state(struct spu_context *ctx,
|
||||
node = spu->node;
|
||||
if (old_state == SPU_UTIL_USER)
|
||||
atomic_dec(&cbe_spu_info[node].busy_spus);
|
||||
if (new_state == SPU_UTIL_USER);
|
||||
if (new_state == SPU_UTIL_USER)
|
||||
atomic_inc(&cbe_spu_info[node].busy_spus);
|
||||
}
|
||||
}
|
||||
|
@ -11,7 +11,6 @@
|
||||
*
|
||||
*/
|
||||
|
||||
#include <linux/version.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/string.h>
|
||||
|
@ -1,7 +1,7 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.26-rc4
|
||||
# Fri May 30 09:49:33 2008
|
||||
# Linux kernel version: 2.6.27-rc4
|
||||
# Thu Aug 21 19:43:29 2008
|
||||
#
|
||||
CONFIG_SCHED_MC=y
|
||||
CONFIG_MMU=y
|
||||
@ -68,7 +68,6 @@ CONFIG_INITRAMFS_SOURCE=""
|
||||
CONFIG_SYSCTL=y
|
||||
# CONFIG_EMBEDDED is not set
|
||||
CONFIG_SYSCTL_SYSCALL=y
|
||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||
CONFIG_KALLSYMS=y
|
||||
# CONFIG_KALLSYMS_ALL is not set
|
||||
# CONFIG_KALLSYMS_EXTRA_PASS is not set
|
||||
@ -93,11 +92,17 @@ CONFIG_SLAB=y
|
||||
# CONFIG_MARKERS is not set
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
CONFIG_KPROBES=y
|
||||
# CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set
|
||||
CONFIG_KRETPROBES=y
|
||||
# CONFIG_HAVE_IOREMAP_PROT is not set
|
||||
CONFIG_HAVE_KPROBES=y
|
||||
CONFIG_HAVE_KRETPROBES=y
|
||||
# CONFIG_HAVE_ARCH_TRACEHOOK is not set
|
||||
# CONFIG_HAVE_DMA_ATTRS is not set
|
||||
# CONFIG_USE_GENERIC_SMP_HELPERS is not set
|
||||
# CONFIG_HAVE_CLK is not set
|
||||
CONFIG_PROC_PAGE_MONITOR=y
|
||||
# CONFIG_HAVE_GENERIC_DMA_COHERENT is not set
|
||||
CONFIG_SLABINFO=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
@ -113,6 +118,7 @@ CONFIG_STOP_MACHINE=y
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
CONFIG_BLK_DEV_BSG=y
|
||||
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||
CONFIG_BLOCK_COMPAT=y
|
||||
|
||||
#
|
||||
@ -175,6 +181,8 @@ CONFIG_PREEMPT=y
|
||||
CONFIG_ARCH_SPARSEMEM_ENABLE=y
|
||||
CONFIG_ARCH_SPARSEMEM_DEFAULT=y
|
||||
CONFIG_ARCH_SELECT_MEMORY_MODEL=y
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTPLUG=y
|
||||
CONFIG_ARCH_ENABLE_MEMORY_HOTREMOVE=y
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_FLATMEM_MANUAL is not set
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
@ -185,8 +193,12 @@ CONFIG_HAVE_MEMORY_PRESENT=y
|
||||
CONFIG_SPARSEMEM_EXTREME=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP_ENABLE=y
|
||||
CONFIG_SPARSEMEM_VMEMMAP=y
|
||||
CONFIG_MEMORY_HOTPLUG=y
|
||||
CONFIG_MEMORY_HOTPLUG_SPARSE=y
|
||||
CONFIG_MEMORY_HOTREMOVE=y
|
||||
CONFIG_PAGEFLAGS_EXTENDED=y
|
||||
CONFIG_SPLIT_PTLOCK_CPUS=4
|
||||
CONFIG_MIGRATION=y
|
||||
CONFIG_RESOURCES_64BIT=y
|
||||
CONFIG_ZONE_DMA_FLAG=1
|
||||
CONFIG_BOUNCE=y
|
||||
@ -198,6 +210,7 @@ CONFIG_VIRT_TO_BUS=y
|
||||
CONFIG_MACHCHK_WARNING=y
|
||||
CONFIG_QDIO=y
|
||||
# CONFIG_QDIO_DEBUG is not set
|
||||
CONFIG_CHSC_SCH=m
|
||||
|
||||
#
|
||||
# Misc
|
||||
@ -206,6 +219,7 @@ CONFIG_IPL=y
|
||||
# CONFIG_IPL_TAPE is not set
|
||||
CONFIG_IPL_VM=y
|
||||
CONFIG_BINFMT_ELF=y
|
||||
CONFIG_COMPAT_BINFMT_ELF=y
|
||||
CONFIG_BINFMT_MISC=m
|
||||
CONFIG_FORCE_MAX_ZONEORDER=9
|
||||
# CONFIG_PROCESS_DEBUG is not set
|
||||
@ -226,10 +240,6 @@ CONFIG_S390_HYPFS_FS=y
|
||||
CONFIG_KEXEC=y
|
||||
# CONFIG_ZFCPDUMP is not set
|
||||
CONFIG_S390_GUEST=y
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
@ -364,7 +374,6 @@ CONFIG_NET_SCH_CBQ=m
|
||||
# CONFIG_NET_SCH_HTB is not set
|
||||
# CONFIG_NET_SCH_HFSC is not set
|
||||
CONFIG_NET_SCH_PRIO=m
|
||||
CONFIG_NET_SCH_RR=m
|
||||
CONFIG_NET_SCH_RED=m
|
||||
CONFIG_NET_SCH_SFQ=m
|
||||
CONFIG_NET_SCH_TEQL=m
|
||||
@ -430,7 +439,9 @@ CONFIG_CCW=y
|
||||
CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
# CONFIG_FW_LOADER is not set
|
||||
CONFIG_FW_LOADER=y
|
||||
# CONFIG_FIRMWARE_IN_KERNEL is not set
|
||||
CONFIG_EXTRA_FIRMWARE=""
|
||||
# CONFIG_DEBUG_DRIVER is not set
|
||||
# CONFIG_DEBUG_DEVRES is not set
|
||||
CONFIG_SYS_HYPERVISOR=y
|
||||
@ -507,6 +518,11 @@ CONFIG_SCSI_LOWLEVEL=y
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_SCSI_DEBUG is not set
|
||||
CONFIG_ZFCP=y
|
||||
CONFIG_SCSI_DH=m
|
||||
CONFIG_SCSI_DH_RDAC=m
|
||||
CONFIG_SCSI_DH_HP_SW=m
|
||||
CONFIG_SCSI_DH_EMC=m
|
||||
CONFIG_SCSI_DH_ALUA=m
|
||||
CONFIG_MD=y
|
||||
CONFIG_BLK_DEV_MD=y
|
||||
CONFIG_MD_LINEAR=m
|
||||
@ -522,14 +538,10 @@ CONFIG_DM_CRYPT=y
|
||||
CONFIG_DM_SNAPSHOT=y
|
||||
CONFIG_DM_MIRROR=y
|
||||
CONFIG_DM_ZERO=y
|
||||
CONFIG_DM_MULTIPATH=y
|
||||
# CONFIG_DM_MULTIPATH_EMC is not set
|
||||
# CONFIG_DM_MULTIPATH_RDAC is not set
|
||||
# CONFIG_DM_MULTIPATH_HP is not set
|
||||
CONFIG_DM_MULTIPATH=m
|
||||
# CONFIG_DM_DELAY is not set
|
||||
# CONFIG_DM_UEVENT is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NETDEVICES_MULTIQUEUE is not set
|
||||
# CONFIG_IFB is not set
|
||||
CONFIG_DUMMY=m
|
||||
CONFIG_BONDING=m
|
||||
@ -544,7 +556,6 @@ CONFIG_NET_ETHERNET=y
|
||||
# CONFIG_IBM_NEW_EMAC_TAH is not set
|
||||
# CONFIG_IBM_NEW_EMAC_EMAC4 is not set
|
||||
CONFIG_NETDEV_1000=y
|
||||
# CONFIG_E1000E_ENABLED is not set
|
||||
CONFIG_NETDEV_10000=y
|
||||
# CONFIG_TR is not set
|
||||
# CONFIG_WAN is not set
|
||||
@ -576,7 +587,10 @@ CONFIG_DEVKMEM=y
|
||||
CONFIG_UNIX98_PTYS=y
|
||||
CONFIG_LEGACY_PTYS=y
|
||||
CONFIG_LEGACY_PTY_COUNT=256
|
||||
CONFIG_HVC_DRIVER=y
|
||||
CONFIG_VIRTIO_CONSOLE=y
|
||||
CONFIG_HW_RANDOM=m
|
||||
CONFIG_HW_RANDOM_VIRTIO=m
|
||||
# CONFIG_R3964 is not set
|
||||
CONFIG_RAW_DRIVER=m
|
||||
CONFIG_MAX_RAW_DEVS=256
|
||||
@ -616,6 +630,7 @@ CONFIG_MONWRITER=m
|
||||
CONFIG_S390_VMUR=m
|
||||
# CONFIG_POWER_SUPPLY is not set
|
||||
# CONFIG_THERMAL is not set
|
||||
# CONFIG_THERMAL_HWMON is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
|
||||
#
|
||||
@ -693,6 +708,7 @@ CONFIG_CONFIGFS_FS=m
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_OMFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
@ -712,7 +728,6 @@ CONFIG_LOCKD_V4=y
|
||||
CONFIG_EXPORTFS=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_SUNRPC_BIND34 is not set
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
@ -780,6 +795,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_DEBUG_INFO is not set
|
||||
# CONFIG_DEBUG_VM is not set
|
||||
# CONFIG_DEBUG_WRITECOUNT is not set
|
||||
CONFIG_DEBUG_MEMORY_INIT=y
|
||||
# CONFIG_DEBUG_LIST is not set
|
||||
# CONFIG_DEBUG_SG is not set
|
||||
# CONFIG_FRAME_POINTER is not set
|
||||
@ -789,6 +805,7 @@ CONFIG_DEBUG_BUGVERBOSE=y
|
||||
# CONFIG_LKDTM is not set
|
||||
# CONFIG_FAULT_INJECTION is not set
|
||||
# CONFIG_LATENCYTOP is not set
|
||||
CONFIG_SYSCTL_SYSCALL_CHECK=y
|
||||
CONFIG_SAMPLES=y
|
||||
# CONFIG_SAMPLE_KOBJECT is not set
|
||||
# CONFIG_SAMPLE_KPROBES is not set
|
||||
@ -847,6 +864,10 @@ CONFIG_CRYPTO_HMAC=m
|
||||
# CONFIG_CRYPTO_MD4 is not set
|
||||
CONFIG_CRYPTO_MD5=m
|
||||
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
||||
CONFIG_CRYPTO_RMD128=m
|
||||
CONFIG_CRYPTO_RMD160=m
|
||||
CONFIG_CRYPTO_RMD256=m
|
||||
CONFIG_CRYPTO_RMD320=m
|
||||
CONFIG_CRYPTO_SHA1=m
|
||||
# CONFIG_CRYPTO_SHA256 is not set
|
||||
# CONFIG_CRYPTO_SHA512 is not set
|
||||
@ -895,6 +916,7 @@ CONFIG_BITREVERSE=m
|
||||
# CONFIG_GENERIC_FIND_NEXT_BIT is not set
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC_T10DIF=y
|
||||
# CONFIG_CRC_ITU_T is not set
|
||||
CONFIG_CRC32=m
|
||||
CONFIG_CRC7=m
|
||||
|
@ -709,7 +709,7 @@ static inline int find_next_zero_bit (const unsigned long * addr,
|
||||
* __ffz_word returns __BITOPS_WORDSIZE
|
||||
* if no zero bit is present in the word.
|
||||
*/
|
||||
set = __ffz_word(0, *p >> bit) + bit;
|
||||
set = __ffz_word(bit, *p >> bit);
|
||||
if (set >= size)
|
||||
return size + offset;
|
||||
if (set < __BITOPS_WORDSIZE)
|
||||
@ -824,7 +824,7 @@ static inline int ext2_find_next_zero_bit(void *vaddr, unsigned long size,
|
||||
* s390 version of ffz returns __BITOPS_WORDSIZE
|
||||
* if no zero bit is present in the word.
|
||||
*/
|
||||
set = ffz(__load_ulong_le(p, 0) >> bit) + bit;
|
||||
set = __ffz_word(bit, __load_ulong_le(p, 0) >> bit);
|
||||
if (set >= size)
|
||||
return size + offset;
|
||||
if (set < __BITOPS_WORDSIZE)
|
||||
@ -865,7 +865,7 @@ static inline int ext2_find_next_bit(void *vaddr, unsigned long size,
|
||||
* s390 version of ffz returns __BITOPS_WORDSIZE
|
||||
* if no zero bit is present in the word.
|
||||
*/
|
||||
set = ffs(__load_ulong_le(p, 0) >> bit) + bit;
|
||||
set = __ffs_word(0, __load_ulong_le(p, 0) & (~0UL << bit));
|
||||
if (set >= size)
|
||||
return size + offset;
|
||||
if (set < __BITOPS_WORDSIZE)
|
||||
|
@ -75,7 +75,9 @@ unsigned long thread_saved_pc(struct task_struct *tsk)
|
||||
return sf->gprs[8];
|
||||
}
|
||||
|
||||
DEFINE_PER_CPU(struct s390_idle_data, s390_idle);
|
||||
DEFINE_PER_CPU(struct s390_idle_data, s390_idle) = {
|
||||
.lock = __SPIN_LOCK_UNLOCKED(s390_idle.lock)
|
||||
};
|
||||
|
||||
static int s390_idle_enter(void)
|
||||
{
|
||||
|
@ -610,7 +610,6 @@ static void __init smp_create_idle(unsigned int cpu)
|
||||
if (IS_ERR(p))
|
||||
panic("failed fork for CPU %u: %li", cpu, PTR_ERR(p));
|
||||
current_set[cpu] = p;
|
||||
spin_lock_init(&(&per_cpu(s390_idle, cpu))->lock);
|
||||
}
|
||||
|
||||
static int __cpuinit smp_alloc_lowcore(int cpu)
|
||||
@ -845,7 +844,6 @@ void __init smp_prepare_boot_cpu(void)
|
||||
current_set[0] = current;
|
||||
smp_cpu_state[0] = CPU_STATE_CONFIGURED;
|
||||
smp_cpu_polarization[0] = POLARIZATION_UNKNWN;
|
||||
spin_lock_init(&(&__get_cpu_var(s390_idle))->lock);
|
||||
}
|
||||
|
||||
void __init smp_cpus_done(unsigned int max_cpus)
|
||||
|
@ -140,6 +140,10 @@ static struct sh_mobile_lcdc_info lcdc_info = {
|
||||
.vsync_len = 1,
|
||||
.sync = 0, /* hsync and vsync are active low */
|
||||
},
|
||||
.lcd_size_cfg = { /* 7.0 inch */
|
||||
.width = 152,
|
||||
.height = 91,
|
||||
},
|
||||
.board_cfg = {
|
||||
.display_on = ap320_wvga_power_on,
|
||||
},
|
||||
|
@ -224,6 +224,10 @@ static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = {
|
||||
.vsync_len = 2,
|
||||
.sync = 0,
|
||||
},
|
||||
.lcd_size_cfg = { /* 7.0 inch */
|
||||
.width = 152,
|
||||
.height = 91,
|
||||
},
|
||||
}
|
||||
#endif
|
||||
#ifdef CONFIG_SH_MIGOR_QVGA
|
||||
@ -245,6 +249,10 @@ static struct sh_mobile_lcdc_info sh_mobile_lcdc_info = {
|
||||
.vsync_len = 2,
|
||||
.sync = FB_SYNC_HOR_HIGH_ACT,
|
||||
},
|
||||
.lcd_size_cfg = { /* 2.4 inch */
|
||||
.width = 49,
|
||||
.height = 37,
|
||||
},
|
||||
.board_cfg = {
|
||||
.setup_sys = migor_lcd_qvga_setup,
|
||||
},
|
||||
|
@ -15,8 +15,11 @@
|
||||
#include <linux/interrupt.h>
|
||||
#include <linux/input.h>
|
||||
#include <linux/mtd/physmap.h>
|
||||
#include <asm/io.h>
|
||||
#include <linux/fb.h>
|
||||
#include <linux/io.h>
|
||||
#include <asm/sh7763rdp.h>
|
||||
#include <asm/sh_eth.h>
|
||||
#include <asm/sh7760fb.h>
|
||||
|
||||
/* NOR Flash */
|
||||
static struct mtd_partition sh7763rdp_nor_flash_partitions[] = {
|
||||
@ -60,8 +63,85 @@ static struct platform_device sh7763rdp_nor_flash_device = {
|
||||
},
|
||||
};
|
||||
|
||||
/* SH-Ether */
|
||||
static struct resource sh_eth_resources[] = {
|
||||
{
|
||||
.start = 0xFEE00800, /* use eth1 */
|
||||
.end = 0xFEE00F7C - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
}, {
|
||||
.start = 58, /* irq number */
|
||||
.end = 58,
|
||||
.flags = IORESOURCE_IRQ,
|
||||
},
|
||||
};
|
||||
|
||||
static struct sh_eth_plat_data sh7763_eth_pdata = {
|
||||
.phy = 1,
|
||||
.edmac_endian = EDMAC_LITTLE_ENDIAN,
|
||||
};
|
||||
|
||||
static struct platform_device sh7763rdp_eth_device = {
|
||||
.name = "sh-eth",
|
||||
.resource = sh_eth_resources,
|
||||
.num_resources = ARRAY_SIZE(sh_eth_resources),
|
||||
.dev = {
|
||||
.platform_data = &sh7763_eth_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
/* SH7763 LCDC */
|
||||
static struct resource sh7763rdp_fb_resources[] = {
|
||||
{
|
||||
.start = 0xFFE80000,
|
||||
.end = 0xFFE80442 - 1,
|
||||
.flags = IORESOURCE_MEM,
|
||||
},
|
||||
};
|
||||
|
||||
static struct fb_videomode sh7763fb_videomode = {
|
||||
.refresh = 60,
|
||||
.name = "VGA Monitor",
|
||||
.xres = 640,
|
||||
.yres = 480,
|
||||
.pixclock = 10000,
|
||||
.left_margin = 80,
|
||||
.right_margin = 24,
|
||||
.upper_margin = 30,
|
||||
.lower_margin = 1,
|
||||
.hsync_len = 96,
|
||||
.vsync_len = 1,
|
||||
.sync = 0,
|
||||
.vmode = FB_VMODE_NONINTERLACED,
|
||||
.flag = FBINFO_FLAG_DEFAULT,
|
||||
};
|
||||
|
||||
static struct sh7760fb_platdata sh7763fb_def_pdata = {
|
||||
.def_mode = &sh7763fb_videomode,
|
||||
.ldmtr = (LDMTR_TFT_COLOR_16|LDMTR_MCNT),
|
||||
.lddfr = LDDFR_16BPP_RGB565,
|
||||
.ldpmmr = 0x0000,
|
||||
.ldpspr = 0xFFFF,
|
||||
.ldaclnr = 0x0001,
|
||||
.ldickr = 0x1102,
|
||||
.rotate = 0,
|
||||
.novsync = 0,
|
||||
.blank = NULL,
|
||||
};
|
||||
|
||||
static struct platform_device sh7763rdp_fb_device = {
|
||||
.name = "sh7760-lcdc",
|
||||
.resource = sh7763rdp_fb_resources,
|
||||
.num_resources = ARRAY_SIZE(sh7763rdp_fb_resources),
|
||||
.dev = {
|
||||
.platform_data = &sh7763fb_def_pdata,
|
||||
},
|
||||
};
|
||||
|
||||
static struct platform_device *sh7763rdp_devices[] __initdata = {
|
||||
&sh7763rdp_nor_flash_device,
|
||||
&sh7763rdp_eth_device,
|
||||
&sh7763rdp_fb_device,
|
||||
};
|
||||
|
||||
static int __init sh7763rdp_devices_setup(void)
|
||||
@ -69,7 +149,7 @@ static int __init sh7763rdp_devices_setup(void)
|
||||
return platform_add_devices(sh7763rdp_devices,
|
||||
ARRAY_SIZE(sh7763rdp_devices));
|
||||
}
|
||||
__initcall(sh7763rdp_devices_setup);
|
||||
device_initcall(sh7763rdp_devices_setup);
|
||||
|
||||
static void __init sh7763rdp_setup(char **cmdline_p)
|
||||
{
|
||||
|
@ -3,7 +3,7 @@
|
||||
*
|
||||
* Renesas SH-X3 Prototype Board Support.
|
||||
*
|
||||
* Copyright (C) 2007 Paul Mundt
|
||||
* Copyright (C) 2007 - 2008 Paul Mundt
|
||||
*
|
||||
* This file is subject to the terms and conditions of the GNU General Public
|
||||
* License. See the file "COPYING" in the main directory of this archive
|
||||
@ -13,6 +13,7 @@
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/io.h>
|
||||
#include <linux/smc91x.h>
|
||||
#include <asm/ilsel.h>
|
||||
|
||||
static struct resource heartbeat_resources[] = {
|
||||
@ -30,6 +31,10 @@ static struct platform_device heartbeat_device = {
|
||||
.resource = heartbeat_resources,
|
||||
};
|
||||
|
||||
static struct smc91x_platdata smc91x_info = {
|
||||
.flags = SMC91X_USE_16BIT | SMC91X_NOWAIT,
|
||||
};
|
||||
|
||||
static struct resource smc91x_resources[] = {
|
||||
[0] = {
|
||||
.start = 0x18000300,
|
||||
@ -47,6 +52,9 @@ static struct platform_device smc91x_device = {
|
||||
.id = -1,
|
||||
.resource = smc91x_resources,
|
||||
.num_resources = ARRAY_SIZE(smc91x_resources),
|
||||
.dev = {
|
||||
.platform_data = &smc91x_info,
|
||||
},
|
||||
};
|
||||
|
||||
static struct resource r8a66597_usb_host_resources[] = {
|
||||
|
@ -1,15 +1,17 @@
|
||||
#
|
||||
# Automatically generated make config: don't edit
|
||||
# Linux kernel version: 2.6.26-rc4
|
||||
# Fri Jun 6 12:20:17 2008
|
||||
# Linux kernel version: 2.6.27-rc2
|
||||
# Fri Aug 8 13:44:20 2008
|
||||
#
|
||||
CONFIG_SUPERH=y
|
||||
CONFIG_SUPERH32=y
|
||||
CONFIG_ARCH_DEFCONFIG="arch/sh/configs/shx3_defconfig"
|
||||
CONFIG_RWSEM_GENERIC_SPINLOCK=y
|
||||
CONFIG_GENERIC_BUG=y
|
||||
CONFIG_GENERIC_FIND_NEXT_BIT=y
|
||||
CONFIG_GENERIC_HWEIGHT=y
|
||||
CONFIG_GENERIC_HARDIRQS=y
|
||||
CONFIG_GENERIC_HARDIRQS_NO__DO_IRQ=y
|
||||
CONFIG_GENERIC_IRQ_PROBE=y
|
||||
CONFIG_GENERIC_CALIBRATE_DELAY=y
|
||||
CONFIG_GENERIC_TIME=y
|
||||
@ -19,7 +21,6 @@ CONFIG_LOCKDEP_SUPPORT=y
|
||||
# CONFIG_ARCH_HAS_ILOG2_U32 is not set
|
||||
# CONFIG_ARCH_HAS_ILOG2_U64 is not set
|
||||
CONFIG_ARCH_NO_VIRT_TO_BUS=y
|
||||
CONFIG_ARCH_SUPPORTS_AOUT=y
|
||||
CONFIG_DEFCONFIG_LIST="/lib/modules/$UNAME_RELEASE/.config"
|
||||
|
||||
#
|
||||
@ -83,10 +84,16 @@ CONFIG_PROFILING=y
|
||||
# CONFIG_MARKERS is not set
|
||||
CONFIG_OPROFILE=y
|
||||
CONFIG_HAVE_OPROFILE=y
|
||||
# CONFIG_HAVE_EFFICIENT_UNALIGNED_ACCESS is not set
|
||||
# CONFIG_HAVE_IOREMAP_PROT is not set
|
||||
# CONFIG_HAVE_KPROBES is not set
|
||||
# CONFIG_HAVE_KRETPROBES is not set
|
||||
# CONFIG_HAVE_ARCH_TRACEHOOK is not set
|
||||
# CONFIG_HAVE_DMA_ATTRS is not set
|
||||
# CONFIG_USE_GENERIC_SMP_HELPERS is not set
|
||||
CONFIG_HAVE_CLK=y
|
||||
CONFIG_PROC_PAGE_MONITOR=y
|
||||
CONFIG_HAVE_GENERIC_DMA_COHERENT=y
|
||||
CONFIG_SLABINFO=y
|
||||
CONFIG_RT_MUTEXES=y
|
||||
# CONFIG_TINY_SHMEM is not set
|
||||
@ -96,12 +103,13 @@ CONFIG_MODULES=y
|
||||
# CONFIG_MODULE_UNLOAD is not set
|
||||
# CONFIG_MODVERSIONS is not set
|
||||
# CONFIG_MODULE_SRCVERSION_ALL is not set
|
||||
# CONFIG_KMOD is not set
|
||||
CONFIG_KMOD=y
|
||||
CONFIG_BLOCK=y
|
||||
# CONFIG_LBD is not set
|
||||
# CONFIG_BLK_DEV_IO_TRACE is not set
|
||||
# CONFIG_LSF is not set
|
||||
# CONFIG_BLK_DEV_BSG is not set
|
||||
# CONFIG_BLK_DEV_INTEGRITY is not set
|
||||
|
||||
#
|
||||
# IO Schedulers
|
||||
@ -177,6 +185,7 @@ CONFIG_PAGE_SIZE_4KB=y
|
||||
# CONFIG_PAGE_SIZE_8KB is not set
|
||||
# CONFIG_PAGE_SIZE_16KB is not set
|
||||
# CONFIG_PAGE_SIZE_64KB is not set
|
||||
CONFIG_ENTRY_OFFSET=0x00001000
|
||||
CONFIG_SELECT_MEMORY_MODEL=y
|
||||
# CONFIG_FLATMEM_MANUAL is not set
|
||||
# CONFIG_DISCONTIGMEM_MANUAL is not set
|
||||
@ -258,6 +267,7 @@ CONFIG_HZ=250
|
||||
# CONFIG_SCHED_HRTICK is not set
|
||||
# CONFIG_KEXEC is not set
|
||||
# CONFIG_CRASH_DUMP is not set
|
||||
CONFIG_SECCOMP=y
|
||||
CONFIG_PREEMPT_NONE=y
|
||||
# CONFIG_PREEMPT_VOLUNTARY is not set
|
||||
# CONFIG_PREEMPT is not set
|
||||
@ -282,10 +292,6 @@ CONFIG_CMDLINE="console=ttySC2,115200 root=/dev/sda1 rootdelay=10"
|
||||
#
|
||||
CONFIG_BINFMT_ELF=y
|
||||
# CONFIG_BINFMT_MISC is not set
|
||||
|
||||
#
|
||||
# Networking
|
||||
#
|
||||
CONFIG_NET=y
|
||||
|
||||
#
|
||||
@ -361,6 +367,7 @@ CONFIG_DEFAULT_TCP_CONG="cubic"
|
||||
#
|
||||
# CONFIG_CFG80211 is not set
|
||||
CONFIG_WIRELESS_EXT=y
|
||||
CONFIG_WIRELESS_EXT_SYSFS=y
|
||||
# CONFIG_MAC80211 is not set
|
||||
# CONFIG_IEEE80211 is not set
|
||||
# CONFIG_RFKILL is not set
|
||||
@ -377,6 +384,8 @@ CONFIG_UEVENT_HELPER_PATH="/sbin/hotplug"
|
||||
CONFIG_STANDALONE=y
|
||||
CONFIG_PREVENT_FIRMWARE_BUILD=y
|
||||
CONFIG_FW_LOADER=y
|
||||
CONFIG_FIRMWARE_IN_KERNEL=y
|
||||
CONFIG_EXTRA_FIRMWARE=""
|
||||
# CONFIG_SYS_HYPERVISOR is not set
|
||||
# CONFIG_CONNECTOR is not set
|
||||
CONFIG_MTD=y
|
||||
@ -471,6 +480,7 @@ CONFIG_BLK_DEV=y
|
||||
# CONFIG_BLK_DEV_RAM is not set
|
||||
# CONFIG_CDROM_PKTCDVD is not set
|
||||
# CONFIG_ATA_OVER_ETH is not set
|
||||
# CONFIG_BLK_DEV_HD is not set
|
||||
# CONFIG_MISC_DEVICES is not set
|
||||
CONFIG_HAVE_IDE=y
|
||||
# CONFIG_IDE is not set
|
||||
@ -515,10 +525,10 @@ CONFIG_SCSI_WAIT_SCAN=m
|
||||
CONFIG_SCSI_LOWLEVEL=y
|
||||
# CONFIG_ISCSI_TCP is not set
|
||||
# CONFIG_SCSI_DEBUG is not set
|
||||
# CONFIG_SCSI_DH is not set
|
||||
# CONFIG_ATA is not set
|
||||
# CONFIG_MD is not set
|
||||
CONFIG_NETDEVICES=y
|
||||
# CONFIG_NETDEVICES_MULTIQUEUE is not set
|
||||
# CONFIG_DUMMY is not set
|
||||
# CONFIG_BONDING is not set
|
||||
# CONFIG_MACVLAN is not set
|
||||
@ -546,7 +556,9 @@ CONFIG_NET_ETHERNET=y
|
||||
CONFIG_MII=y
|
||||
# CONFIG_AX88796 is not set
|
||||
# CONFIG_STNIC is not set
|
||||
CONFIG_SH_ETH=y
|
||||
# CONFIG_SMC91X is not set
|
||||
# CONFIG_SMC911X is not set
|
||||
# CONFIG_IBM_NEW_EMAC_ZMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_RGMII is not set
|
||||
# CONFIG_IBM_NEW_EMAC_TAH is not set
|
||||
@ -613,7 +625,11 @@ CONFIG_INPUT=y
|
||||
#
|
||||
# Character devices
|
||||
#
|
||||
# CONFIG_VT is not set
|
||||
CONFIG_VT=y
|
||||
CONFIG_CONSOLE_TRANSLATIONS=y
|
||||
CONFIG_VT_CONSOLE=y
|
||||
CONFIG_HW_CONSOLE=y
|
||||
# CONFIG_VT_HW_CONSOLE_BINDING is not set
|
||||
CONFIG_DEVKMEM=y
|
||||
# CONFIG_SERIAL_NONSTANDARD is not set
|
||||
|
||||
@ -644,6 +660,7 @@ CONFIG_HW_RANDOM=y
|
||||
# CONFIG_POWER_SUPPLY is not set
|
||||
# CONFIG_HWMON is not set
|
||||
# CONFIG_THERMAL is not set
|
||||
# CONFIG_THERMAL_HWMON is not set
|
||||
# CONFIG_WATCHDOG is not set
|
||||
|
||||
#
|
||||
@ -655,6 +672,7 @@ CONFIG_SSB_POSSIBLE=y
|
||||
#
|
||||
# Multifunction device drivers
|
||||
#
|
||||
# CONFIG_MFD_CORE is not set
|
||||
# CONFIG_MFD_SM501 is not set
|
||||
# CONFIG_HTC_PASIC3 is not set
|
||||
|
||||
@ -679,7 +697,34 @@ CONFIG_SSB_POSSIBLE=y
|
||||
#
|
||||
# CONFIG_VGASTATE is not set
|
||||
# CONFIG_VIDEO_OUTPUT_CONTROL is not set
|
||||
# CONFIG_FB is not set
|
||||
CONFIG_FB=y
|
||||
# CONFIG_FIRMWARE_EDID is not set
|
||||
# CONFIG_FB_DDC is not set
|
||||
CONFIG_FB_CFB_FILLRECT=y
|
||||
CONFIG_FB_CFB_COPYAREA=y
|
||||
CONFIG_FB_CFB_IMAGEBLIT=y
|
||||
# CONFIG_FB_CFB_REV_PIXELS_IN_BYTE is not set
|
||||
# CONFIG_FB_SYS_FILLRECT is not set
|
||||
# CONFIG_FB_SYS_COPYAREA is not set
|
||||
# CONFIG_FB_SYS_IMAGEBLIT is not set
|
||||
CONFIG_FB_FOREIGN_ENDIAN=y
|
||||
CONFIG_FB_BOTH_ENDIAN=y
|
||||
# CONFIG_FB_BIG_ENDIAN is not set
|
||||
# CONFIG_FB_LITTLE_ENDIAN is not set
|
||||
# CONFIG_FB_SYS_FOPS is not set
|
||||
# CONFIG_FB_SVGALIB is not set
|
||||
# CONFIG_FB_MACMODES is not set
|
||||
# CONFIG_FB_BACKLIGHT is not set
|
||||
# CONFIG_FB_MODE_HELPERS is not set
|
||||
# CONFIG_FB_TILEBLITTING is not set
|
||||
|
||||
#
|
||||
# Frame buffer hardware drivers
|
||||
#
|
||||
# CONFIG_FB_S1D13XXX is not set
|
||||
# CONFIG_FB_SH_MOBILE_LCDC is not set
|
||||
CONFIG_FB_SH7760=y
|
||||
# CONFIG_FB_VIRTUAL is not set
|
||||
# CONFIG_BACKLIGHT_LCD_SUPPORT is not set
|
||||
|
||||
#
|
||||
@ -688,8 +733,22 @@ CONFIG_SSB_POSSIBLE=y
|
||||
# CONFIG_DISPLAY_SUPPORT is not set
|
||||
|
||||
#
|
||||
# Sound
|
||||
# Console display driver support
|
||||
#
|
||||
CONFIG_DUMMY_CONSOLE=y
|
||||
CONFIG_FRAMEBUFFER_CONSOLE=y
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_DETECT_PRIMARY is not set
|
||||
# CONFIG_FRAMEBUFFER_CONSOLE_ROTATION is not set
|
||||
# CONFIG_FONTS is not set
|
||||
CONFIG_FONT_8x8=y
|
||||
CONFIG_FONT_8x16=y
|
||||
CONFIG_LOGO=y
|
||||
CONFIG_LOGO_LINUX_MONO=y
|
||||
CONFIG_LOGO_LINUX_VGA16=y
|
||||
CONFIG_LOGO_LINUX_CLUT224=y
|
||||
CONFIG_LOGO_SUPERH_MONO=y
|
||||
CONFIG_LOGO_SUPERH_VGA16=y
|
||||
CONFIG_LOGO_SUPERH_CLUT224=y
|
||||
# CONFIG_SOUND is not set
|
||||
# CONFIG_HID_SUPPORT is not set
|
||||
CONFIG_USB_SUPPORT=y
|
||||
@ -788,11 +847,27 @@ CONFIG_USB_MON=y
|
||||
# CONFIG_USB_IOWARRIOR is not set
|
||||
# CONFIG_USB_ISIGHTFW is not set
|
||||
# CONFIG_USB_GADGET is not set
|
||||
# CONFIG_MMC is not set
|
||||
CONFIG_MMC=y
|
||||
# CONFIG_MMC_DEBUG is not set
|
||||
# CONFIG_MMC_UNSAFE_RESUME is not set
|
||||
|
||||
#
|
||||
# MMC/SD Card Drivers
|
||||
#
|
||||
CONFIG_MMC_BLOCK=y
|
||||
CONFIG_MMC_BLOCK_BOUNCE=y
|
||||
# CONFIG_SDIO_UART is not set
|
||||
# CONFIG_MMC_TEST is not set
|
||||
|
||||
#
|
||||
# MMC/SD Host Controller Drivers
|
||||
#
|
||||
# CONFIG_MMC_SDHCI is not set
|
||||
# CONFIG_MEMSTICK is not set
|
||||
# CONFIG_NEW_LEDS is not set
|
||||
# CONFIG_ACCESSIBILITY is not set
|
||||
# CONFIG_RTC_CLASS is not set
|
||||
# CONFIG_DMADEVICES is not set
|
||||
# CONFIG_UIO is not set
|
||||
|
||||
#
|
||||
@ -865,6 +940,7 @@ CONFIG_TMPFS_POSIX_ACL=y
|
||||
# CONFIG_CRAMFS is not set
|
||||
# CONFIG_VXFS_FS is not set
|
||||
# CONFIG_MINIX_FS is not set
|
||||
# CONFIG_OMFS_FS is not set
|
||||
# CONFIG_HPFS_FS is not set
|
||||
# CONFIG_QNX4FS_FS is not set
|
||||
# CONFIG_ROMFS_FS is not set
|
||||
@ -874,12 +950,11 @@ CONFIG_NETWORK_FILESYSTEMS=y
|
||||
CONFIG_NFS_FS=y
|
||||
# CONFIG_NFS_V3 is not set
|
||||
# CONFIG_NFS_V4 is not set
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_ROOT_NFS=y
|
||||
# CONFIG_NFSD is not set
|
||||
CONFIG_LOCKD=y
|
||||
CONFIG_NFS_COMMON=y
|
||||
CONFIG_SUNRPC=y
|
||||
# CONFIG_SUNRPC_BIND34 is not set
|
||||
# CONFIG_RPCSEC_GSS_KRB5 is not set
|
||||
# CONFIG_RPCSEC_GSS_SPKM3 is not set
|
||||
# CONFIG_SMB_FS is not set
|
||||
@ -949,6 +1024,7 @@ CONFIG_FRAME_WARN=1024
|
||||
# CONFIG_HEADERS_CHECK is not set
|
||||
# CONFIG_DEBUG_KERNEL is not set
|
||||
# CONFIG_DEBUG_BUGVERBOSE is not set
|
||||
# CONFIG_DEBUG_MEMORY_INIT is not set
|
||||
# CONFIG_SAMPLES is not set
|
||||
# CONFIG_SH_STANDARD_BIOS is not set
|
||||
# CONFIG_EARLY_SCIF_CONSOLE is not set
|
||||
@ -1003,6 +1079,10 @@ CONFIG_CRYPTO=y
|
||||
# CONFIG_CRYPTO_MD4 is not set
|
||||
# CONFIG_CRYPTO_MD5 is not set
|
||||
# CONFIG_CRYPTO_MICHAEL_MIC is not set
|
||||
# CONFIG_CRYPTO_RMD128 is not set
|
||||
# CONFIG_CRYPTO_RMD160 is not set
|
||||
# CONFIG_CRYPTO_RMD256 is not set
|
||||
# CONFIG_CRYPTO_RMD320 is not set
|
||||
# CONFIG_CRYPTO_SHA1 is not set
|
||||
# CONFIG_CRYPTO_SHA256 is not set
|
||||
# CONFIG_CRYPTO_SHA512 is not set
|
||||
@ -1042,6 +1122,7 @@ CONFIG_BITREVERSE=y
|
||||
# CONFIG_GENERIC_FIND_FIRST_BIT is not set
|
||||
# CONFIG_CRC_CCITT is not set
|
||||
# CONFIG_CRC16 is not set
|
||||
CONFIG_CRC_T10DIF=y
|
||||
# CONFIG_CRC_ITU_T is not set
|
||||
CONFIG_CRC32=y
|
||||
# CONFIG_CRC7 is not set
|
||||
|
@ -21,4 +21,11 @@
|
||||
#define flat_get_relocate_addr(rel) (rel)
|
||||
#define flat_set_persistent(relval, p) ({ (void)p; 0; })
|
||||
|
||||
#define FLAT_PLAT_INIT(_r) \
|
||||
do { _r->regs[0]=0; _r->regs[1]=0; _r->regs[2]=0; _r->regs[3]=0; \
|
||||
_r->regs[4]=0; _r->regs[5]=0; _r->regs[6]=0; _r->regs[7]=0; \
|
||||
_r->regs[8]=0; _r->regs[9]=0; _r->regs[10]=0; _r->regs[11]=0; \
|
||||
_r->regs[12]=0; _r->regs[13]=0; _r->regs[14]=0; \
|
||||
_r->sr = SR_FD; } while (0)
|
||||
|
||||
#endif /* __ASM_SH_FLAT_H */
|
||||
|
@ -42,9 +42,6 @@
|
||||
|
||||
#define PORT_MSELCRB 0xa4050182
|
||||
|
||||
#define MSTPCR1 0xa4150034
|
||||
#define MSTPCR2 0xa4150038
|
||||
|
||||
#define PORT_PSELA 0xa405014e
|
||||
#define PORT_PSELB 0xa4050150
|
||||
#define PORT_PSELC 0xa4050152
|
||||
|
@ -47,12 +47,18 @@ struct sh_mobile_lcdc_board_cfg {
|
||||
void (*display_off)(void *board_data);
|
||||
};
|
||||
|
||||
struct sh_mobile_lcdc_lcd_size_cfg { /* width and height of panel in mm */
|
||||
unsigned long width;
|
||||
unsigned long height;
|
||||
};
|
||||
|
||||
struct sh_mobile_lcdc_chan_cfg {
|
||||
int chan;
|
||||
int bpp;
|
||||
int interface_type; /* selects RGBn or SYSn I/F, see above */
|
||||
int clock_divider;
|
||||
struct fb_videomode lcd_cfg;
|
||||
struct sh_mobile_lcdc_lcd_size_cfg lcd_size_cfg;
|
||||
struct sh_mobile_lcdc_board_cfg board_cfg;
|
||||
struct sh_mobile_lcdc_sys_bus_cfg sys_bus_cfg; /* only for SYSn I/F */
|
||||
};
|
||||
|
@ -29,6 +29,16 @@ void flush_cache_page(struct vm_area_struct *vma, unsigned long addr, unsigned l
|
||||
void flush_dcache_page(struct page *pg);
|
||||
void flush_icache_range(unsigned long start, unsigned long end);
|
||||
void flush_icache_page(struct vm_area_struct *vma, struct page *page);
|
||||
|
||||
#define flush_dcache_mmap_lock(mapping) do { } while (0)
|
||||
#define flush_dcache_mmap_unlock(mapping) do { } while (0)
|
||||
|
||||
/* SH3 has unified cache so no special action needed here */
|
||||
#define flush_cache_sigtramp(vaddr) do { } while (0)
|
||||
#define flush_icache_user_range(vma,pg,adr,len) do { } while (0)
|
||||
|
||||
#define p3_cache_init() do { } while (0)
|
||||
|
||||
#else
|
||||
#include <cpu-common/cpu/cacheflush.h>
|
||||
#endif
|
||||
|
@ -45,7 +45,7 @@ static struct platform_device vpu_device = {
|
||||
};
|
||||
|
||||
static struct uio_info veu0_platform_data = {
|
||||
.name = "VEU",
|
||||
.name = "VEU2H",
|
||||
.version = "0",
|
||||
.irq = 54,
|
||||
};
|
||||
@ -73,7 +73,7 @@ static struct platform_device veu0_device = {
|
||||
};
|
||||
|
||||
static struct uio_info veu1_platform_data = {
|
||||
.name = "VEU",
|
||||
.name = "VEU2H",
|
||||
.version = "0",
|
||||
.irq = 27,
|
||||
};
|
||||
|
@ -107,10 +107,12 @@ DECLARE_EXPORT(__movmemSI12_i4);
|
||||
* GCC >= 4.2 emits these for division, as do GCC 4.1.x versions of the ST
|
||||
* compiler which include backported patches.
|
||||
*/
|
||||
DECLARE_EXPORT(__sdivsi3_i4i);
|
||||
DECLARE_EXPORT(__udiv_qrnnd_16);
|
||||
#if !defined(CONFIG_CPU_SH2)
|
||||
DECLARE_EXPORT(__sdivsi3_i4i);
|
||||
DECLARE_EXPORT(__udivsi3_i4i);
|
||||
#endif
|
||||
#endif
|
||||
#else /* GCC 3.x */
|
||||
DECLARE_EXPORT(__movstr_i4_even);
|
||||
DECLARE_EXPORT(__movstr_i4_odd);
|
||||
|
@ -181,10 +181,12 @@ config ENTRY_OFFSET
|
||||
choice
|
||||
prompt "HugeTLB page size"
|
||||
depends on HUGETLB_PAGE && (CPU_SH4 || CPU_SH5) && MMU
|
||||
default HUGETLB_PAGE_SIZE_1MB if PAGE_SIZE_64KB
|
||||
default HUGETLB_PAGE_SIZE_64K
|
||||
|
||||
config HUGETLB_PAGE_SIZE_64K
|
||||
bool "64kB"
|
||||
depends on !PAGE_SIZE_64KB
|
||||
|
||||
config HUGETLB_PAGE_SIZE_256K
|
||||
bool "256kB"
|
||||
|
@ -95,6 +95,29 @@ void dma_cache_sync(struct device *dev, void *vaddr, size_t size,
|
||||
}
|
||||
EXPORT_SYMBOL(dma_cache_sync);
|
||||
|
||||
static int __init memchunk_setup(char *str)
|
||||
{
|
||||
return 1; /* accept anything that begins with "memchunk." */
|
||||
}
|
||||
__setup("memchunk.", memchunk_setup);
|
||||
|
||||
static void memchunk_cmdline_override(char *name, unsigned long *sizep)
|
||||
{
|
||||
char *p = boot_command_line;
|
||||
int k = strlen(name);
|
||||
|
||||
while ((p = strstr(p, "memchunk."))) {
|
||||
p += 9; /* strlen("memchunk.") */
|
||||
if (!strncmp(name, p, k) && p[k] == '=') {
|
||||
p += k + 1;
|
||||
*sizep = memparse(p, NULL);
|
||||
pr_info("%s: forcing memory chunk size to 0x%08lx\n",
|
||||
name, *sizep);
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
int platform_resource_setup_memory(struct platform_device *pdev,
|
||||
char *name, unsigned long memsize)
|
||||
{
|
||||
@ -109,6 +132,10 @@ int platform_resource_setup_memory(struct platform_device *pdev,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
memchunk_cmdline_override(name, &memsize);
|
||||
if (!memsize)
|
||||
return 0;
|
||||
|
||||
buf = dma_alloc_coherent(NULL, memsize, &dma_handle, GFP_KERNEL);
|
||||
if (!buf) {
|
||||
pr_warning("%s: unable to allocate memory\n", name);
|
||||
|
@ -577,35 +577,29 @@ config SWIOTLB
|
||||
|
||||
config IOMMU_HELPER
|
||||
def_bool (CALGARY_IOMMU || GART_IOMMU || SWIOTLB || AMD_IOMMU)
|
||||
|
||||
config MAXSMP
|
||||
bool "Configure Maximum number of SMP Processors and NUMA Nodes"
|
||||
depends on X86_64 && SMP
|
||||
depends on X86_64 && SMP && BROKEN
|
||||
default n
|
||||
help
|
||||
Configure maximum number of CPUS and NUMA Nodes for this architecture.
|
||||
If unsure, say N.
|
||||
|
||||
if MAXSMP
|
||||
config NR_CPUS
|
||||
int
|
||||
default "4096"
|
||||
endif
|
||||
|
||||
if !MAXSMP
|
||||
config NR_CPUS
|
||||
int "Maximum number of CPUs (2-4096)"
|
||||
range 2 4096
|
||||
int "Maximum number of CPUs (2-512)" if !MAXSMP
|
||||
range 2 512
|
||||
depends on SMP
|
||||
default "4096" if MAXSMP
|
||||
default "32" if X86_NUMAQ || X86_SUMMIT || X86_BIGSMP || X86_ES7000
|
||||
default "8"
|
||||
help
|
||||
This allows you to specify the maximum number of CPUs which this
|
||||
kernel will support. The maximum supported value is 4096 and the
|
||||
kernel will support. The maximum supported value is 512 and the
|
||||
minimum value which makes sense is 2.
|
||||
|
||||
This is purely to save memory - each supported CPU adds
|
||||
approximately eight kilobytes to the kernel image.
|
||||
endif
|
||||
|
||||
config SCHED_SMT
|
||||
bool "SMT (Hyperthreading) scheduler support"
|
||||
@ -996,17 +990,10 @@ config NUMA_EMU
|
||||
into virtual nodes when booted with "numa=fake=N", where N is the
|
||||
number of nodes. This is only useful for debugging.
|
||||
|
||||
if MAXSMP
|
||||
|
||||
config NODES_SHIFT
|
||||
int
|
||||
default "9"
|
||||
endif
|
||||
|
||||
if !MAXSMP
|
||||
config NODES_SHIFT
|
||||
int "Maximum NUMA Nodes (as a power of 2)"
|
||||
int "Maximum NUMA Nodes (as a power of 2)" if !MAXSMP
|
||||
range 1 9 if X86_64
|
||||
default "9" if MAXSMP
|
||||
default "6" if X86_64
|
||||
default "4" if X86_NUMAQ
|
||||
default "3"
|
||||
@ -1014,7 +1001,6 @@ config NODES_SHIFT
|
||||
help
|
||||
Specify the maximum number of NUMA Nodes available on the target
|
||||
system. Increases memory reserved to accomodate various tables.
|
||||
endif
|
||||
|
||||
config HAVE_ARCH_BOOTMEM_NODE
|
||||
def_bool y
|
||||
|
@ -65,7 +65,7 @@ static int __iommu_queue_command(struct amd_iommu *iommu, struct iommu_cmd *cmd)
|
||||
u8 *target;
|
||||
|
||||
tail = readl(iommu->mmio_base + MMIO_CMD_TAIL_OFFSET);
|
||||
target = (iommu->cmd_buf + tail);
|
||||
target = iommu->cmd_buf + tail;
|
||||
memcpy_toio(target, cmd, sizeof(*cmd));
|
||||
tail = (tail + sizeof(*cmd)) % iommu->cmd_buf_size;
|
||||
head = readl(iommu->mmio_base + MMIO_CMD_HEAD_OFFSET);
|
||||
|
@ -56,9 +56,22 @@ void __cpuinit validate_pat_support(struct cpuinfo_x86 *c)
|
||||
|
||||
switch (c->x86_vendor) {
|
||||
case X86_VENDOR_INTEL:
|
||||
if (c->x86 == 0xF || (c->x86 == 6 && c->x86_model >= 15))
|
||||
/*
|
||||
* There is a known erratum on Pentium III and Core Solo
|
||||
* and Core Duo CPUs.
|
||||
* " Page with PAT set to WC while associated MTRR is UC
|
||||
* may consolidate to UC "
|
||||
* Because of this erratum, it is better to stick with
|
||||
* setting WC in MTRR rather than using PAT on these CPUs.
|
||||
*
|
||||
* Enable PAT WC only on P4, Core 2 or later CPUs.
|
||||
*/
|
||||
if (c->x86 > 0x6 || (c->x86 == 6 && c->x86_model >= 15))
|
||||
return;
|
||||
break;
|
||||
|
||||
pat_disable("PAT WC disabled due to known CPU erratum.");
|
||||
return;
|
||||
|
||||
case X86_VENDOR_AMD:
|
||||
case X86_VENDOR_CENTAUR:
|
||||
case X86_VENDOR_TRANSMETA:
|
||||
|
@ -737,63 +737,44 @@ static int find_psb_table(struct powernow_k8_data *data)
|
||||
#ifdef CONFIG_X86_POWERNOW_K8_ACPI
|
||||
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index)
|
||||
{
|
||||
if (!data->acpi_data->state_count || (cpu_family == CPU_HW_PSTATE))
|
||||
if (!data->acpi_data.state_count || (cpu_family == CPU_HW_PSTATE))
|
||||
return;
|
||||
|
||||
data->irt = (data->acpi_data->states[index].control >> IRT_SHIFT) & IRT_MASK;
|
||||
data->rvo = (data->acpi_data->states[index].control >> RVO_SHIFT) & RVO_MASK;
|
||||
data->exttype = (data->acpi_data->states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK;
|
||||
data->plllock = (data->acpi_data->states[index].control >> PLL_L_SHIFT) & PLL_L_MASK;
|
||||
data->vidmvs = 1 << ((data->acpi_data->states[index].control >> MVS_SHIFT) & MVS_MASK);
|
||||
data->vstable = (data->acpi_data->states[index].control >> VST_SHIFT) & VST_MASK;
|
||||
}
|
||||
|
||||
|
||||
static struct acpi_processor_performance *acpi_perf_data;
|
||||
static int preregister_valid;
|
||||
|
||||
static int powernow_k8_cpu_preinit_acpi(void)
|
||||
{
|
||||
acpi_perf_data = alloc_percpu(struct acpi_processor_performance);
|
||||
if (!acpi_perf_data)
|
||||
return -ENODEV;
|
||||
|
||||
if (acpi_processor_preregister_performance(acpi_perf_data))
|
||||
return -ENODEV;
|
||||
else
|
||||
preregister_valid = 1;
|
||||
return 0;
|
||||
data->irt = (data->acpi_data.states[index].control >> IRT_SHIFT) & IRT_MASK;
|
||||
data->rvo = (data->acpi_data.states[index].control >> RVO_SHIFT) & RVO_MASK;
|
||||
data->exttype = (data->acpi_data.states[index].control >> EXT_TYPE_SHIFT) & EXT_TYPE_MASK;
|
||||
data->plllock = (data->acpi_data.states[index].control >> PLL_L_SHIFT) & PLL_L_MASK;
|
||||
data->vidmvs = 1 << ((data->acpi_data.states[index].control >> MVS_SHIFT) & MVS_MASK);
|
||||
data->vstable = (data->acpi_data.states[index].control >> VST_SHIFT) & VST_MASK;
|
||||
}
|
||||
|
||||
static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
|
||||
{
|
||||
struct cpufreq_frequency_table *powernow_table;
|
||||
int ret_val;
|
||||
int cpu = 0;
|
||||
|
||||
data->acpi_data = percpu_ptr(acpi_perf_data, cpu);
|
||||
if (acpi_processor_register_performance(data->acpi_data, data->cpu)) {
|
||||
if (acpi_processor_register_performance(&data->acpi_data, data->cpu)) {
|
||||
dprintk("register performance failed: bad ACPI data\n");
|
||||
return -EIO;
|
||||
}
|
||||
|
||||
/* verify the data contained in the ACPI structures */
|
||||
if (data->acpi_data->state_count <= 1) {
|
||||
if (data->acpi_data.state_count <= 1) {
|
||||
dprintk("No ACPI P-States\n");
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
if ((data->acpi_data->control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) ||
|
||||
(data->acpi_data->status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) {
|
||||
if ((data->acpi_data.control_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE) ||
|
||||
(data->acpi_data.status_register.space_id != ACPI_ADR_SPACE_FIXED_HARDWARE)) {
|
||||
dprintk("Invalid control/status registers (%x - %x)\n",
|
||||
data->acpi_data->control_register.space_id,
|
||||
data->acpi_data->status_register.space_id);
|
||||
data->acpi_data.control_register.space_id,
|
||||
data->acpi_data.status_register.space_id);
|
||||
goto err_out;
|
||||
}
|
||||
|
||||
/* fill in data->powernow_table */
|
||||
powernow_table = kmalloc((sizeof(struct cpufreq_frequency_table)
|
||||
* (data->acpi_data->state_count + 1)), GFP_KERNEL);
|
||||
* (data->acpi_data.state_count + 1)), GFP_KERNEL);
|
||||
if (!powernow_table) {
|
||||
dprintk("powernow_table memory alloc failure\n");
|
||||
goto err_out;
|
||||
@ -806,12 +787,12 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
|
||||
if (ret_val)
|
||||
goto err_out_mem;
|
||||
|
||||
powernow_table[data->acpi_data->state_count].frequency = CPUFREQ_TABLE_END;
|
||||
powernow_table[data->acpi_data->state_count].index = 0;
|
||||
powernow_table[data->acpi_data.state_count].frequency = CPUFREQ_TABLE_END;
|
||||
powernow_table[data->acpi_data.state_count].index = 0;
|
||||
data->powernow_table = powernow_table;
|
||||
|
||||
/* fill in data */
|
||||
data->numps = data->acpi_data->state_count;
|
||||
data->numps = data->acpi_data.state_count;
|
||||
if (first_cpu(per_cpu(cpu_core_map, data->cpu)) == data->cpu)
|
||||
print_basics(data);
|
||||
powernow_k8_acpi_pst_values(data, 0);
|
||||
@ -819,31 +800,16 @@ static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data)
|
||||
/* notify BIOS that we exist */
|
||||
acpi_processor_notify_smm(THIS_MODULE);
|
||||
|
||||
/* determine affinity, from ACPI if available */
|
||||
if (preregister_valid) {
|
||||
if ((data->acpi_data->shared_type == CPUFREQ_SHARED_TYPE_ALL) ||
|
||||
(data->acpi_data->shared_type == CPUFREQ_SHARED_TYPE_ANY))
|
||||
data->starting_core_affinity = data->acpi_data->shared_cpu_map;
|
||||
else
|
||||
data->starting_core_affinity = cpumask_of_cpu(data->cpu);
|
||||
} else {
|
||||
/* best guess from family if not */
|
||||
if (cpu_family == CPU_HW_PSTATE)
|
||||
data->starting_core_affinity = cpumask_of_cpu(data->cpu);
|
||||
else
|
||||
data->starting_core_affinity = per_cpu(cpu_core_map, data->cpu);
|
||||
}
|
||||
|
||||
return 0;
|
||||
|
||||
err_out_mem:
|
||||
kfree(powernow_table);
|
||||
|
||||
err_out:
|
||||
acpi_processor_unregister_performance(data->acpi_data, data->cpu);
|
||||
acpi_processor_unregister_performance(&data->acpi_data, data->cpu);
|
||||
|
||||
/* data->acpi_data.state_count informs us at ->exit() whether ACPI was used */
|
||||
data->acpi_data->state_count = 0;
|
||||
data->acpi_data.state_count = 0;
|
||||
|
||||
return -ENODEV;
|
||||
}
|
||||
@ -855,10 +821,10 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf
|
||||
rdmsr(MSR_PSTATE_CUR_LIMIT, hi, lo);
|
||||
data->max_hw_pstate = (hi & HW_PSTATE_MAX_MASK) >> HW_PSTATE_MAX_SHIFT;
|
||||
|
||||
for (i = 0; i < data->acpi_data->state_count; i++) {
|
||||
for (i = 0; i < data->acpi_data.state_count; i++) {
|
||||
u32 index;
|
||||
|
||||
index = data->acpi_data->states[i].control & HW_PSTATE_MASK;
|
||||
index = data->acpi_data.states[i].control & HW_PSTATE_MASK;
|
||||
if (index > data->max_hw_pstate) {
|
||||
printk(KERN_ERR PFX "invalid pstate %d - bad value %d.\n", i, index);
|
||||
printk(KERN_ERR PFX "Please report to BIOS manufacturer\n");
|
||||
@ -874,7 +840,7 @@ static int fill_powernow_table_pstate(struct powernow_k8_data *data, struct cpuf
|
||||
|
||||
powernow_table[i].index = index;
|
||||
|
||||
powernow_table[i].frequency = data->acpi_data->states[i].core_frequency * 1000;
|
||||
powernow_table[i].frequency = data->acpi_data.states[i].core_frequency * 1000;
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -883,16 +849,16 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf
|
||||
{
|
||||
int i;
|
||||
int cntlofreq = 0;
|
||||
for (i = 0; i < data->acpi_data->state_count; i++) {
|
||||
for (i = 0; i < data->acpi_data.state_count; i++) {
|
||||
u32 fid;
|
||||
u32 vid;
|
||||
|
||||
if (data->exttype) {
|
||||
fid = data->acpi_data->states[i].status & EXT_FID_MASK;
|
||||
vid = (data->acpi_data->states[i].status >> VID_SHIFT) & EXT_VID_MASK;
|
||||
fid = data->acpi_data.states[i].status & EXT_FID_MASK;
|
||||
vid = (data->acpi_data.states[i].status >> VID_SHIFT) & EXT_VID_MASK;
|
||||
} else {
|
||||
fid = data->acpi_data->states[i].control & FID_MASK;
|
||||
vid = (data->acpi_data->states[i].control >> VID_SHIFT) & VID_MASK;
|
||||
fid = data->acpi_data.states[i].control & FID_MASK;
|
||||
vid = (data->acpi_data.states[i].control >> VID_SHIFT) & VID_MASK;
|
||||
}
|
||||
|
||||
dprintk(" %d : fid 0x%x, vid 0x%x\n", i, fid, vid);
|
||||
@ -933,10 +899,10 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf
|
||||
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)) {
|
||||
printk(KERN_INFO PFX "invalid freq entries %u kHz vs. %u kHz\n",
|
||||
powernow_table[i].frequency,
|
||||
(unsigned int) (data->acpi_data->states[i].core_frequency * 1000));
|
||||
(unsigned int) (data->acpi_data.states[i].core_frequency * 1000));
|
||||
powernow_table[i].frequency = CPUFREQ_ENTRY_INVALID;
|
||||
continue;
|
||||
}
|
||||
@ -946,12 +912,11 @@ static int fill_powernow_table_fidvid(struct powernow_k8_data *data, struct cpuf
|
||||
|
||||
static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data)
|
||||
{
|
||||
if (data->acpi_data->state_count)
|
||||
acpi_processor_unregister_performance(data->acpi_data, data->cpu);
|
||||
if (data->acpi_data.state_count)
|
||||
acpi_processor_unregister_performance(&data->acpi_data, data->cpu);
|
||||
}
|
||||
|
||||
#else
|
||||
static int powernow_k8_cpu_preinit_acpi(void) { return -ENODEV; }
|
||||
static int powernow_k8_cpu_init_acpi(struct powernow_k8_data *data) { return -ENODEV; }
|
||||
static void powernow_k8_cpu_exit_acpi(struct powernow_k8_data *data) { return; }
|
||||
static void powernow_k8_acpi_pst_values(struct powernow_k8_data *data, unsigned int index) { return; }
|
||||
@ -1136,7 +1101,7 @@ static int powernowk8_verify(struct cpufreq_policy *pol)
|
||||
static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
|
||||
{
|
||||
struct powernow_k8_data *data;
|
||||
cpumask_t oldmask = CPU_MASK_ALL;
|
||||
cpumask_t oldmask;
|
||||
int rc;
|
||||
|
||||
if (!cpu_online(pol->cpu))
|
||||
@ -1209,7 +1174,10 @@ static int __cpuinit powernowk8_cpu_init(struct cpufreq_policy *pol)
|
||||
/* run on any CPU again */
|
||||
set_cpus_allowed_ptr(current, &oldmask);
|
||||
|
||||
pol->cpus = data->starting_core_affinity;
|
||||
if (cpu_family == CPU_HW_PSTATE)
|
||||
pol->cpus = cpumask_of_cpu(pol->cpu);
|
||||
else
|
||||
pol->cpus = per_cpu(cpu_core_map, pol->cpu);
|
||||
data->available_cores = &(pol->cpus);
|
||||
|
||||
/* Take a crude guess here.
|
||||
@ -1332,7 +1300,6 @@ static int __cpuinit powernowk8_init(void)
|
||||
}
|
||||
|
||||
if (supported_cpus == num_online_cpus()) {
|
||||
powernow_k8_cpu_preinit_acpi();
|
||||
printk(KERN_INFO PFX "Found %d %s "
|
||||
"processors (%d cpu cores) (" VERSION ")\n",
|
||||
num_online_nodes(),
|
||||
@ -1349,10 +1316,6 @@ static void __exit powernowk8_exit(void)
|
||||
dprintk("exit\n");
|
||||
|
||||
cpufreq_unregister_driver(&cpufreq_amd64_driver);
|
||||
|
||||
#ifdef CONFIG_X86_POWERNOW_K8_ACPI
|
||||
free_percpu(acpi_perf_data);
|
||||
#endif
|
||||
}
|
||||
|
||||
MODULE_AUTHOR("Paul Devriendt <paul.devriendt@amd.com> and Mark Langsdorf <mark.langsdorf@amd.com>");
|
||||
|
@ -33,13 +33,12 @@ struct powernow_k8_data {
|
||||
#ifdef CONFIG_X86_POWERNOW_K8_ACPI
|
||||
/* the acpi table needs to be kept. it's only available if ACPI was
|
||||
* used to determine valid frequency/vid/fid states */
|
||||
struct acpi_processor_performance *acpi_data;
|
||||
struct acpi_processor_performance acpi_data;
|
||||
#endif
|
||||
/* we need to keep track of associated cores, but let cpufreq
|
||||
* handle hotplug events - so just point at cpufreq pol->cpus
|
||||
* structure */
|
||||
cpumask_t *available_cores;
|
||||
cpumask_t starting_core_affinity;
|
||||
};
|
||||
|
||||
|
||||
|
@ -134,23 +134,6 @@ static void __cpuinit set_cx86_memwb(void)
|
||||
setCx86(CX86_CCR2, getCx86(CX86_CCR2) | 0x14);
|
||||
}
|
||||
|
||||
static void __cpuinit set_cx86_inc(void)
|
||||
{
|
||||
unsigned char ccr3;
|
||||
|
||||
printk(KERN_INFO "Enable Incrementor on Cyrix/NSC processor.\n");
|
||||
|
||||
ccr3 = getCx86(CX86_CCR3);
|
||||
setCx86(CX86_CCR3, (ccr3 & 0x0f) | 0x10); /* enable MAPEN */
|
||||
/* PCR1 -- Performance Control */
|
||||
/* Incrementor on, whatever that is */
|
||||
setCx86(CX86_PCR1, getCx86(CX86_PCR1) | 0x02);
|
||||
/* PCR0 -- Performance Control */
|
||||
/* Incrementor Margin 10 */
|
||||
setCx86(CX86_PCR0, getCx86(CX86_PCR0) | 0x04);
|
||||
setCx86(CX86_CCR3, ccr3); /* disable MAPEN */
|
||||
}
|
||||
|
||||
/*
|
||||
* Configure later MediaGX and/or Geode processor.
|
||||
*/
|
||||
@ -174,7 +157,6 @@ static void __cpuinit geode_configure(void)
|
||||
|
||||
set_cx86_memwb();
|
||||
set_cx86_reorder();
|
||||
set_cx86_inc();
|
||||
|
||||
local_irq_restore(flags);
|
||||
}
|
||||
|
@ -759,6 +759,7 @@ static struct sysdev_class mce_sysclass = {
|
||||
};
|
||||
|
||||
DEFINE_PER_CPU(struct sys_device, device_mce);
|
||||
void (*threshold_cpu_callback)(unsigned long action, unsigned int cpu) __cpuinitdata;
|
||||
|
||||
/* Why are there no generic functions for this? */
|
||||
#define ACCESSOR(name, var, start) \
|
||||
@ -883,9 +884,13 @@ static int __cpuinit mce_cpu_callback(struct notifier_block *nfb,
|
||||
case CPU_ONLINE:
|
||||
case CPU_ONLINE_FROZEN:
|
||||
mce_create_device(cpu);
|
||||
if (threshold_cpu_callback)
|
||||
threshold_cpu_callback(action, cpu);
|
||||
break;
|
||||
case CPU_DEAD:
|
||||
case CPU_DEAD_FROZEN:
|
||||
if (threshold_cpu_callback)
|
||||
threshold_cpu_callback(action, cpu);
|
||||
mce_remove_device(cpu);
|
||||
break;
|
||||
}
|
||||
|
@ -628,6 +628,7 @@ static void threshold_remove_bank(unsigned int cpu, int bank)
|
||||
deallocate_threshold_block(cpu, bank);
|
||||
|
||||
free_out:
|
||||
kobject_del(b->kobj);
|
||||
kobject_put(b->kobj);
|
||||
kfree(b);
|
||||
per_cpu(threshold_banks, cpu)[bank] = NULL;
|
||||
@ -645,14 +646,11 @@ static void threshold_remove_device(unsigned int cpu)
|
||||
}
|
||||
|
||||
/* get notified when a cpu comes on/off */
|
||||
static int __cpuinit threshold_cpu_callback(struct notifier_block *nfb,
|
||||
unsigned long action, void *hcpu)
|
||||
static void __cpuinit amd_64_threshold_cpu_callback(unsigned long action,
|
||||
unsigned int cpu)
|
||||
{
|
||||
/* cpu was unsigned int to begin with */
|
||||
unsigned int cpu = (unsigned long)hcpu;
|
||||
|
||||
if (cpu >= NR_CPUS)
|
||||
goto out;
|
||||
return;
|
||||
|
||||
switch (action) {
|
||||
case CPU_ONLINE:
|
||||
@ -666,14 +664,8 @@ static int __cpuinit threshold_cpu_callback(struct notifier_block *nfb,
|
||||
default:
|
||||
break;
|
||||
}
|
||||
out:
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block threshold_cpu_notifier __cpuinitdata = {
|
||||
.notifier_call = threshold_cpu_callback,
|
||||
};
|
||||
|
||||
static __init int threshold_init_device(void)
|
||||
{
|
||||
unsigned lcpu = 0;
|
||||
@ -684,7 +676,7 @@ static __init int threshold_init_device(void)
|
||||
if (err)
|
||||
return err;
|
||||
}
|
||||
register_hotcpu_notifier(&threshold_cpu_notifier);
|
||||
threshold_cpu_callback = amd_64_threshold_cpu_callback;
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -379,6 +379,7 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base,
|
||||
unsigned long *size, mtrr_type *type)
|
||||
{
|
||||
unsigned int mask_lo, mask_hi, base_lo, base_hi;
|
||||
unsigned int tmp, hi;
|
||||
|
||||
rdmsr(MTRRphysMask_MSR(reg), mask_lo, mask_hi);
|
||||
if ((mask_lo & 0x800) == 0) {
|
||||
@ -392,8 +393,23 @@ static void generic_get_mtrr(unsigned int reg, unsigned long *base,
|
||||
rdmsr(MTRRphysBase_MSR(reg), base_lo, base_hi);
|
||||
|
||||
/* Work out the shifted address mask. */
|
||||
mask_lo = size_or_mask | mask_hi << (32 - PAGE_SHIFT)
|
||||
| mask_lo >> PAGE_SHIFT;
|
||||
tmp = mask_hi << (32 - PAGE_SHIFT) | mask_lo >> PAGE_SHIFT;
|
||||
mask_lo = size_or_mask | tmp;
|
||||
/* Expand tmp with high bits to all 1s*/
|
||||
hi = fls(tmp);
|
||||
if (hi > 0) {
|
||||
tmp |= ~((1<<(hi - 1)) - 1);
|
||||
|
||||
if (tmp != mask_lo) {
|
||||
static int once = 1;
|
||||
|
||||
if (once) {
|
||||
printk(KERN_INFO "mtrr: your BIOS has set up an incorrect mask, fixing it up.\n");
|
||||
once = 0;
|
||||
}
|
||||
mask_lo = tmp;
|
||||
}
|
||||
}
|
||||
|
||||
/* This works correctly if size is a power of two, i.e. a
|
||||
contiguous range. */
|
||||
|
@ -1496,11 +1496,8 @@ int __init mtrr_trim_uncached_memory(unsigned long end_pfn)
|
||||
|
||||
/* kvm/qemu doesn't have mtrr set right, don't trim them all */
|
||||
if (!highest_pfn) {
|
||||
if (!kvm_para_available()) {
|
||||
printk(KERN_WARNING
|
||||
WARN(!kvm_para_available(), KERN_WARNING
|
||||
"WARNING: strange, CPU MTRRs all blank?\n");
|
||||
WARN_ON(1);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
@ -293,7 +293,9 @@ static __init void uv_rtc_init(void)
|
||||
sn_rtc_cycles_per_second = ticks_per_sec;
|
||||
}
|
||||
|
||||
static __init void uv_system_init(void)
|
||||
static bool uv_system_inited;
|
||||
|
||||
void __init uv_system_init(void)
|
||||
{
|
||||
union uvh_si_addr_map_config_u m_n_config;
|
||||
union uvh_node_id_u node_id;
|
||||
@ -383,6 +385,7 @@ static __init void uv_system_init(void)
|
||||
map_mmr_high(max_pnode);
|
||||
map_config_high(max_pnode);
|
||||
map_mmioh_high(max_pnode);
|
||||
uv_system_inited = true;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -391,8 +394,7 @@ static __init void uv_system_init(void)
|
||||
*/
|
||||
void __cpuinit uv_cpu_init(void)
|
||||
{
|
||||
if (!uv_node_to_blade)
|
||||
uv_system_init();
|
||||
BUG_ON(!uv_system_inited);
|
||||
|
||||
uv_blade_info[uv_numa_blade_id()].nr_online_cpus++;
|
||||
|
||||
|
@ -73,7 +73,7 @@ static void __init smp_dump_qct(void)
|
||||
}
|
||||
|
||||
|
||||
void __init numaq_tsc_disable(void)
|
||||
void __cpuinit numaq_tsc_disable(void)
|
||||
{
|
||||
if (!found_numaq)
|
||||
return;
|
||||
|
@ -471,7 +471,7 @@ struct pv_lock_ops pv_lock_ops = {
|
||||
.spin_unlock = __ticket_spin_unlock,
|
||||
#endif
|
||||
};
|
||||
EXPORT_SYMBOL_GPL(pv_lock_ops);
|
||||
EXPORT_SYMBOL(pv_lock_ops);
|
||||
|
||||
EXPORT_SYMBOL_GPL(pv_time_ops);
|
||||
EXPORT_SYMBOL (pv_cpu_ops);
|
||||
|
@ -343,9 +343,8 @@ static void iommu_free(struct iommu_table *tbl, dma_addr_t dma_addr,
|
||||
/* were we called with bad_dma_address? */
|
||||
badend = bad_dma_address + (EMERGENCY_PAGES * PAGE_SIZE);
|
||||
if (unlikely((dma_addr >= bad_dma_address) && (dma_addr < badend))) {
|
||||
printk(KERN_ERR "Calgary: driver tried unmapping bad DMA "
|
||||
WARN(1, KERN_ERR "Calgary: driver tried unmapping bad DMA "
|
||||
"address 0x%Lx\n", dma_addr);
|
||||
WARN_ON(1);
|
||||
return;
|
||||
}
|
||||
|
||||
@ -1269,13 +1268,15 @@ static inline int __init determine_tce_table_size(u64 ram)
|
||||
static int __init build_detail_arrays(void)
|
||||
{
|
||||
unsigned long ptr;
|
||||
int i, scal_detail_size, rio_detail_size;
|
||||
unsigned numnodes, i;
|
||||
int scal_detail_size, rio_detail_size;
|
||||
|
||||
if (rio_table_hdr->num_scal_dev > MAX_NUMNODES){
|
||||
numnodes = rio_table_hdr->num_scal_dev;
|
||||
if (numnodes > MAX_NUMNODES){
|
||||
printk(KERN_WARNING
|
||||
"Calgary: MAX_NUMNODES too low! Defined as %d, "
|
||||
"but system has %d nodes.\n",
|
||||
MAX_NUMNODES, rio_table_hdr->num_scal_dev);
|
||||
MAX_NUMNODES, numnodes);
|
||||
return -ENODEV;
|
||||
}
|
||||
|
||||
@ -1296,8 +1297,7 @@ static int __init build_detail_arrays(void)
|
||||
}
|
||||
|
||||
ptr = ((unsigned long)rio_table_hdr) + 3;
|
||||
for (i = 0; i < rio_table_hdr->num_scal_dev;
|
||||
i++, ptr += scal_detail_size)
|
||||
for (i = 0; i < numnodes; i++, ptr += scal_detail_size)
|
||||
scal_devs[i] = (struct scal_detail *)ptr;
|
||||
|
||||
for (i = 0; i < rio_table_hdr->num_rio_dev;
|
||||
|
@ -604,14 +604,6 @@ void __init setup_arch(char **cmdline_p)
|
||||
early_cpu_init();
|
||||
early_ioremap_init();
|
||||
|
||||
#if defined(CONFIG_VMI) && defined(CONFIG_X86_32)
|
||||
/*
|
||||
* Must be before kernel pagetables are setup
|
||||
* or fixmap area is touched.
|
||||
*/
|
||||
vmi_init();
|
||||
#endif
|
||||
|
||||
ROOT_DEV = old_decode_dev(boot_params.hdr.root_dev);
|
||||
screen_info = boot_params.screen_info;
|
||||
edid_info = boot_params.edid_info;
|
||||
@ -678,6 +670,14 @@ void __init setup_arch(char **cmdline_p)
|
||||
|
||||
parse_early_param();
|
||||
|
||||
#if defined(CONFIG_VMI) && defined(CONFIG_X86_32)
|
||||
/*
|
||||
* Must be before kernel pagetables are setup
|
||||
* or fixmap area is touched.
|
||||
*/
|
||||
vmi_init();
|
||||
#endif
|
||||
|
||||
/* after early param, so could get panic from serial */
|
||||
reserve_early_setup_data();
|
||||
|
||||
|
@ -1221,6 +1221,9 @@ void __init native_smp_prepare_cpus(unsigned int max_cpus)
|
||||
printk(KERN_INFO "CPU%d: ", 0);
|
||||
print_cpu_info(&cpu_data(0));
|
||||
setup_boot_clock();
|
||||
|
||||
if (is_uv_system())
|
||||
uv_system_init();
|
||||
out:
|
||||
preempt_enable();
|
||||
}
|
||||
|
@ -17,6 +17,7 @@
|
||||
#include <asm/genapic.h>
|
||||
#include <asm/idle.h>
|
||||
#include <asm/tsc.h>
|
||||
#include <asm/irq_vectors.h>
|
||||
|
||||
#include <mach_apic.h>
|
||||
|
||||
@ -783,7 +784,7 @@ static int __init uv_bau_init(void)
|
||||
uv_init_blade(blade, node, cur_cpu);
|
||||
cur_cpu += uv_blade_nr_possible_cpus(blade);
|
||||
}
|
||||
set_intr_gate(UV_BAU_MESSAGE, uv_bau_message_intr1);
|
||||
alloc_intr_gate(UV_BAU_MESSAGE, uv_bau_message_intr1);
|
||||
uv_enable_timeouts();
|
||||
|
||||
return 0;
|
||||
|
@ -314,7 +314,7 @@ static int time_cpufreq_notifier(struct notifier_block *nb, unsigned long val,
|
||||
mark_tsc_unstable("cpufreq changes");
|
||||
}
|
||||
|
||||
set_cyc2ns_scale(tsc_khz_ref, freq->cpu);
|
||||
set_cyc2ns_scale(tsc_khz, freq->cpu);
|
||||
|
||||
return 0;
|
||||
}
|
||||
@ -325,6 +325,10 @@ static struct notifier_block time_cpufreq_notifier_block = {
|
||||
|
||||
static int __init cpufreq_tsc(void)
|
||||
{
|
||||
if (!cpu_has_tsc)
|
||||
return 0;
|
||||
if (boot_cpu_has(X86_FEATURE_CONSTANT_TSC))
|
||||
return 0;
|
||||
cpufreq_register_notifier(&time_cpufreq_notifier_block,
|
||||
CPUFREQ_TRANSITION_NOTIFIER);
|
||||
return 0;
|
||||
|
@ -88,11 +88,9 @@ static __cpuinit void check_tsc_warp(void)
|
||||
__raw_spin_unlock(&sync_lock);
|
||||
}
|
||||
}
|
||||
if (!(now-start)) {
|
||||
printk("Warning: zero tsc calibration delta: %Ld [max: %Ld]\n",
|
||||
WARN(!(now-start),
|
||||
"Warning: zero tsc calibration delta: %Ld [max: %Ld]\n",
|
||||
now-start, end-start);
|
||||
WARN_ON(1);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
|
@ -345,7 +345,7 @@ static u64 *FNAME(fetch)(struct kvm_vcpu *vcpu, gva_t addr,
|
||||
shadow_addr = __pa(shadow_page->spt);
|
||||
shadow_pte = shadow_addr | PT_PRESENT_MASK | PT_ACCESSED_MASK
|
||||
| PT_WRITABLE_MASK | PT_USER_MASK;
|
||||
*shadow_ent = shadow_pte;
|
||||
set_shadow_pte(shadow_ent, shadow_pte);
|
||||
}
|
||||
|
||||
mmu_set_spte(vcpu, shadow_ent, access, walker->pte_access & access,
|
||||
|
@ -25,7 +25,6 @@
|
||||
#include <linux/list.h>
|
||||
#include <linux/device.h>
|
||||
#include <linux/platform_device.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/leds.h>
|
||||
|
||||
#include <asm/gpio.h>
|
||||
|
@ -241,7 +241,7 @@ static unsigned long __initdata table_start;
|
||||
static unsigned long __meminitdata table_end;
|
||||
static unsigned long __meminitdata table_top;
|
||||
|
||||
static __meminit void *alloc_low_page(unsigned long *phys)
|
||||
static __ref void *alloc_low_page(unsigned long *phys)
|
||||
{
|
||||
unsigned long pfn = table_end++;
|
||||
void *adr;
|
||||
@ -262,7 +262,7 @@ static __meminit void *alloc_low_page(unsigned long *phys)
|
||||
return adr;
|
||||
}
|
||||
|
||||
static __meminit void unmap_low_page(void *adr)
|
||||
static __ref void unmap_low_page(void *adr)
|
||||
{
|
||||
if (after_bootmem)
|
||||
return;
|
||||
@ -336,9 +336,12 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end,
|
||||
}
|
||||
|
||||
if (pmd_val(*pmd)) {
|
||||
if (!pmd_large(*pmd))
|
||||
if (!pmd_large(*pmd)) {
|
||||
spin_lock(&init_mm.page_table_lock);
|
||||
last_map_addr = phys_pte_update(pmd, address,
|
||||
end);
|
||||
end);
|
||||
spin_unlock(&init_mm.page_table_lock);
|
||||
}
|
||||
/* Count entries we're using from level2_ident_pgt */
|
||||
if (start == 0)
|
||||
pages++;
|
||||
@ -347,8 +350,10 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end,
|
||||
|
||||
if (page_size_mask & (1<<PG_LEVEL_2M)) {
|
||||
pages++;
|
||||
spin_lock(&init_mm.page_table_lock);
|
||||
set_pte((pte_t *)pmd,
|
||||
pfn_pte(address >> PAGE_SHIFT, PAGE_KERNEL_LARGE));
|
||||
spin_unlock(&init_mm.page_table_lock);
|
||||
last_map_addr = (address & PMD_MASK) + PMD_SIZE;
|
||||
continue;
|
||||
}
|
||||
@ -357,7 +362,9 @@ phys_pmd_init(pmd_t *pmd_page, unsigned long address, unsigned long end,
|
||||
last_map_addr = phys_pte_init(pte, address, end);
|
||||
unmap_low_page(pte);
|
||||
|
||||
spin_lock(&init_mm.page_table_lock);
|
||||
pmd_populate_kernel(&init_mm, pmd, __va(pte_phys));
|
||||
spin_unlock(&init_mm.page_table_lock);
|
||||
}
|
||||
update_page_count(PG_LEVEL_2M, pages);
|
||||
return last_map_addr;
|
||||
@ -370,9 +377,7 @@ phys_pmd_update(pud_t *pud, unsigned long address, unsigned long end,
|
||||
pmd_t *pmd = pmd_offset(pud, 0);
|
||||
unsigned long last_map_addr;
|
||||
|
||||
spin_lock(&init_mm.page_table_lock);
|
||||
last_map_addr = phys_pmd_init(pmd, address, end, page_size_mask);
|
||||
spin_unlock(&init_mm.page_table_lock);
|
||||
__flush_tlb_all();
|
||||
return last_map_addr;
|
||||
}
|
||||
@ -408,20 +413,21 @@ phys_pud_init(pud_t *pud_page, unsigned long addr, unsigned long end,
|
||||
|
||||
if (page_size_mask & (1<<PG_LEVEL_1G)) {
|
||||
pages++;
|
||||
spin_lock(&init_mm.page_table_lock);
|
||||
set_pte((pte_t *)pud,
|
||||
pfn_pte(addr >> PAGE_SHIFT, PAGE_KERNEL_LARGE));
|
||||
spin_unlock(&init_mm.page_table_lock);
|
||||
last_map_addr = (addr & PUD_MASK) + PUD_SIZE;
|
||||
continue;
|
||||
}
|
||||
|
||||
pmd = alloc_low_page(&pmd_phys);
|
||||
|
||||
spin_lock(&init_mm.page_table_lock);
|
||||
last_map_addr = phys_pmd_init(pmd, addr, end, page_size_mask);
|
||||
unmap_low_page(pmd);
|
||||
|
||||
spin_lock(&init_mm.page_table_lock);
|
||||
pud_populate(&init_mm, pud, __va(pmd_phys));
|
||||
spin_unlock(&init_mm.page_table_lock);
|
||||
|
||||
}
|
||||
__flush_tlb_all();
|
||||
update_page_count(PG_LEVEL_1G, pages);
|
||||
@ -513,16 +519,14 @@ static unsigned long __init kernel_physical_mapping_init(unsigned long start,
|
||||
continue;
|
||||
}
|
||||
|
||||
if (after_bootmem)
|
||||
pud = pud_offset(pgd, start & PGDIR_MASK);
|
||||
else
|
||||
pud = alloc_low_page(&pud_phys);
|
||||
|
||||
pud = alloc_low_page(&pud_phys);
|
||||
last_map_addr = phys_pud_init(pud, __pa(start), __pa(next),
|
||||
page_size_mask);
|
||||
unmap_low_page(pud);
|
||||
pgd_populate(&init_mm, pgd_offset_k(start),
|
||||
__va(pud_phys));
|
||||
|
||||
spin_lock(&init_mm.page_table_lock);
|
||||
pgd_populate(&init_mm, pgd, __va(pud_phys));
|
||||
spin_unlock(&init_mm.page_table_lock);
|
||||
}
|
||||
|
||||
return last_map_addr;
|
||||
|
@ -553,13 +553,11 @@ static int __init check_early_ioremap_leak(void)
|
||||
{
|
||||
if (!early_ioremap_nested)
|
||||
return 0;
|
||||
|
||||
printk(KERN_WARNING
|
||||
WARN(1, KERN_WARNING
|
||||
"Debug warning: early ioremap leak of %d areas detected.\n",
|
||||
early_ioremap_nested);
|
||||
early_ioremap_nested);
|
||||
printk(KERN_WARNING
|
||||
"please boot with early_ioremap_debug and report the dmesg.\n");
|
||||
WARN_ON(1);
|
||||
"please boot with early_ioremap_debug and report the dmesg.\n");
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
@ -430,7 +430,9 @@ static void enter_uniprocessor(void)
|
||||
"may miss events.\n");
|
||||
}
|
||||
|
||||
static void leave_uniprocessor(void)
|
||||
/* __ref because leave_uniprocessor calls cpu_up which is __cpuinit,
|
||||
but this whole function is ifdefed CONFIG_HOTPLUG_CPU */
|
||||
static void __ref leave_uniprocessor(void)
|
||||
{
|
||||
int cpu;
|
||||
int err;
|
||||
|
@ -849,7 +849,7 @@ int set_memory_uc(unsigned long addr, int numpages)
|
||||
/*
|
||||
* for now UC MINUS. see comments in ioremap_nocache()
|
||||
*/
|
||||
if (reserve_memtype(addr, addr + numpages * PAGE_SIZE,
|
||||
if (reserve_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE,
|
||||
_PAGE_CACHE_UC_MINUS, NULL))
|
||||
return -EINVAL;
|
||||
|
||||
@ -868,7 +868,7 @@ int set_memory_wc(unsigned long addr, int numpages)
|
||||
if (!pat_enabled)
|
||||
return set_memory_uc(addr, numpages);
|
||||
|
||||
if (reserve_memtype(addr, addr + numpages * PAGE_SIZE,
|
||||
if (reserve_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE,
|
||||
_PAGE_CACHE_WC, NULL))
|
||||
return -EINVAL;
|
||||
|
||||
@ -884,7 +884,7 @@ int _set_memory_wb(unsigned long addr, int numpages)
|
||||
|
||||
int set_memory_wb(unsigned long addr, int numpages)
|
||||
{
|
||||
free_memtype(addr, addr + numpages * PAGE_SIZE);
|
||||
free_memtype(__pa(addr), __pa(addr) + numpages * PAGE_SIZE);
|
||||
|
||||
return _set_memory_wb(addr, numpages);
|
||||
}
|
||||
|
@ -207,6 +207,9 @@ static int chk_conflict(struct memtype *new, struct memtype *entry,
|
||||
return -EBUSY;
|
||||
}
|
||||
|
||||
static struct memtype *cached_entry;
|
||||
static u64 cached_start;
|
||||
|
||||
/*
|
||||
* req_type typically has one of the:
|
||||
* - _PAGE_CACHE_WB
|
||||
@ -280,11 +283,17 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type,
|
||||
|
||||
spin_lock(&memtype_lock);
|
||||
|
||||
if (cached_entry && start >= cached_start)
|
||||
entry = cached_entry;
|
||||
else
|
||||
entry = list_entry(&memtype_list, struct memtype, nd);
|
||||
|
||||
/* Search for existing mapping that overlaps the current range */
|
||||
where = NULL;
|
||||
list_for_each_entry(entry, &memtype_list, nd) {
|
||||
list_for_each_entry_continue(entry, &memtype_list, nd) {
|
||||
if (end <= entry->start) {
|
||||
where = entry->nd.prev;
|
||||
cached_entry = list_entry(where, struct memtype, nd);
|
||||
break;
|
||||
} else if (start <= entry->start) { /* end > entry->start */
|
||||
err = chk_conflict(new, entry, new_type);
|
||||
@ -292,6 +301,8 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type,
|
||||
dprintk("Overlap at 0x%Lx-0x%Lx\n",
|
||||
entry->start, entry->end);
|
||||
where = entry->nd.prev;
|
||||
cached_entry = list_entry(where,
|
||||
struct memtype, nd);
|
||||
}
|
||||
break;
|
||||
} else if (start < entry->end) { /* start > entry->start */
|
||||
@ -299,7 +310,20 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type,
|
||||
if (!err) {
|
||||
dprintk("Overlap at 0x%Lx-0x%Lx\n",
|
||||
entry->start, entry->end);
|
||||
where = &entry->nd;
|
||||
cached_entry = list_entry(entry->nd.prev,
|
||||
struct memtype, nd);
|
||||
|
||||
/*
|
||||
* Move to right position in the linked
|
||||
* list to add this new entry
|
||||
*/
|
||||
list_for_each_entry_continue(entry,
|
||||
&memtype_list, nd) {
|
||||
if (start <= entry->start) {
|
||||
where = entry->nd.prev;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
break;
|
||||
}
|
||||
@ -314,6 +338,8 @@ int reserve_memtype(u64 start, u64 end, unsigned long req_type,
|
||||
return err;
|
||||
}
|
||||
|
||||
cached_start = start;
|
||||
|
||||
if (where)
|
||||
list_add(&new->nd, where);
|
||||
else
|
||||
@ -343,6 +369,9 @@ int free_memtype(u64 start, u64 end)
|
||||
spin_lock(&memtype_lock);
|
||||
list_for_each_entry(entry, &memtype_list, nd) {
|
||||
if (entry->start == start && entry->end == end) {
|
||||
if (cached_entry == entry || cached_start == start)
|
||||
cached_entry = NULL;
|
||||
|
||||
list_del(&entry->nd);
|
||||
kfree(entry);
|
||||
err = 0;
|
||||
@ -361,14 +390,6 @@ int free_memtype(u64 start, u64 end)
|
||||
}
|
||||
|
||||
|
||||
/*
|
||||
* /dev/mem mmap interface. The memtype used for mapping varies:
|
||||
* - Use UC for mappings with O_SYNC flag
|
||||
* - Without O_SYNC flag, if there is any conflict in reserve_memtype,
|
||||
* inherit the memtype from existing mapping.
|
||||
* - Else use UC_MINUS memtype (for backward compatibility with existing
|
||||
* X drivers.
|
||||
*/
|
||||
pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
|
||||
unsigned long size, pgprot_t vma_prot)
|
||||
{
|
||||
@ -406,14 +427,14 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
|
||||
unsigned long size, pgprot_t *vma_prot)
|
||||
{
|
||||
u64 offset = ((u64) pfn) << PAGE_SHIFT;
|
||||
unsigned long flags = _PAGE_CACHE_UC_MINUS;
|
||||
unsigned long flags = -1;
|
||||
int retval;
|
||||
|
||||
if (!range_is_allowed(pfn, size))
|
||||
return 0;
|
||||
|
||||
if (file->f_flags & O_SYNC) {
|
||||
flags = _PAGE_CACHE_UC;
|
||||
flags = _PAGE_CACHE_UC_MINUS;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_X86_32
|
||||
@ -436,13 +457,14 @@ int phys_mem_access_prot_allowed(struct file *file, unsigned long pfn,
|
||||
#endif
|
||||
|
||||
/*
|
||||
* With O_SYNC, we can only take UC mapping. Fail if we cannot.
|
||||
* With O_SYNC, we can only take UC_MINUS mapping. Fail if we cannot.
|
||||
*
|
||||
* Without O_SYNC, we want to get
|
||||
* - WB for WB-able memory and no other conflicting mappings
|
||||
* - UC_MINUS for non-WB-able memory with no other conflicting mappings
|
||||
* - Inherit from confliting mappings otherwise
|
||||
*/
|
||||
if (flags != _PAGE_CACHE_UC_MINUS) {
|
||||
if (flags != -1) {
|
||||
retval = reserve_memtype(offset, offset + size, flags, NULL);
|
||||
} else {
|
||||
retval = reserve_memtype(offset, offset + size, -1, &flags);
|
||||
|
@ -15,6 +15,7 @@
|
||||
#include <linux/slab.h>
|
||||
#include <linux/moduleparam.h>
|
||||
#include <linux/kdebug.h>
|
||||
#include <linux/cpu.h>
|
||||
#include <asm/nmi.h>
|
||||
#include <asm/msr.h>
|
||||
#include <asm/apic.h>
|
||||
@ -28,23 +29,48 @@ static DEFINE_PER_CPU(unsigned long, saved_lvtpc);
|
||||
|
||||
static int nmi_start(void);
|
||||
static void nmi_stop(void);
|
||||
static void nmi_cpu_start(void *dummy);
|
||||
static void nmi_cpu_stop(void *dummy);
|
||||
|
||||
/* 0 == registered but off, 1 == registered and on */
|
||||
static int nmi_enabled = 0;
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static int oprofile_cpu_notifier(struct notifier_block *b, unsigned long action,
|
||||
void *data)
|
||||
{
|
||||
int cpu = (unsigned long)data;
|
||||
switch (action) {
|
||||
case CPU_DOWN_FAILED:
|
||||
case CPU_ONLINE:
|
||||
smp_call_function_single(cpu, nmi_cpu_start, NULL, 0);
|
||||
break;
|
||||
case CPU_DOWN_PREPARE:
|
||||
smp_call_function_single(cpu, nmi_cpu_stop, NULL, 1);
|
||||
break;
|
||||
}
|
||||
return NOTIFY_DONE;
|
||||
}
|
||||
|
||||
static struct notifier_block oprofile_cpu_nb = {
|
||||
.notifier_call = oprofile_cpu_notifier
|
||||
};
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PM
|
||||
|
||||
static int nmi_suspend(struct sys_device *dev, pm_message_t state)
|
||||
{
|
||||
/* Only one CPU left, just stop that one */
|
||||
if (nmi_enabled == 1)
|
||||
nmi_stop();
|
||||
nmi_cpu_stop(NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int nmi_resume(struct sys_device *dev)
|
||||
{
|
||||
if (nmi_enabled == 1)
|
||||
nmi_start();
|
||||
nmi_cpu_start(NULL);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -463,6 +489,9 @@ int __init op_nmi_init(struct oprofile_operations *ops)
|
||||
}
|
||||
|
||||
init_sysfs();
|
||||
#ifdef CONFIG_SMP
|
||||
register_cpu_notifier(&oprofile_cpu_nb);
|
||||
#endif
|
||||
using_nmi = 1;
|
||||
ops->create_files = nmi_create_files;
|
||||
ops->setup = nmi_setup;
|
||||
@ -476,6 +505,10 @@ int __init op_nmi_init(struct oprofile_operations *ops)
|
||||
|
||||
void op_nmi_exit(void)
|
||||
{
|
||||
if (using_nmi)
|
||||
if (using_nmi) {
|
||||
exit_sysfs();
|
||||
#ifdef CONFIG_SMP
|
||||
unregister_cpu_notifier(&oprofile_cpu_nb);
|
||||
#endif
|
||||
}
|
||||
}
|
||||
|
@ -1,6 +1,7 @@
|
||||
#include <linux/init.h>
|
||||
#include <linux/pci.h>
|
||||
#include <linux/topology.h>
|
||||
#include <linux/cpu.h>
|
||||
#include "pci.h"
|
||||
|
||||
#ifdef CONFIG_X86_64
|
||||
@ -555,15 +556,17 @@ static int __init early_fill_mp_bus_info(void)
|
||||
return 0;
|
||||
}
|
||||
|
||||
postcore_initcall(early_fill_mp_bus_info);
|
||||
#else /* !CONFIG_X86_64 */
|
||||
|
||||
#endif
|
||||
static int __init early_fill_mp_bus_info(void) { return 0; }
|
||||
|
||||
#endif /* !CONFIG_X86_64 */
|
||||
|
||||
/* common 32/64 bit code */
|
||||
|
||||
#define ENABLE_CF8_EXT_CFG (1ULL << 46)
|
||||
|
||||
static void enable_pci_io_ecs_per_cpu(void *unused)
|
||||
static void enable_pci_io_ecs(void *unused)
|
||||
{
|
||||
u64 reg;
|
||||
rdmsrl(MSR_AMD64_NB_CFG, reg);
|
||||
@ -573,14 +576,51 @@ static void enable_pci_io_ecs_per_cpu(void *unused)
|
||||
}
|
||||
}
|
||||
|
||||
static int __init enable_pci_io_ecs(void)
|
||||
static int __cpuinit amd_cpu_notify(struct notifier_block *self,
|
||||
unsigned long action, void *hcpu)
|
||||
{
|
||||
int cpu = (long)hcpu;
|
||||
switch(action) {
|
||||
case CPU_ONLINE:
|
||||
case CPU_ONLINE_FROZEN:
|
||||
smp_call_function_single(cpu, enable_pci_io_ecs, NULL, 0);
|
||||
break;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
return NOTIFY_OK;
|
||||
}
|
||||
|
||||
static struct notifier_block __cpuinitdata amd_cpu_notifier = {
|
||||
.notifier_call = amd_cpu_notify,
|
||||
};
|
||||
|
||||
static int __init pci_io_ecs_init(void)
|
||||
{
|
||||
int cpu;
|
||||
|
||||
/* assume all cpus from fam10h have IO ECS */
|
||||
if (boot_cpu_data.x86 < 0x10)
|
||||
return 0;
|
||||
on_each_cpu(enable_pci_io_ecs_per_cpu, NULL, 1);
|
||||
|
||||
register_cpu_notifier(&amd_cpu_notifier);
|
||||
for_each_online_cpu(cpu)
|
||||
amd_cpu_notify(&amd_cpu_notifier, (unsigned long)CPU_ONLINE,
|
||||
(void *)(long)cpu);
|
||||
pci_probe |= PCI_HAS_IO_ECS;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
postcore_initcall(enable_pci_io_ecs);
|
||||
static int __init amd_postcore_init(void)
|
||||
{
|
||||
if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
|
||||
return 0;
|
||||
|
||||
early_fill_mp_bus_info();
|
||||
pci_io_ecs_init();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
postcore_initcall(amd_postcore_init);
|
||||
|
@ -31,8 +31,11 @@
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/errno.h>
|
||||
#include <linux/bootmem.h>
|
||||
#include <linux/acpi.h>
|
||||
|
||||
#include <asm/pat.h>
|
||||
#include <asm/hpet.h>
|
||||
#include <asm/io_apic.h>
|
||||
|
||||
#include "pci.h"
|
||||
|
||||
@ -77,6 +80,77 @@ pcibios_align_resource(void *data, struct resource *res,
|
||||
}
|
||||
EXPORT_SYMBOL(pcibios_align_resource);
|
||||
|
||||
static int check_res_with_valid(struct pci_dev *dev, struct resource *res)
|
||||
{
|
||||
unsigned long base;
|
||||
unsigned long size;
|
||||
int i;
|
||||
|
||||
base = res->start;
|
||||
size = (res->start == 0 && res->end == res->start) ? 0 :
|
||||
(res->end - res->start + 1);
|
||||
|
||||
if (!base || !size)
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_HPET_TIMER
|
||||
/* for hpet */
|
||||
if (base == hpet_address && (res->flags & IORESOURCE_MEM)) {
|
||||
dev_info(&dev->dev, "BAR has HPET at %08lx-%08lx\n",
|
||||
base, base + size - 1);
|
||||
return 1;
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_X86_IO_APIC
|
||||
for (i = 0; i < nr_ioapics; i++) {
|
||||
unsigned long ioapic_phys = mp_ioapics[i].mp_apicaddr;
|
||||
|
||||
if (base == ioapic_phys && (res->flags & IORESOURCE_MEM)) {
|
||||
dev_info(&dev->dev, "BAR has ioapic at %08lx-%08lx\n",
|
||||
base, base + size - 1);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
#ifdef CONFIG_PCI_MMCONFIG
|
||||
for (i = 0; i < pci_mmcfg_config_num; i++) {
|
||||
unsigned long addr;
|
||||
|
||||
addr = pci_mmcfg_config[i].address;
|
||||
if (base == addr && (res->flags & IORESOURCE_MEM)) {
|
||||
dev_info(&dev->dev, "BAR has MMCONFIG at %08lx-%08lx\n",
|
||||
base, base + size - 1);
|
||||
return 1;
|
||||
}
|
||||
}
|
||||
#endif
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int check_platform(struct pci_dev *dev, struct resource *res)
|
||||
{
|
||||
struct resource *root = NULL;
|
||||
|
||||
/*
|
||||
* forcibly insert it into the
|
||||
* resource tree
|
||||
*/
|
||||
if (res->flags & IORESOURCE_MEM)
|
||||
root = &iomem_resource;
|
||||
else if (res->flags & IORESOURCE_IO)
|
||||
root = &ioport_resource;
|
||||
|
||||
if (root && check_res_with_valid(dev, res)) {
|
||||
insert_resource(root, res);
|
||||
|
||||
return 1;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
/*
|
||||
* Handle resources of PCI devices. If the world were perfect, we could
|
||||
* just allocate all the resource regions and do nothing more. It isn't.
|
||||
@ -128,6 +202,8 @@ static void __init pcibios_allocate_bus_resources(struct list_head *bus_list)
|
||||
pr = pci_find_parent_resource(dev, r);
|
||||
if (!r->start || !pr ||
|
||||
request_resource(pr, r) < 0) {
|
||||
if (check_platform(dev, r))
|
||||
continue;
|
||||
dev_err(&dev->dev, "BAR %d: can't "
|
||||
"allocate resource\n", idx);
|
||||
/*
|
||||
@ -171,6 +247,8 @@ static void __init pcibios_allocate_resources(int pass)
|
||||
r->flags, disabled, pass);
|
||||
pr = pci_find_parent_resource(dev, r);
|
||||
if (!pr || request_resource(pr, r) < 0) {
|
||||
if (check_platform(dev, r))
|
||||
continue;
|
||||
dev_err(&dev->dev, "BAR %d: can't "
|
||||
"allocate resource\n", idx);
|
||||
/* We'll assign a new address later */
|
||||
|
@ -590,6 +590,8 @@ static __init int intel_router_probe(struct irq_router *r, struct pci_dev *route
|
||||
case PCI_DEVICE_ID_INTEL_ICH10_1:
|
||||
case PCI_DEVICE_ID_INTEL_ICH10_2:
|
||||
case PCI_DEVICE_ID_INTEL_ICH10_3:
|
||||
case PCI_DEVICE_ID_INTEL_PCH_0:
|
||||
case PCI_DEVICE_ID_INTEL_PCH_1:
|
||||
r->name = "PIIX/ICH";
|
||||
r->get = pirq_piix_get;
|
||||
r->set = pirq_piix_set;
|
||||
|
@ -14,7 +14,7 @@ static void __devinit pcibios_fixup_peer_bridges(void)
|
||||
int n, devfn;
|
||||
long node;
|
||||
|
||||
if (pcibios_last_bus <= 0 || pcibios_last_bus >= 0xff)
|
||||
if (pcibios_last_bus <= 0 || pcibios_last_bus > 0xff)
|
||||
return;
|
||||
DBG("PCI: Peer bridge fixup\n");
|
||||
|
||||
|
@ -293,7 +293,7 @@ static acpi_status __init find_mboard_resource(acpi_handle handle, u32 lvl,
|
||||
return AE_OK;
|
||||
}
|
||||
|
||||
static int __init is_acpi_reserved(unsigned long start, unsigned long end)
|
||||
static int __init is_acpi_reserved(u64 start, u64 end, unsigned not_used)
|
||||
{
|
||||
struct resource mcfg_res;
|
||||
|
||||
@ -310,6 +310,41 @@ static int __init is_acpi_reserved(unsigned long start, unsigned long end)
|
||||
return mcfg_res.flags;
|
||||
}
|
||||
|
||||
typedef int (*check_reserved_t)(u64 start, u64 end, unsigned type);
|
||||
|
||||
static int __init is_mmconf_reserved(check_reserved_t is_reserved,
|
||||
u64 addr, u64 size, int i,
|
||||
typeof(pci_mmcfg_config[0]) *cfg, int with_e820)
|
||||
{
|
||||
u64 old_size = size;
|
||||
int valid = 0;
|
||||
|
||||
while (!is_reserved(addr, addr + size - 1, E820_RESERVED)) {
|
||||
size >>= 1;
|
||||
if (size < (16UL<<20))
|
||||
break;
|
||||
}
|
||||
|
||||
if (size >= (16UL<<20) || size == old_size) {
|
||||
printk(KERN_NOTICE
|
||||
"PCI: MCFG area at %Lx reserved in %s\n",
|
||||
addr, with_e820?"E820":"ACPI motherboard resources");
|
||||
valid = 1;
|
||||
|
||||
if (old_size != size) {
|
||||
/* update end_bus_number */
|
||||
cfg->end_bus_number = cfg->start_bus_number + ((size>>20) - 1);
|
||||
printk(KERN_NOTICE "PCI: updated MCFG configuration %d: base %lx "
|
||||
"segment %hu buses %u - %u\n",
|
||||
i, (unsigned long)cfg->address, cfg->pci_segment,
|
||||
(unsigned int)cfg->start_bus_number,
|
||||
(unsigned int)cfg->end_bus_number);
|
||||
}
|
||||
}
|
||||
|
||||
return valid;
|
||||
}
|
||||
|
||||
static void __init pci_mmcfg_reject_broken(int early)
|
||||
{
|
||||
typeof(pci_mmcfg_config[0]) *cfg;
|
||||
@ -324,21 +359,22 @@ static void __init pci_mmcfg_reject_broken(int early)
|
||||
|
||||
for (i = 0; i < pci_mmcfg_config_num; i++) {
|
||||
int valid = 0;
|
||||
u32 size = (cfg->end_bus_number + 1) << 20;
|
||||
u64 addr, size;
|
||||
|
||||
cfg = &pci_mmcfg_config[i];
|
||||
addr = cfg->start_bus_number;
|
||||
addr <<= 20;
|
||||
addr += cfg->address;
|
||||
size = cfg->end_bus_number + 1 - cfg->start_bus_number;
|
||||
size <<= 20;
|
||||
printk(KERN_NOTICE "PCI: MCFG configuration %d: base %lx "
|
||||
"segment %hu buses %u - %u\n",
|
||||
i, (unsigned long)cfg->address, cfg->pci_segment,
|
||||
(unsigned int)cfg->start_bus_number,
|
||||
(unsigned int)cfg->end_bus_number);
|
||||
|
||||
if (!early &&
|
||||
is_acpi_reserved(cfg->address, cfg->address + size - 1)) {
|
||||
printk(KERN_NOTICE "PCI: MCFG area at %Lx reserved "
|
||||
"in ACPI motherboard resources\n",
|
||||
cfg->address);
|
||||
valid = 1;
|
||||
}
|
||||
if (!early)
|
||||
valid = is_mmconf_reserved(is_acpi_reserved, addr, size, i, cfg, 0);
|
||||
|
||||
if (valid)
|
||||
continue;
|
||||
@ -347,16 +383,11 @@ static void __init pci_mmcfg_reject_broken(int early)
|
||||
printk(KERN_ERR "PCI: BIOS Bug: MCFG area at %Lx is not"
|
||||
" reserved in ACPI motherboard resources\n",
|
||||
cfg->address);
|
||||
|
||||
/* Don't try to do this check unless configuration
|
||||
type 1 is available. how about type 2 ?*/
|
||||
if (raw_pci_ops && e820_all_mapped(cfg->address,
|
||||
cfg->address + size - 1,
|
||||
E820_RESERVED)) {
|
||||
printk(KERN_NOTICE
|
||||
"PCI: MCFG area at %Lx reserved in E820\n",
|
||||
cfg->address);
|
||||
valid = 1;
|
||||
}
|
||||
if (raw_pci_ops)
|
||||
valid = is_mmconf_reserved(e820_all_mapped, addr, size, i, cfg, 1);
|
||||
|
||||
if (!valid)
|
||||
goto reject;
|
||||
|
@ -293,27 +293,30 @@ void __init printk_all_partitions(void)
|
||||
/* iterator */
|
||||
static int find_start(struct device *dev, void *data)
|
||||
{
|
||||
loff_t k = *(loff_t *)data;
|
||||
loff_t *k = data;
|
||||
|
||||
if (dev->type != &disk_type)
|
||||
return 0;
|
||||
if (!k--)
|
||||
if (!*k)
|
||||
return 1;
|
||||
(*k)--;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static void *part_start(struct seq_file *part, loff_t *pos)
|
||||
{
|
||||
struct device *dev;
|
||||
loff_t n = *pos;
|
||||
loff_t k = *pos;
|
||||
|
||||
if (!n)
|
||||
if (!k)
|
||||
seq_puts(part, "major minor #blocks name\n\n");
|
||||
|
||||
mutex_lock(&block_class_lock);
|
||||
dev = class_find_device(&block_class, NULL, (void *)pos, find_start);
|
||||
if (dev)
|
||||
dev = class_find_device(&block_class, NULL, &k, find_start);
|
||||
if (dev) {
|
||||
put_device(dev);
|
||||
return dev_to_disk(dev);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -330,8 +333,10 @@ static void *part_next(struct seq_file *part, void *v, loff_t *pos)
|
||||
struct device *dev;
|
||||
++*pos;
|
||||
dev = class_find_device(&block_class, &gp->dev, NULL, find_next);
|
||||
if (dev)
|
||||
if (dev) {
|
||||
put_device(dev);
|
||||
return dev_to_disk(dev);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -568,11 +573,14 @@ static struct device_type disk_type = {
|
||||
static void *diskstats_start(struct seq_file *part, loff_t *pos)
|
||||
{
|
||||
struct device *dev;
|
||||
loff_t k = *pos;
|
||||
|
||||
mutex_lock(&block_class_lock);
|
||||
dev = class_find_device(&block_class, NULL, (void *)pos, find_start);
|
||||
if (dev)
|
||||
dev = class_find_device(&block_class, NULL, &k, find_start);
|
||||
if (dev) {
|
||||
put_device(dev);
|
||||
return dev_to_disk(dev);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -583,8 +591,10 @@ static void *diskstats_next(struct seq_file *part, void *v, loff_t *pos)
|
||||
|
||||
++*pos;
|
||||
dev = class_find_device(&block_class, &gp->dev, NULL, find_next);
|
||||
if (dev)
|
||||
if (dev) {
|
||||
put_device(dev);
|
||||
return dev_to_disk(dev);
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
@ -712,10 +722,12 @@ dev_t blk_lookup_devt(const char *name, int part)
|
||||
mutex_lock(&block_class_lock);
|
||||
find.name = name;
|
||||
find.part = part;
|
||||
dev = class_find_device(&block_class, NULL, (void *)&find, match_id);
|
||||
if (dev)
|
||||
dev = class_find_device(&block_class, NULL, &find, match_id);
|
||||
if (dev) {
|
||||
put_device(dev);
|
||||
devt = MKDEV(MAJOR(dev->devt),
|
||||
MINOR(dev->devt) + part);
|
||||
}
|
||||
mutex_unlock(&block_class_lock);
|
||||
|
||||
return devt;
|
||||
|
@ -174,8 +174,9 @@ static int crypto_authenc_genicv(struct aead_request *req, u8 *iv,
|
||||
static void crypto_authenc_encrypt_done(struct crypto_async_request *req,
|
||||
int err)
|
||||
{
|
||||
struct aead_request *areq = req->data;
|
||||
|
||||
if (!err) {
|
||||
struct aead_request *areq = req->data;
|
||||
struct crypto_aead *authenc = crypto_aead_reqtfm(areq);
|
||||
struct crypto_authenc_ctx *ctx = crypto_aead_ctx(authenc);
|
||||
struct ablkcipher_request *abreq = aead_request_ctx(areq);
|
||||
@ -185,7 +186,7 @@ static void crypto_authenc_encrypt_done(struct crypto_async_request *req,
|
||||
err = crypto_authenc_genicv(areq, iv, 0);
|
||||
}
|
||||
|
||||
aead_request_complete(req->data, err);
|
||||
aead_request_complete(areq, err);
|
||||
}
|
||||
|
||||
static int crypto_authenc_encrypt(struct aead_request *req)
|
||||
@ -216,14 +217,15 @@ static int crypto_authenc_encrypt(struct aead_request *req)
|
||||
static void crypto_authenc_givencrypt_done(struct crypto_async_request *req,
|
||||
int err)
|
||||
{
|
||||
struct aead_request *areq = req->data;
|
||||
|
||||
if (!err) {
|
||||
struct aead_request *areq = req->data;
|
||||
struct skcipher_givcrypt_request *greq = aead_request_ctx(areq);
|
||||
|
||||
err = crypto_authenc_genicv(areq, greq->giv, 0);
|
||||
}
|
||||
|
||||
aead_request_complete(req->data, err);
|
||||
aead_request_complete(areq, err);
|
||||
}
|
||||
|
||||
static int crypto_authenc_givencrypt(struct aead_givcrypt_request *req)
|
||||
|
@ -486,6 +486,8 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(INTEL, 0x502b), board_ahci }, /* Tolapai */
|
||||
{ PCI_VDEVICE(INTEL, 0x3a05), board_ahci }, /* ICH10 */
|
||||
{ PCI_VDEVICE(INTEL, 0x3a25), board_ahci }, /* ICH10 */
|
||||
{ PCI_VDEVICE(INTEL, 0x3b24), board_ahci }, /* PCH RAID */
|
||||
{ PCI_VDEVICE(INTEL, 0x3b2b), board_ahci }, /* PCH RAID */
|
||||
|
||||
/* JMicron 360/1/3/5/6, match class to avoid IDE function */
|
||||
{ PCI_VENDOR_ID_JMICRON, PCI_ANY_ID, PCI_ANY_ID, PCI_ANY_ID,
|
||||
@ -575,9 +577,9 @@ static const struct pci_device_id ahci_pci_tbl[] = {
|
||||
{ PCI_VDEVICE(NVIDIA, 0x0bc7), board_ahci }, /* MCP7B */
|
||||
|
||||
/* SiS */
|
||||
{ PCI_VDEVICE(SI, 0x1184), board_ahci_nopmp }, /* SiS 966 */
|
||||
{ PCI_VDEVICE(SI, 0x1185), board_ahci_nopmp }, /* SiS 968 */
|
||||
{ PCI_VDEVICE(SI, 0x0186), board_ahci_nopmp }, /* SiS 968 */
|
||||
{ PCI_VDEVICE(SI, 0x1184), board_ahci }, /* SiS 966 */
|
||||
{ PCI_VDEVICE(SI, 0x1185), board_ahci }, /* SiS 968 */
|
||||
{ PCI_VDEVICE(SI, 0x0186), board_ahci }, /* SiS 968 */
|
||||
|
||||
/* Marvell */
|
||||
{ PCI_VDEVICE(MARVELL, 0x6145), board_ahci_mv }, /* 6145 */
|
||||
|
@ -275,6 +275,14 @@ static const struct pci_device_id piix_pci_tbl[] = {
|
||||
{ 0x8086, 0x3a20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
|
||||
/* SATA Controller IDE (ICH10) */
|
||||
{ 0x8086, 0x3a26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
|
||||
/* SATA Controller IDE (PCH) */
|
||||
{ 0x8086, 0x3b20, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
|
||||
/* SATA Controller IDE (PCH) */
|
||||
{ 0x8086, 0x3b26, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
|
||||
/* SATA Controller IDE (PCH) */
|
||||
{ 0x8086, 0x3b2d, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_2port_sata },
|
||||
/* SATA Controller IDE (PCH) */
|
||||
{ 0x8086, 0x3b2e, PCI_ANY_ID, PCI_ANY_ID, 0, 0, ich8_sata },
|
||||
|
||||
{ } /* terminate list */
|
||||
};
|
||||
|
@ -104,6 +104,7 @@ struct ata_force_param {
|
||||
unsigned long xfer_mask;
|
||||
unsigned int horkage_on;
|
||||
unsigned int horkage_off;
|
||||
unsigned int lflags;
|
||||
};
|
||||
|
||||
struct ata_force_ent {
|
||||
@ -196,22 +197,23 @@ void ata_force_cbl(struct ata_port *ap)
|
||||
}
|
||||
|
||||
/**
|
||||
* ata_force_spd_limit - force SATA spd limit according to libata.force
|
||||
* ata_force_link_limits - force link limits according to libata.force
|
||||
* @link: ATA link of interest
|
||||
*
|
||||
* Force SATA spd limit according to libata.force and whine about
|
||||
* it. When only the port part is specified (e.g. 1:), the limit
|
||||
* applies to all links connected to both the host link and all
|
||||
* fan-out ports connected via PMP. If the device part is
|
||||
* specified as 0 (e.g. 1.00:), it specifies the first fan-out
|
||||
* link not the host link. Device number 15 always points to the
|
||||
* host link whether PMP is attached or not.
|
||||
* Force link flags and SATA spd limit according to libata.force
|
||||
* and whine about it. When only the port part is specified
|
||||
* (e.g. 1:), the limit applies to all links connected to both
|
||||
* the host link and all fan-out ports connected via PMP. If the
|
||||
* device part is specified as 0 (e.g. 1.00:), it specifies the
|
||||
* first fan-out link not the host link. Device number 15 always
|
||||
* points to the host link whether PMP is attached or not.
|
||||
*
|
||||
* LOCKING:
|
||||
* EH context.
|
||||
*/
|
||||
static void ata_force_spd_limit(struct ata_link *link)
|
||||
static void ata_force_link_limits(struct ata_link *link)
|
||||
{
|
||||
bool did_spd = false;
|
||||
int linkno, i;
|
||||
|
||||
if (ata_is_host_link(link))
|
||||
@ -228,13 +230,22 @@ static void ata_force_spd_limit(struct ata_link *link)
|
||||
if (fe->device != -1 && fe->device != linkno)
|
||||
continue;
|
||||
|
||||
if (!fe->param.spd_limit)
|
||||
continue;
|
||||
/* only honor the first spd limit */
|
||||
if (!did_spd && fe->param.spd_limit) {
|
||||
link->hw_sata_spd_limit = (1 << fe->param.spd_limit) - 1;
|
||||
ata_link_printk(link, KERN_NOTICE,
|
||||
"FORCE: PHY spd limit set to %s\n",
|
||||
fe->param.name);
|
||||
did_spd = true;
|
||||
}
|
||||
|
||||
link->hw_sata_spd_limit = (1 << fe->param.spd_limit) - 1;
|
||||
ata_link_printk(link, KERN_NOTICE,
|
||||
"FORCE: PHY spd limit set to %s\n", fe->param.name);
|
||||
return;
|
||||
/* let lflags stack */
|
||||
if (fe->param.lflags) {
|
||||
link->flags |= fe->param.lflags;
|
||||
ata_link_printk(link, KERN_NOTICE,
|
||||
"FORCE: link flag 0x%x forced -> 0x%x\n",
|
||||
fe->param.lflags, link->flags);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@ -3277,7 +3288,7 @@ int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev)
|
||||
dev->dma_mode = ata_xfer_mask2mode(dma_mask);
|
||||
|
||||
found = 1;
|
||||
if (dev->dma_mode != 0xff)
|
||||
if (ata_dma_enabled(dev))
|
||||
used_dma = 1;
|
||||
}
|
||||
if (!found)
|
||||
@ -3302,7 +3313,7 @@ int ata_do_set_mode(struct ata_link *link, struct ata_device **r_failed_dev)
|
||||
|
||||
/* step 3: set host DMA timings */
|
||||
ata_link_for_each_dev(dev, link) {
|
||||
if (!ata_dev_enabled(dev) || dev->dma_mode == 0xff)
|
||||
if (!ata_dev_enabled(dev) || !ata_dma_enabled(dev))
|
||||
continue;
|
||||
|
||||
dev->xfer_mode = dev->dma_mode;
|
||||
@ -5188,19 +5199,18 @@ void ata_link_init(struct ata_port *ap, struct ata_link *link, int pmp)
|
||||
*/
|
||||
int sata_link_init_spd(struct ata_link *link)
|
||||
{
|
||||
u32 scontrol;
|
||||
u8 spd;
|
||||
int rc;
|
||||
|
||||
rc = sata_scr_read(link, SCR_CONTROL, &scontrol);
|
||||
rc = sata_scr_read(link, SCR_CONTROL, &link->saved_scontrol);
|
||||
if (rc)
|
||||
return rc;
|
||||
|
||||
spd = (scontrol >> 4) & 0xf;
|
||||
spd = (link->saved_scontrol >> 4) & 0xf;
|
||||
if (spd)
|
||||
link->hw_sata_spd_limit &= (1 << spd) - 1;
|
||||
|
||||
ata_force_spd_limit(link);
|
||||
ata_force_link_limits(link);
|
||||
|
||||
link->sata_spd_limit = link->hw_sata_spd_limit;
|
||||
|
||||
@ -5783,9 +5793,10 @@ static void ata_port_detach(struct ata_port *ap)
|
||||
ata_port_wait_eh(ap);
|
||||
|
||||
/* EH is now guaranteed to see UNLOADING - EH context belongs
|
||||
* to us. Disable all existing devices.
|
||||
* to us. Restore SControl and disable all existing devices.
|
||||
*/
|
||||
ata_port_for_each_link(link, ap) {
|
||||
__ata_port_for_each_link(link, ap) {
|
||||
sata_scr_write(link, SCR_CONTROL, link->saved_scontrol);
|
||||
ata_link_for_each_dev(dev, link)
|
||||
ata_dev_disable(dev);
|
||||
}
|
||||
@ -5991,6 +6002,9 @@ static int __init ata_parse_force_one(char **cur,
|
||||
{ "udma133", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 6) },
|
||||
{ "udma/133", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 6) },
|
||||
{ "udma7", .xfer_mask = 1 << (ATA_SHIFT_UDMA + 7) },
|
||||
{ "nohrst", .lflags = ATA_LFLAG_NO_HRST },
|
||||
{ "nosrst", .lflags = ATA_LFLAG_NO_SRST },
|
||||
{ "norst", .lflags = ATA_LFLAG_NO_HRST | ATA_LFLAG_NO_SRST },
|
||||
};
|
||||
char *start = *cur, *p = *cur;
|
||||
char *id, *val, *endp;
|
||||
|
@ -2040,7 +2040,7 @@ static void ata_eh_link_report(struct ata_link *link)
|
||||
}
|
||||
|
||||
if (ehc->i.serror)
|
||||
ata_port_printk(ap, KERN_ERR,
|
||||
ata_link_printk(link, KERN_ERR,
|
||||
"SError: { %s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s%s}\n",
|
||||
ehc->i.serror & SERR_DATA_RECOVERED ? "RecovData " : "",
|
||||
ehc->i.serror & SERR_COMM_RECOVERED ? "RecovComm " : "",
|
||||
@ -2171,18 +2171,12 @@ static int ata_do_reset(struct ata_link *link, ata_reset_fn_t reset,
|
||||
}
|
||||
|
||||
static int ata_eh_followup_srst_needed(struct ata_link *link,
|
||||
int rc, int classify,
|
||||
const unsigned int *classes)
|
||||
int rc, const unsigned int *classes)
|
||||
{
|
||||
if ((link->flags & ATA_LFLAG_NO_SRST) || ata_link_offline(link))
|
||||
return 0;
|
||||
if (rc == -EAGAIN) {
|
||||
if (classify)
|
||||
return 1;
|
||||
rc = 0;
|
||||
}
|
||||
if (rc != 0)
|
||||
return 0;
|
||||
if (rc == -EAGAIN)
|
||||
return 1;
|
||||
if (sata_pmp_supported(link->ap) && ata_is_host_link(link))
|
||||
return 1;
|
||||
return 0;
|
||||
@ -2210,6 +2204,10 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
||||
*/
|
||||
while (ata_eh_reset_timeouts[max_tries] != ULONG_MAX)
|
||||
max_tries++;
|
||||
if (link->flags & ATA_LFLAG_NO_HRST)
|
||||
hardreset = NULL;
|
||||
if (link->flags & ATA_LFLAG_NO_SRST)
|
||||
softreset = NULL;
|
||||
|
||||
now = jiffies;
|
||||
deadline = ata_deadline(ehc->last_reset, ATA_EH_RESET_COOL_DOWN);
|
||||
@ -2247,10 +2245,10 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
||||
ehc->i.action &= ~ATA_EH_RESET;
|
||||
if (hardreset) {
|
||||
reset = hardreset;
|
||||
ehc->i.action = ATA_EH_HARDRESET;
|
||||
ehc->i.action |= ATA_EH_HARDRESET;
|
||||
} else if (softreset) {
|
||||
reset = softreset;
|
||||
ehc->i.action = ATA_EH_SOFTRESET;
|
||||
ehc->i.action |= ATA_EH_SOFTRESET;
|
||||
}
|
||||
|
||||
if (prereset) {
|
||||
@ -2305,9 +2303,11 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
||||
ehc->i.flags |= ATA_EHI_DID_SOFTRESET;
|
||||
|
||||
rc = ata_do_reset(link, reset, classes, deadline);
|
||||
if (rc && rc != -EAGAIN)
|
||||
goto fail;
|
||||
|
||||
if (reset == hardreset &&
|
||||
ata_eh_followup_srst_needed(link, rc, classify, classes)) {
|
||||
ata_eh_followup_srst_needed(link, rc, classes)) {
|
||||
/* okay, let's do follow-up softreset */
|
||||
reset = softreset;
|
||||
|
||||
@ -2322,10 +2322,6 @@ int ata_eh_reset(struct ata_link *link, int classify,
|
||||
ata_eh_about_to_do(link, NULL, ATA_EH_RESET);
|
||||
rc = ata_do_reset(link, reset, classes, deadline);
|
||||
}
|
||||
|
||||
/* -EAGAIN can happen if we skipped followup SRST */
|
||||
if (rc && rc != -EAGAIN)
|
||||
goto fail;
|
||||
} else {
|
||||
if (verbose)
|
||||
ata_link_printk(link, KERN_INFO, "no reset method "
|
||||
|
@ -181,7 +181,7 @@ static unsigned int pacpi_qc_issue(struct ata_queued_cmd *qc)
|
||||
|
||||
if (adev != acpi->last) {
|
||||
pacpi_set_piomode(ap, adev);
|
||||
if (adev->dma_mode)
|
||||
if (ata_dma_enabled(adev))
|
||||
pacpi_set_dmamode(ap, adev);
|
||||
acpi->last = adev;
|
||||
}
|
||||
|
@ -183,7 +183,7 @@ static void atiixp_bmdma_start(struct ata_queued_cmd *qc)
|
||||
u16 tmp16;
|
||||
|
||||
pci_read_config_word(pdev, ATIIXP_IDE_UDMA_CONTROL, &tmp16);
|
||||
if (adev->dma_mode >= XFER_UDMA_0)
|
||||
if (ata_using_udma(adev))
|
||||
tmp16 |= (1 << dn);
|
||||
else
|
||||
tmp16 &= ~(1 << dn);
|
||||
|
@ -149,10 +149,10 @@ static unsigned int cs5530_qc_issue(struct ata_queued_cmd *qc)
|
||||
struct ata_device *prev = ap->private_data;
|
||||
|
||||
/* See if the DMA settings could be wrong */
|
||||
if (adev->dma_mode != 0 && adev != prev && prev != NULL) {
|
||||
if (ata_dma_enabled(adev) && adev != prev && prev != NULL) {
|
||||
/* Maybe, but do the channels match MWDMA/UDMA ? */
|
||||
if ((adev->dma_mode >= XFER_UDMA_0 && prev->dma_mode < XFER_UDMA_0) ||
|
||||
(adev->dma_mode < XFER_UDMA_0 && prev->dma_mode >= XFER_UDMA_0))
|
||||
if ((ata_using_udma(adev) && !ata_using_udma(prev)) ||
|
||||
(ata_using_udma(prev) && !ata_using_udma(adev)))
|
||||
/* Switch the mode bits */
|
||||
cs5530_set_dmamode(ap, adev);
|
||||
}
|
||||
|
@ -606,7 +606,7 @@ static void it821x_display_disk(int n, u8 *buf)
|
||||
{
|
||||
unsigned char id[41];
|
||||
int mode = 0;
|
||||
char *mtype;
|
||||
char *mtype = "";
|
||||
char mbuf[8];
|
||||
char *cbl = "(40 wire cable)";
|
||||
|
||||
|
@ -198,7 +198,7 @@ static unsigned int oldpiix_qc_issue(struct ata_queued_cmd *qc)
|
||||
|
||||
if (adev != ap->private_data) {
|
||||
oldpiix_set_piomode(ap, adev);
|
||||
if (adev->dma_mode)
|
||||
if (ata_dma_enabled(adev))
|
||||
oldpiix_set_dmamode(ap, adev);
|
||||
}
|
||||
return ata_sff_qc_issue(qc);
|
||||
|
@ -167,10 +167,10 @@ static unsigned int sc1200_qc_issue(struct ata_queued_cmd *qc)
|
||||
struct ata_device *prev = ap->private_data;
|
||||
|
||||
/* See if the DMA settings could be wrong */
|
||||
if (adev->dma_mode != 0 && adev != prev && prev != NULL) {
|
||||
if (ata_dma_enabled(adev) && adev != prev && prev != NULL) {
|
||||
/* Maybe, but do the channels match MWDMA/UDMA ? */
|
||||
if ((adev->dma_mode >= XFER_UDMA_0 && prev->dma_mode < XFER_UDMA_0) ||
|
||||
(adev->dma_mode < XFER_UDMA_0 && prev->dma_mode >= XFER_UDMA_0))
|
||||
if ((ata_using_udma(adev) && !ata_using_udma(prev)) ||
|
||||
(ata_using_udma(prev) && !ata_using_udma(adev)))
|
||||
/* Switch the mode bits */
|
||||
sc1200_set_dmamode(ap, adev);
|
||||
}
|
||||
|
@ -324,62 +324,26 @@ static void via_set_dmamode(struct ata_port *ap, struct ata_device *adev)
|
||||
}
|
||||
|
||||
/**
|
||||
* via_ata_sff_tf_load - send taskfile registers to host controller
|
||||
* via_tf_load - send taskfile registers to host controller
|
||||
* @ap: Port to which output is sent
|
||||
* @tf: ATA taskfile register set
|
||||
*
|
||||
* Outputs ATA taskfile to standard ATA host controller.
|
||||
*
|
||||
* Note: This is to fix the internal bug of via chipsets, which
|
||||
* will reset the device register after changing the IEN bit on
|
||||
* ctl register
|
||||
* will reset the device register after changing the IEN bit on
|
||||
* ctl register
|
||||
*/
|
||||
static void via_ata_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
|
||||
static void via_tf_load(struct ata_port *ap, const struct ata_taskfile *tf)
|
||||
{
|
||||
struct ata_ioports *ioaddr = &ap->ioaddr;
|
||||
unsigned int is_addr = tf->flags & ATA_TFLAG_ISADDR;
|
||||
struct ata_taskfile tmp_tf;
|
||||
|
||||
if (tf->ctl != ap->last_ctl) {
|
||||
iowrite8(tf->ctl, ioaddr->ctl_addr);
|
||||
iowrite8(tf->device, ioaddr->device_addr);
|
||||
ap->last_ctl = tf->ctl;
|
||||
ata_wait_idle(ap);
|
||||
if (ap->ctl != ap->last_ctl && !(tf->flags & ATA_TFLAG_DEVICE)) {
|
||||
tmp_tf = *tf;
|
||||
tmp_tf.flags |= ATA_TFLAG_DEVICE;
|
||||
tf = &tmp_tf;
|
||||
}
|
||||
|
||||
if (is_addr && (tf->flags & ATA_TFLAG_LBA48)) {
|
||||
iowrite8(tf->hob_feature, ioaddr->feature_addr);
|
||||
iowrite8(tf->hob_nsect, ioaddr->nsect_addr);
|
||||
iowrite8(tf->hob_lbal, ioaddr->lbal_addr);
|
||||
iowrite8(tf->hob_lbam, ioaddr->lbam_addr);
|
||||
iowrite8(tf->hob_lbah, ioaddr->lbah_addr);
|
||||
VPRINTK("hob: feat 0x%X nsect 0x%X, lba 0x%X 0x%X 0x%X\n",
|
||||
tf->hob_feature,
|
||||
tf->hob_nsect,
|
||||
tf->hob_lbal,
|
||||
tf->hob_lbam,
|
||||
tf->hob_lbah);
|
||||
}
|
||||
|
||||
if (is_addr) {
|
||||
iowrite8(tf->feature, ioaddr->feature_addr);
|
||||
iowrite8(tf->nsect, ioaddr->nsect_addr);
|
||||
iowrite8(tf->lbal, ioaddr->lbal_addr);
|
||||
iowrite8(tf->lbam, ioaddr->lbam_addr);
|
||||
iowrite8(tf->lbah, ioaddr->lbah_addr);
|
||||
VPRINTK("feat 0x%X nsect 0x%X lba 0x%X 0x%X 0x%X\n",
|
||||
tf->feature,
|
||||
tf->nsect,
|
||||
tf->lbal,
|
||||
tf->lbam,
|
||||
tf->lbah);
|
||||
}
|
||||
|
||||
if (tf->flags & ATA_TFLAG_DEVICE) {
|
||||
iowrite8(tf->device, ioaddr->device_addr);
|
||||
VPRINTK("device 0x%X\n", tf->device);
|
||||
}
|
||||
|
||||
ata_wait_idle(ap);
|
||||
ata_sff_tf_load(ap, tf);
|
||||
}
|
||||
|
||||
static struct scsi_host_template via_sht = {
|
||||
@ -392,13 +356,12 @@ static struct ata_port_operations via_port_ops = {
|
||||
.set_piomode = via_set_piomode,
|
||||
.set_dmamode = via_set_dmamode,
|
||||
.prereset = via_pre_reset,
|
||||
.sff_tf_load = via_ata_tf_load,
|
||||
.sff_tf_load = via_tf_load,
|
||||
};
|
||||
|
||||
static struct ata_port_operations via_port_ops_noirq = {
|
||||
.inherits = &via_port_ops,
|
||||
.sff_data_xfer = ata_sff_data_xfer_noirq,
|
||||
.sff_tf_load = via_ata_tf_load,
|
||||
};
|
||||
|
||||
/**
|
||||
|
@ -1134,30 +1134,16 @@ static int mv_qc_defer(struct ata_queued_cmd *qc)
|
||||
if (ap->nr_active_links == 0)
|
||||
return 0;
|
||||
|
||||
if (pp->pp_flags & MV_PP_FLAG_EDMA_EN) {
|
||||
/*
|
||||
* The port is operating in host queuing mode (EDMA).
|
||||
* It can accomodate a new qc if the qc protocol
|
||||
* is compatible with the current host queue mode.
|
||||
*/
|
||||
if (pp->pp_flags & MV_PP_FLAG_NCQ_EN) {
|
||||
/*
|
||||
* The host queue (EDMA) is in NCQ mode.
|
||||
* If the new qc is also an NCQ command,
|
||||
* then allow the new qc.
|
||||
*/
|
||||
if (qc->tf.protocol == ATA_PROT_NCQ)
|
||||
return 0;
|
||||
} else {
|
||||
/*
|
||||
* The host queue (EDMA) is in non-NCQ, DMA mode.
|
||||
* If the new qc is also a non-NCQ, DMA command,
|
||||
* then allow the new qc.
|
||||
*/
|
||||
if (qc->tf.protocol == ATA_PROT_DMA)
|
||||
return 0;
|
||||
}
|
||||
}
|
||||
/*
|
||||
* The port is operating in host queuing mode (EDMA) with NCQ
|
||||
* enabled, allow multiple NCQ commands. EDMA also allows
|
||||
* queueing multiple DMA commands but libata core currently
|
||||
* doesn't allow it.
|
||||
*/
|
||||
if ((pp->pp_flags & MV_PP_FLAG_EDMA_EN) &&
|
||||
(pp->pp_flags & MV_PP_FLAG_NCQ_EN) && ata_is_ncq(qc->tf.protocol))
|
||||
return 0;
|
||||
|
||||
return ATA_DEFER_PORT;
|
||||
}
|
||||
|
||||
@ -3036,7 +3022,8 @@ static int mv_chip_id(struct ata_host *host, unsigned int board_idx)
|
||||
break;
|
||||
case chip_soc:
|
||||
hpriv->ops = &mv_soc_ops;
|
||||
hp_flags |= MV_HP_FLAG_SOC | MV_HP_ERRATA_60X1C0;
|
||||
hp_flags |= MV_HP_FLAG_SOC | MV_HP_GEN_IIE |
|
||||
MV_HP_ERRATA_60X1C0;
|
||||
break;
|
||||
|
||||
default:
|
||||
|
@ -3,7 +3,6 @@
|
||||
*/
|
||||
|
||||
#include <linux/module.h>
|
||||
#include <linux/version.h>
|
||||
#include <linux/kernel.h>
|
||||
#include <linux/skbuff.h>
|
||||
#include <linux/errno.h>
|
||||
|
@ -295,6 +295,12 @@ int class_for_each_device(struct class *class, struct device *start,
|
||||
|
||||
if (!class)
|
||||
return -EINVAL;
|
||||
if (!class->p) {
|
||||
WARN(1, "%s called for class '%s' before it was initialized",
|
||||
__func__, class->name);
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
mutex_lock(&class->p->class_mutex);
|
||||
list_for_each_entry(dev, &class->p->class_devices, node) {
|
||||
if (start) {
|
||||
@ -344,6 +350,11 @@ struct device *class_find_device(struct class *class, struct device *start,
|
||||
|
||||
if (!class)
|
||||
return NULL;
|
||||
if (!class->p) {
|
||||
WARN(1, "%s called for class '%s' before it was initialized",
|
||||
__func__, class->name);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
mutex_lock(&class->p->class_mutex);
|
||||
list_for_each_entry(dev, &class->p->class_devices, node) {
|
||||
|
@ -53,7 +53,7 @@ static inline int device_is_not_partition(struct device *dev)
|
||||
* it is attached to. If it is not attached to a bus either, an empty
|
||||
* string will be returned.
|
||||
*/
|
||||
const char *dev_driver_string(struct device *dev)
|
||||
const char *dev_driver_string(const struct device *dev)
|
||||
{
|
||||
return dev->driver ? dev->driver->name :
|
||||
(dev->bus ? dev->bus->name :
|
||||
@ -541,6 +541,7 @@ void device_initialize(struct device *dev)
|
||||
spin_lock_init(&dev->devres_lock);
|
||||
INIT_LIST_HEAD(&dev->devres_head);
|
||||
device_init_wakeup(dev, 0);
|
||||
device_pm_init(dev);
|
||||
set_dev_node(dev, -1);
|
||||
}
|
||||
|
||||
@ -843,13 +844,19 @@ int device_add(struct device *dev)
|
||||
{
|
||||
struct device *parent = NULL;
|
||||
struct class_interface *class_intf;
|
||||
int error;
|
||||
int error = -EINVAL;
|
||||
|
||||
dev = get_device(dev);
|
||||
if (!dev || !strlen(dev->bus_id)) {
|
||||
error = -EINVAL;
|
||||
goto Done;
|
||||
}
|
||||
if (!dev)
|
||||
goto done;
|
||||
|
||||
/* Temporarily support init_name if it is set.
|
||||
* It will override bus_id for now */
|
||||
if (dev->init_name)
|
||||
dev_set_name(dev, "%s", dev->init_name);
|
||||
|
||||
if (!strlen(dev->bus_id))
|
||||
goto done;
|
||||
|
||||
pr_debug("device: '%s': %s\n", dev->bus_id, __func__);
|
||||
|
||||
@ -897,9 +904,10 @@ int device_add(struct device *dev)
|
||||
error = bus_add_device(dev);
|
||||
if (error)
|
||||
goto BusError;
|
||||
error = device_pm_add(dev);
|
||||
error = dpm_sysfs_add(dev);
|
||||
if (error)
|
||||
goto PMError;
|
||||
goto DPMError;
|
||||
device_pm_add(dev);
|
||||
kobject_uevent(&dev->kobj, KOBJ_ADD);
|
||||
bus_attach_device(dev);
|
||||
if (parent)
|
||||
@ -917,10 +925,10 @@ int device_add(struct device *dev)
|
||||
class_intf->add_dev(dev, class_intf);
|
||||
mutex_unlock(&dev->class->p->class_mutex);
|
||||
}
|
||||
Done:
|
||||
done:
|
||||
put_device(dev);
|
||||
return error;
|
||||
PMError:
|
||||
DPMError:
|
||||
bus_remove_device(dev);
|
||||
BusError:
|
||||
if (dev->bus)
|
||||
@ -944,7 +952,7 @@ int device_add(struct device *dev)
|
||||
cleanup_device_parent(dev);
|
||||
if (parent)
|
||||
put_device(parent);
|
||||
goto Done;
|
||||
goto done;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -1007,6 +1015,7 @@ void device_del(struct device *dev)
|
||||
struct class_interface *class_intf;
|
||||
|
||||
device_pm_remove(dev);
|
||||
dpm_sysfs_remove(dev);
|
||||
if (parent)
|
||||
klist_del(&dev->knode_parent);
|
||||
if (MAJOR(dev->devt)) {
|
||||
|
@ -16,9 +16,6 @@
|
||||
#include <linux/string.h>
|
||||
#include "base.h"
|
||||
|
||||
#define to_dev(node) container_of(node, struct device, driver_list)
|
||||
|
||||
|
||||
static struct device *next_device(struct klist_iter *i)
|
||||
{
|
||||
struct klist_node *n = klist_next(i);
|
||||
|
@ -67,20 +67,16 @@ void device_pm_unlock(void)
|
||||
* device_pm_add - add a device to the list of active devices
|
||||
* @dev: Device to be added to the list
|
||||
*/
|
||||
int device_pm_add(struct device *dev)
|
||||
void device_pm_add(struct device *dev)
|
||||
{
|
||||
int error;
|
||||
|
||||
pr_debug("PM: Adding info for %s:%s\n",
|
||||
dev->bus ? dev->bus->name : "No Bus",
|
||||
kobject_name(&dev->kobj));
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
if (dev->parent) {
|
||||
if (dev->parent->power.status >= DPM_SUSPENDING) {
|
||||
dev_warn(dev, "parent %s is sleeping, will not add\n",
|
||||
if (dev->parent->power.status >= DPM_SUSPENDING)
|
||||
dev_warn(dev, "parent %s should not be sleeping\n",
|
||||
dev->parent->bus_id);
|
||||
WARN_ON(true);
|
||||
}
|
||||
} else if (transition_started) {
|
||||
/*
|
||||
* We refuse to register parentless devices while a PM
|
||||
@ -89,13 +85,9 @@ int device_pm_add(struct device *dev)
|
||||
*/
|
||||
WARN_ON(true);
|
||||
}
|
||||
error = dpm_sysfs_add(dev);
|
||||
if (!error) {
|
||||
dev->power.status = DPM_ON;
|
||||
list_add_tail(&dev->power.entry, &dpm_list);
|
||||
}
|
||||
|
||||
list_add_tail(&dev->power.entry, &dpm_list);
|
||||
mutex_unlock(&dpm_list_mtx);
|
||||
return error;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -110,7 +102,6 @@ void device_pm_remove(struct device *dev)
|
||||
dev->bus ? dev->bus->name : "No Bus",
|
||||
kobject_name(&dev->kobj));
|
||||
mutex_lock(&dpm_list_mtx);
|
||||
dpm_sysfs_remove(dev);
|
||||
list_del_init(&dev->power.entry);
|
||||
mutex_unlock(&dpm_list_mtx);
|
||||
}
|
||||
|
@ -1,3 +1,8 @@
|
||||
static inline void device_pm_init(struct device *dev)
|
||||
{
|
||||
dev->power.status = DPM_ON;
|
||||
}
|
||||
|
||||
#ifdef CONFIG_PM_SLEEP
|
||||
|
||||
/*
|
||||
@ -11,12 +16,12 @@ static inline struct device *to_device(struct list_head *entry)
|
||||
return container_of(entry, struct device, power.entry);
|
||||
}
|
||||
|
||||
extern int device_pm_add(struct device *);
|
||||
extern void device_pm_add(struct device *);
|
||||
extern void device_pm_remove(struct device *);
|
||||
|
||||
#else /* CONFIG_PM_SLEEP */
|
||||
|
||||
static inline int device_pm_add(struct device *dev) { return 0; }
|
||||
static inline void device_pm_add(struct device *dev) {}
|
||||
static inline void device_pm_remove(struct device *dev) {}
|
||||
|
||||
#endif
|
||||
|
@ -571,8 +571,8 @@ out_free:
|
||||
list_del(&brd->brd_list);
|
||||
brd_free(brd);
|
||||
}
|
||||
unregister_blkdev(RAMDISK_MAJOR, "ramdisk");
|
||||
|
||||
unregister_blkdev(RAMDISK_MAJOR, "brd");
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -707,15 +707,15 @@ static int __init nbd_init(void)
|
||||
|
||||
BUILD_BUG_ON(sizeof(struct nbd_request) != 28);
|
||||
|
||||
nbd_dev = kcalloc(nbds_max, sizeof(*nbd_dev), GFP_KERNEL);
|
||||
if (!nbd_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
if (max_part < 0) {
|
||||
printk(KERN_CRIT "nbd: max_part must be >= 0\n");
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
nbd_dev = kcalloc(nbds_max, sizeof(*nbd_dev), GFP_KERNEL);
|
||||
if (!nbd_dev)
|
||||
return -ENOMEM;
|
||||
|
||||
part_shift = 0;
|
||||
if (max_part > 0)
|
||||
part_shift = fls(max_part);
|
||||
@ -779,6 +779,7 @@ out:
|
||||
blk_cleanup_queue(nbd_dev[i].disk->queue);
|
||||
put_disk(nbd_dev[i].disk);
|
||||
}
|
||||
kfree(nbd_dev);
|
||||
return err;
|
||||
}
|
||||
|
||||
@ -795,6 +796,7 @@ static void __exit nbd_cleanup(void)
|
||||
}
|
||||
}
|
||||
unregister_blkdev(NBD_MAJOR, "nbd");
|
||||
kfree(nbd_dev);
|
||||
printk(KERN_INFO "nbd: unregistered device at major %d\n", NBD_MAJOR);
|
||||
}
|
||||
|
||||
|
@ -3,8 +3,8 @@ menu "Bluetooth device drivers"
|
||||
depends on BT
|
||||
|
||||
config BT_HCIUSB
|
||||
tristate "HCI USB driver"
|
||||
depends on USB
|
||||
tristate "HCI USB driver (old version)"
|
||||
depends on USB && BT_HCIBTUSB=n
|
||||
help
|
||||
Bluetooth HCI USB driver.
|
||||
This driver is required if you want to use Bluetooth devices with
|
||||
@ -23,15 +23,13 @@ config BT_HCIUSB_SCO
|
||||
Say Y here to compile support for SCO over HCI USB.
|
||||
|
||||
config BT_HCIBTUSB
|
||||
tristate "HCI USB driver (alternate version)"
|
||||
depends on USB && EXPERIMENTAL && BT_HCIUSB=n
|
||||
tristate "HCI USB driver"
|
||||
depends on USB
|
||||
help
|
||||
Bluetooth HCI USB driver.
|
||||
This driver is required if you want to use Bluetooth devices with
|
||||
USB interface.
|
||||
|
||||
This driver is still experimental and has no SCO support.
|
||||
|
||||
Say Y here to compile support for Bluetooth USB devices into the
|
||||
kernel or say M to compile it as module (btusb).
|
||||
|
||||
|
@ -60,7 +60,7 @@
|
||||
/* ======================== Module parameters ======================== */
|
||||
|
||||
|
||||
MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>, Jose Orlando Pereira <jop@di.uminho.pt>");
|
||||
MODULE_AUTHOR("Marcel Holtmann <marcel@holtmann.org>");
|
||||
MODULE_DESCRIPTION("Bluetooth driver for the 3Com Bluetooth PCMCIA card");
|
||||
MODULE_LICENSE("GPL");
|
||||
MODULE_FIRMWARE("BT3CPCC.bin");
|
||||
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in New Issue
Block a user