Compare commits
575 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 3f4b3b20f4 | |||
| f26a76724b | |||
| 7459f11685 | |||
| 75d67f37ab | |||
| b252c0019c | |||
| 8c40863a24 | |||
| 750e7bd21d | |||
| b6f0ec2f96 | |||
| 5e3604168b | |||
| 73b249403d | |||
| b995290dfc | |||
| 6cb44f13d1 | |||
| 4175e9d6c4 | |||
| 6cfee31902 | |||
| e2ece17ace | |||
| a5a2f494f9 | |||
| 5df11c989c | |||
| b5718645fe | |||
| 2cfb4e5c22 | |||
| 273c20d423 | |||
| 139e7860c9 | |||
| dabd9c99a0 | |||
| 06a9a71ecc | |||
| f9e158428b | |||
| 349409f0cc | |||
| d6bc693499 | |||
| 47cd23fd08 | |||
| 1632fb6031 | |||
| 06b267b55c | |||
| 261d612b2e | |||
| 288733a606 | |||
| 075964ad43 | |||
| 14e84b15bc | |||
| 2ae3680cf8 | |||
| eb49e7c101 | |||
| 338b287562 | |||
| 27b7be99f3 | |||
| 08324b6a29 | |||
| 9bf9c2aa95 | |||
| 4426a123e1 | |||
| 6be5647f79 | |||
| 4386ec707e | |||
| 041b2375a0 | |||
| 1231a3d071 | |||
| 68d5d009e3 | |||
| 0cb90a0f52 | |||
| a7cf47dd84 | |||
| e48cb70003 | |||
| 7b53686e99 | |||
| c85ec339a3 | |||
| 5ef549f260 | |||
| 6e118375b1 | |||
| b3b7b02653 | |||
| aee50f92f5 | |||
| 85115b995d | |||
| 7be431e4a9 | |||
| 65088b82b2 | |||
| cc64dc24b0 | |||
| 9a77650215 | |||
| 51ee89d819 | |||
| fcf3a2fb3c | |||
| c8db5a5fc6 | |||
| dec68ee3f8 | |||
| 6226c22502 | |||
| 4050cecbaf | |||
| 06592e8c1b | |||
| 2e4c9873de | |||
| 88d7d4e4a4 | |||
| ce6e3def61 | |||
| 3516a8a4a7 | |||
| 6deb7d23c3 | |||
| 623376278e | |||
| e8d7adfd8c | |||
| ac42356c79 | |||
| 4826cda9a7 | |||
| 69c59bc6c4 | |||
| 8ab46fc85e | |||
| 315e73b400 | |||
| 5e39bbafe8 | |||
| e34e9e8732 | |||
| 58458d037c | |||
| b174882508 | |||
| a4b6027fff | |||
| 2f5b7338fb | |||
| 9701e4af71 | |||
| 5798b013af | |||
| 8916bd5524 | |||
| 46774e8405 | |||
| 0097478480 | |||
| 58688fc767 | |||
| aef5ebd137 | |||
| bd4789a33a | |||
| 41e2eca62b | |||
| a1be2b5ecb | |||
| c7554566fd | |||
| da42eb9e4a | |||
| 3274092b49 | |||
| cebf41113c | |||
| 808288955e | |||
| 44fb3170ae | |||
| c1dd346c39 | |||
| 203aa5260e | |||
| e6aa5c0ba6 | |||
| 7741374fa2 | |||
| a93a91746f | |||
| 7171d39d21 | |||
| 81fa1b3087 | |||
| 9bda01cc81 | |||
| c3d65b135f | |||
| df9a5f8f94 | |||
| 5fbc730462 | |||
| 9b83c78d64 | |||
| 8c1c1c37c2 | |||
| 0234f05698 | |||
| 37ef0e621b | |||
| aa0eb3474b | |||
| 72633f08ad | |||
| 03fedc5c56 | |||
| 758e4d3da5 | |||
| 527cba8ab2 | |||
| 4651f6ab6b | |||
| b7b3a0104a | |||
| 8003623db5 | |||
| 8f6c3d1a58 | |||
| 8f421627d1 | |||
| 0da0c63e05 | |||
| 8fb548906e | |||
| d2227f84ba | |||
| 2ab9cc5409 | |||
| 1a62497909 | |||
| 4d5845033e | |||
| 0eec53088b | |||
| 60e1345a34 | |||
| 6dc2acf66f | |||
| d8c3ee4541 | |||
| f891ac47c2 | |||
| 4cc383ba35 | |||
| 4a24486839 | |||
| c90fa02e73 | |||
| 85a90ef604 | |||
| aaa9bcd960 | |||
| 156f251f74 | |||
| afd87adacb | |||
| 79246cb059 | |||
| 763fe579c1 | |||
| 017d762758 | |||
| f4df037cf3 | |||
| d14d408060 | |||
| b21abc775d | |||
| a1845875b3 | |||
| 39994fb222 | |||
| 1b22d2ddf4 | |||
| 96dd4ee679 | |||
| ceb484992b | |||
| 1bbe8912e0 | |||
| 8ed3fe820f | |||
| 0cea513e39 | |||
| 4a818b4288 | |||
| f3d763847f | |||
| 2a8e5e8a2d | |||
| 32818d15fe | |||
| 3c40e5e082 | |||
| cadd96ffcc | |||
| 6b6cd603f9 | |||
| 2a66303d51 | |||
| 35c224c3c9 | |||
| c5ffed9245 | |||
| 608951f12d | |||
| 74d54f57ce | |||
| 4f89dcb180 | |||
| 90f91ae159 | |||
| ae9aea55d1 | |||
| 1de504ea25 | |||
| 9016ec4271 | |||
| 555558c5bf | |||
| 9147fbe60a | |||
| ba6aaed5cc | |||
| 29515b215b | |||
| 38358b6185 | |||
| a5c2871665 | |||
| 0a7ea9d5aa | |||
| 42f2560ed6 | |||
| 4733009df6 | |||
| 9d0231c207 | |||
| 7c51cb723a | |||
| 3601bce60f | |||
| 00863fc272 | |||
| b207384ec8 | |||
| 2edcb814b3 | |||
| 852c3a36c2 | |||
| c9353a7b06 | |||
| 884d833e27 | |||
| 03b762ab87 | |||
| f334f74575 | |||
| 23cfecf979 | |||
| 77d04b76d6 | |||
| 90d9b5dce1 | |||
| 422204b779 | |||
| aec14f459c | |||
| 60d08dde8e | |||
| a0cbc2da8e | |||
| 736020248c | |||
| 5f892ebab0 | |||
| 82546bf5cc | |||
| 39141a87c7 | |||
| 07c07e5269 | |||
| 801cb74a25 | |||
| e0de290452 | |||
| 3d794f8723 | |||
| bb937c6a47 | |||
| 838d7aabe2 | |||
| 3039fb27d5 | |||
| ec00c9c49a | |||
| c2db2e264b | |||
| 8f44619e1e | |||
| af2ff52142 | |||
| 6bffce08e4 | |||
| 5c97f5b2d4 | |||
| c1efec8273 | |||
| 57c313f718 | |||
| 294913e9df | |||
| 0bbd5d1b0a | |||
| d99aad98ef | |||
| 915cf0ec84 | |||
| bc5d453eab | |||
| 1cbce5d4ad | |||
| ebb468b38e | |||
| d352f16e64 | |||
| 95db7f1f8d | |||
| 0e14d6b67d | |||
| f467de45d9 | |||
| f4d055fcee | |||
| 1348bc5266 | |||
| 1c7a78d3cf | |||
| d0a77dc1ab | |||
| a7d2576c85 | |||
| d7cd8fc525 | |||
| 61c39c6dcc | |||
| bc7e7c8b24 | |||
| 93636af609 | |||
| a79cee16df | |||
| e9ee45b83b | |||
| ef7dcc8c0f | |||
| 520a5189a6 | |||
| f11e42f520 | |||
| 7b88c23d62 | |||
| 49f4afd3b1 | |||
| fa577fc1c4 | |||
| 6492a0fb92 | |||
| 1a90d01be2 | |||
| c1a4af09ce | |||
| 85f2f3e05e | |||
| 38c8c07ac7 | |||
| 3d1b7976d3 | |||
| 69ac25cd32 | |||
| 97b068a665 | |||
| a390a377bf | |||
| eb10e9cd3a | |||
| 2d0e8c7883 | |||
| e306967621 | |||
| febaacc3a6 | |||
| 43f4a516b2 | |||
| ff91ca433a | |||
| 695cb013a3 | |||
| 26b67a54a3 | |||
| 6341f8928c | |||
| 307a5a187c | |||
| d11fa680b5 | |||
| 3d15bd1a90 | |||
| 97f2f58ea0 | |||
| f51d67a64f | |||
| d483054fe4 | |||
| 9da11afefb | |||
| e7908f7b77 | |||
| 2139363dee | |||
| 061d6b14b3 | |||
| 5e71844e1d | |||
| ff016619c9 | |||
| 3ef7302303 | |||
| a48d135810 | |||
| c1a1e15fd6 | |||
| 49b7e22b82 | |||
| 43904e95ba | |||
| 034089b6f4 | |||
| 3a196fbe26 | |||
| 58f75a56e3 | |||
| 04712489fd | |||
| a4e4a6ee0c | |||
| c85ca4cdfa | |||
| 04c6e8a252 | |||
| f886b09222 | |||
| 7e1a603295 | |||
| 1e7c377772 | |||
| b23a6ba81e | |||
| cb935a3a4f | |||
| d0f03303d8 | |||
| 4f53e64f2e | |||
| ab692dfced | |||
| 02e85499ff | |||
| 76af79f393 | |||
| 61339713b4 | |||
| 2dcce0a318 | |||
| 141936cc59 | |||
| 39fcddc24c | |||
| 63fb153973 | |||
| 69bade053d | |||
| 7b171c58d5 | |||
| 3ae5a60fe9 | |||
| 5e005e788f | |||
| 4a48179074 | |||
| 0155ff5bd1 | |||
| ba8c8553a0 | |||
| 98c7a0b0cb | |||
| 80ffa0316e | |||
| 9bf2add888 | |||
| 377db2f8fb | |||
| bcabae7b18 | |||
| e5efde92dd | |||
| 4704f3edfd | |||
| cb65f39fb5 | |||
| 54652156e5 | |||
| 7596e3d4d2 | |||
| 4f59cc3720 | |||
| 2703165a07 | |||
| 9e13095455 | |||
| 952f4da950 | |||
| a2c82f7bee | |||
| 1cbb248944 | |||
| 7a55df4694 | |||
| 4ac2b6d3cc | |||
| 9f5765fe83 | |||
| ccba7e5de8 | |||
| 543c6a0b0b | |||
| 8df2b7563c | |||
| 2089fa6dd5 | |||
| 28d9b0f6c9 | |||
| e4c86151df | |||
| e8958f4adc | |||
| e64e861c1c | |||
| b70ce05260 | |||
| 6368caf20f | |||
| 093875a49e | |||
| 5e86a6c85f | |||
| 103e53a3d8 | |||
| 48aeab6f55 | |||
| 1fe9bb4495 | |||
| a76f8a0752 | |||
| 119fd91db5 | |||
| b270ee6883 | |||
| d8e13a17cf | |||
| 3f60c1956f | |||
| 95c13665f4 | |||
| 06397403f3 | |||
| baaa4ecd65 | |||
| b26a274f99 | |||
| 3393e255e6 | |||
| ac13bcf69a | |||
| 4ad2f9e91b | |||
| 34793f20e7 | |||
| bfd534c72b | |||
| 33d812de49 | |||
| 61766889e6 | |||
| 5e0ff93a21 | |||
| 3141ec6065 | |||
| e71fe01dba | |||
| 17f3e1fd29 | |||
| 18bcb7e9a3 | |||
| 4046af9883 | |||
| d4c0bb30d1 | |||
| b1cd343b25 | |||
| 26e15e85d0 | |||
| 5d9b4b40f7 | |||
| c7e4489fb8 | |||
| 2c6b180537 | |||
| 64d4ed6a2f | |||
| 1a23579303 | |||
| fde1c2621a | |||
| 427038dfb7 | |||
| 4bc34a5c5c | |||
| 7f7158eb11 | |||
| 78fd753407 | |||
| a79a9da284 | |||
| 11a17e56ac | |||
| 358d013928 | |||
| 92d49a0e29 | |||
| b3bed4ecc4 | |||
| deaac4ba38 | |||
| 406f5c55aa | |||
| 1924fe5874 | |||
| 963f50802b | |||
| ccc10d459b | |||
| 75d26d309c | |||
| 2f46e90c60 | |||
| d8643c8e87 | |||
| f0e6e77be2 | |||
| 3499d6424f | |||
| 4556a6d95a | |||
| 2a4073c2bb | |||
| 671f9c9e2f | |||
| fd7c0921d8 | |||
| 3a508e6e61 | |||
| bd1dc8b105 | |||
| 6ee7663e97 | |||
| bdac3a105a | |||
| 5f4972712d | |||
| 8d73850001 | |||
| afa2f5f83e | |||
| e9651ec2db | |||
| b4a82a0a2e | |||
| ebd11e15ac | |||
| 5869dc3cc7 | |||
| 4043409406 | |||
| a92ad2dcdc | |||
| 8962e9fcab | |||
| 8f3ceefaed | |||
| fe77de3ae1 | |||
| 60dfee83be | |||
| c893fe01b3 | |||
| 8967b2b814 | |||
| 9ce1ae0acd | |||
| b328e18f8b | |||
| b9547c0e2f | |||
| 0726687ca1 | |||
| a591555d5d | |||
| f318322990 | |||
| 45ed93deef | |||
| caa3e3bed0 | |||
| 872f97c4e0 | |||
| f42395415b | |||
| 3991280f95 | |||
| c1f9335c01 | |||
| 2f1bce58c2 | |||
| 4d96a0c102 | |||
| 10f176d299 | |||
| d33310de0d | |||
| 36a7ce632f | |||
| ca4a557300 | |||
| b44d4773ae | |||
| 087a51c4c1 | |||
| 990848a5b6 | |||
| 45bc79a2dc | |||
| 020aef897a | |||
| 00ba434244 | |||
| 13ceb211f7 | |||
| 67285c330d | |||
| 5cb46f3196 | |||
| b4e8ff2994 | |||
| 7e0f9f47b4 | |||
| ae6481331e | |||
| 1f489b2d82 | |||
| 9ba5dc56ab | |||
| 053ae10f55 | |||
| 29ea3528d4 | |||
| 4f62b2e511 | |||
| a8b1c0addb | |||
| 6437ff72d1 | |||
| 4c5ecfd2e1 | |||
| dd96317396 | |||
| 0832fe15fc | |||
| bcf641763c | |||
| b20b30d4d3 | |||
| 336f4a0f50 | |||
| afe62ad1ea | |||
| 802f43594d | |||
| bb9b57cc54 | |||
| 37cd47c536 | |||
| 5b39b6d126 | |||
| 4ed074c646 | |||
| 69b97cf56b | |||
| 172b291a15 | |||
| 6aeb366d6a | |||
| f15be6f6ce | |||
| a6027dbd01 | |||
| 9a9cc2b976 | |||
| 5b781fb93a | |||
| e6e6e8cd34 | |||
| c9bc8b3164 | |||
| 62b2e1674e | |||
| 8bf3ae0e91 | |||
| c656fce141 | |||
| 197d67f122 | |||
| fcf99ac631 | |||
| 40cfe76cac | |||
| 65722fdd70 | |||
| 858452ff41 | |||
| 4483c1f05a | |||
| 45c5b2b95f | |||
| ee1f334f2f | |||
| 312544d8ea | |||
| 7af050182f | |||
| 8caedf258f | |||
| dc106336ae | |||
| 11d4681a71 | |||
| 0a2a71a594 | |||
| c1c3cd99e1 | |||
| 50bc9144d4 | |||
| 73461014f2 | |||
| 51437e46e2 | |||
| 44b39e3bed | |||
| 7462f4ae18 | |||
| 628fc192ad | |||
| 42a50a9815 | |||
| cf3781f0c3 | |||
| 873829e045 | |||
| 8a272277cb | |||
| 246a6b5724 | |||
| 27bdee9ac3 | |||
| 7ca755c00a | |||
| d21e9677f8 | |||
| c2a3399e46 | |||
| 0c7fe97698 | |||
| 6dcb7c2f7d | |||
| ecb40a3ada | |||
| b4133832cf | |||
| 662a1ccf42 | |||
| c3353b061d | |||
| 54e9649c27 | |||
| 634cc98dde | |||
| e2860111ea | |||
| 19800ba524 | |||
| 36a8176166 | |||
| 0fbc846f71 | |||
| 4eb4226e5e | |||
| fc3bd1ff1d | |||
| bf77ff6f97 | |||
| b8ed9e5b8c | |||
| da777f649c | |||
| f9fd8d6232 | |||
| f60d8cd0b0 | |||
| 4a75c21908 | |||
| 25c413ad00 | |||
| d2570fc048 | |||
| 5b511b7833 | |||
| 4781ace0dd | |||
| d2758dc6e9 | |||
| 3ff8999cb9 | |||
| b4868343c4 | |||
| 945d49b38f | |||
| dd857f5b4d | |||
| 966c248e66 | |||
| ab8887268c | |||
| d6b3d54200 | |||
| 30234e2694 | |||
| 9e9f6a20b5 | |||
| 62cf6918d6 | |||
| b71bb82900 | |||
| 7f35a6941c | |||
| 170b209abe | |||
| d1883e7052 | |||
| 32eef9ed02 | |||
| 0558681f02 | |||
| 04e06ee56d | |||
| e75c11aceb | |||
| 88e0281800 | |||
| 673a3083dc | |||
| 0889c17965 | |||
| 688485273b | |||
| 9234152953 | |||
| 0b58bf9909 | |||
| 01b366aa69 | |||
| 585ea9bc67 | |||
| 0d878668d0 | |||
| ddcf85d72f | |||
| 8e04782a06 | |||
| f92fed3f1d | |||
| 67d3bda61b | |||
| 240ecc4a6f | |||
| 618bbbe723 | |||
| dd4f146b63 | |||
| 69236e6011 | |||
| dfedad6119 | |||
| 2289fb57dc | |||
| a5a0cdd640 | |||
| 170797705f | |||
| 13e864be18 |
@ -275,8 +275,8 @@ versions.
|
||||
If no 2.6.x.y kernel is available, then the highest numbered 2.6.x
|
||||
kernel is the current stable kernel.
|
||||
|
||||
2.6.x.y are maintained by the "stable" team <stable@kernel.org>, and are
|
||||
released as needs dictate. The normal release period is approximately
|
||||
2.6.x.y are maintained by the "stable" team <stable@vger.kernel.org>, and
|
||||
are released as needs dictate. The normal release period is approximately
|
||||
two weeks, but it can be longer if there are no pressing problems. A
|
||||
security-related problem, instead, can cause a release to happen almost
|
||||
instantly.
|
||||
|
||||
@ -271,10 +271,10 @@ copies should go to:
|
||||
the linux-kernel list.
|
||||
|
||||
- If you are fixing a bug, think about whether the fix should go into the
|
||||
next stable update. If so, stable@kernel.org should get a copy of the
|
||||
patch. Also add a "Cc: stable@kernel.org" to the tags within the patch
|
||||
itself; that will cause the stable team to get a notification when your
|
||||
fix goes into the mainline.
|
||||
next stable update. If so, stable@vger.kernel.org should get a copy of
|
||||
the patch. Also add a "Cc: stable@vger.kernel.org" to the tags within
|
||||
the patch itself; that will cause the stable team to get a notification
|
||||
when your fix goes into the mainline.
|
||||
|
||||
When selecting recipients for a patch, it is good to have an idea of who
|
||||
you think will eventually accept the patch and get it merged. While it
|
||||
|
||||
@ -7,21 +7,29 @@ Supported chips:
|
||||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
Datasheets:
|
||||
http://www.analog.com/static/imported-files/data_sheets/ADT7408.pdf
|
||||
* IDT TSE2002B3, TS3000B3
|
||||
Prefix: 'tse2002b3', 'ts3000b3'
|
||||
* Atmel AT30TS00
|
||||
Prefix: 'at30ts00'
|
||||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
Datasheets:
|
||||
http://www.idt.com/products/getdoc.cfm?docid=18715691
|
||||
http://www.idt.com/products/getdoc.cfm?docid=18715692
|
||||
http://www.atmel.com/Images/doc8585.pdf
|
||||
* IDT TSE2002B3, TSE2002GB2, TS3000B3, TS3000GB2
|
||||
Prefix: 'tse2002', 'ts3000'
|
||||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
Datasheets:
|
||||
http://www.idt.com/sites/default/files/documents/IDT_TSE2002B3C_DST_20100512_120303152056.pdf
|
||||
http://www.idt.com/sites/default/files/documents/IDT_TSE2002GB2A1_DST_20111107_120303145914.pdf
|
||||
http://www.idt.com/sites/default/files/documents/IDT_TS3000B3A_DST_20101129_120303152013.pdf
|
||||
http://www.idt.com/sites/default/files/documents/IDT_TS3000GB2A1_DST_20111104_120303151012.pdf
|
||||
* Maxim MAX6604
|
||||
Prefix: 'max6604'
|
||||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
Datasheets:
|
||||
http://datasheets.maxim-ic.com/en/ds/MAX6604.pdf
|
||||
* Microchip MCP9805, MCP98242, MCP98243, MCP9843
|
||||
Prefixes: 'mcp9805', 'mcp98242', 'mcp98243', 'mcp9843'
|
||||
* Microchip MCP9804, MCP9805, MCP98242, MCP98243, MCP9843
|
||||
Prefixes: 'mcp9804', 'mcp9805', 'mcp98242', 'mcp98243', 'mcp9843'
|
||||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
Datasheets:
|
||||
http://ww1.microchip.com/downloads/en/DeviceDoc/22203C.pdf
|
||||
http://ww1.microchip.com/downloads/en/DeviceDoc/21977b.pdf
|
||||
http://ww1.microchip.com/downloads/en/DeviceDoc/21996a.pdf
|
||||
http://ww1.microchip.com/downloads/en/DeviceDoc/22153c.pdf
|
||||
@ -48,6 +56,12 @@ Supported chips:
|
||||
Datasheets:
|
||||
http://www.st.com/stonline/products/literature/ds/13447/stts424.pdf
|
||||
http://www.st.com/stonline/products/literature/ds/13448/stts424e02.pdf
|
||||
* ST Microelectronics STTS2002, STTS3000
|
||||
Prefix: 'stts2002', 'stts3000'
|
||||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
Datasheets:
|
||||
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATASHEET/CD00225278.pdf
|
||||
http://www.st.com/internet/com/TECHNICAL_RESOURCES/TECHNICAL_LITERATURE/DATA_BRIEF/CD00270920.pdf
|
||||
* JEDEC JC 42.4 compliant temperature sensor chips
|
||||
Prefix: 'jc42'
|
||||
Addresses scanned: I2C 0x18 - 0x1f
|
||||
|
||||
@ -47,10 +47,11 @@ This allows to filter away annoying devices that talk continuously.
|
||||
|
||||
2. Find which bus connects to the desired device
|
||||
|
||||
Run "cat /proc/bus/usb/devices", and find the T-line which corresponds to
|
||||
the device. Usually you do it by looking for the vendor string. If you have
|
||||
many similar devices, unplug one and compare two /proc/bus/usb/devices outputs.
|
||||
The T-line will have a bus number. Example:
|
||||
Run "cat /sys/kernel/debug/usb/devices", and find the T-line which corresponds
|
||||
to the device. Usually you do it by looking for the vendor string. If you have
|
||||
many similar devices, unplug one and compare the two
|
||||
/sys/kernel/debug/usb/devices outputs. The T-line will have a bus number.
|
||||
Example:
|
||||
|
||||
T: Bus=03 Lev=01 Prnt=01 Port=00 Cnt=01 Dev#= 2 Spd=12 MxCh= 0
|
||||
D: Ver= 1.10 Cls=00(>ifc ) Sub=00 Prot=00 MxPS= 8 #Cfgs= 1
|
||||
@ -58,7 +59,10 @@ P: Vendor=0557 ProdID=2004 Rev= 1.00
|
||||
S: Manufacturer=ATEN
|
||||
S: Product=UC100KM V2.00
|
||||
|
||||
Bus=03 means it's bus 3.
|
||||
"Bus=03" means it's bus 3. Alternatively, you can look at the output from
|
||||
"lsusb" and get the bus number from the appropriate line. Example:
|
||||
|
||||
Bus 003 Device 002: ID 0557:2004 ATEN UC100KM V2.00
|
||||
|
||||
3. Start 'cat'
|
||||
|
||||
|
||||
@ -6258,7 +6258,7 @@ F: arch/alpha/kernel/srm_env.c
|
||||
|
||||
STABLE BRANCH
|
||||
M: Greg Kroah-Hartman <greg@kroah.com>
|
||||
L: stable@kernel.org
|
||||
L: stable@vger.kernel.org
|
||||
S: Maintained
|
||||
|
||||
STAGING SUBSYSTEM
|
||||
|
||||
2
Makefile
2
Makefile
@ -1,6 +1,6 @@
|
||||
VERSION = 3
|
||||
PATCHLEVEL = 2
|
||||
SUBLEVEL = 0
|
||||
SUBLEVEL = 11
|
||||
EXTRAVERSION =
|
||||
NAME = Saber-toothed Squirrel
|
||||
|
||||
|
||||
@ -108,7 +108,7 @@ futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
|
||||
" lda $31,3b-2b(%0)\n"
|
||||
" .previous\n"
|
||||
: "+r"(ret), "=&r"(prev), "=&r"(cmp)
|
||||
: "r"(uaddr), "r"((long)oldval), "r"(newval)
|
||||
: "r"(uaddr), "r"((long)(int)oldval), "r"(newval)
|
||||
: "memory");
|
||||
|
||||
*uval = prev;
|
||||
|
||||
@ -1272,7 +1272,7 @@ config ARM_ERRATA_743622
|
||||
depends on CPU_V7
|
||||
help
|
||||
This option enables the workaround for the 743622 Cortex-A9
|
||||
(r2p0..r2p2) erratum. Under very rare conditions, a faulty
|
||||
(r2p*) erratum. Under very rare conditions, a faulty
|
||||
optimisation in the Cortex-A9 Store Buffer may lead to data
|
||||
corruption. This workaround sets a specific bit in the diagnostic
|
||||
register of the Cortex-A9 which disables the Store Buffer
|
||||
|
||||
@ -1496,12 +1496,13 @@ int pl330_chan_ctrl(void *ch_id, enum pl330_chan_op op)
|
||||
struct pl330_thread *thrd = ch_id;
|
||||
struct pl330_dmac *pl330;
|
||||
unsigned long flags;
|
||||
int ret = 0, active = thrd->req_running;
|
||||
int ret = 0, active;
|
||||
|
||||
if (!thrd || thrd->free || thrd->dmac->state == DYING)
|
||||
return -EINVAL;
|
||||
|
||||
pl330 = thrd->dmac;
|
||||
active = thrd->req_running;
|
||||
|
||||
spin_lock_irqsave(&pl330->lock, flags);
|
||||
|
||||
|
||||
@ -137,6 +137,11 @@
|
||||
disable_irq
|
||||
.endm
|
||||
|
||||
.macro save_and_disable_irqs_notrace, oldcpsr
|
||||
mrs \oldcpsr, cpsr
|
||||
disable_irq_notrace
|
||||
.endm
|
||||
|
||||
/*
|
||||
* Restore interrupt state previously stored in a register. We don't
|
||||
* guarantee that this will preserve the flags.
|
||||
|
||||
@ -125,7 +125,7 @@ int __init armpmu_register(struct arm_pmu *armpmu, char *name, int type);
|
||||
|
||||
u64 armpmu_event_update(struct perf_event *event,
|
||||
struct hw_perf_event *hwc,
|
||||
int idx, int overflow);
|
||||
int idx);
|
||||
|
||||
int armpmu_event_set_period(struct perf_event *event,
|
||||
struct hw_perf_event *hwc,
|
||||
|
||||
@ -187,7 +187,7 @@ armpmu_event_set_period(struct perf_event *event,
|
||||
u64
|
||||
armpmu_event_update(struct perf_event *event,
|
||||
struct hw_perf_event *hwc,
|
||||
int idx, int overflow)
|
||||
int idx)
|
||||
{
|
||||
struct arm_pmu *armpmu = to_arm_pmu(event->pmu);
|
||||
u64 delta, prev_raw_count, new_raw_count;
|
||||
@ -200,13 +200,7 @@ again:
|
||||
new_raw_count) != prev_raw_count)
|
||||
goto again;
|
||||
|
||||
new_raw_count &= armpmu->max_period;
|
||||
prev_raw_count &= armpmu->max_period;
|
||||
|
||||
if (overflow)
|
||||
delta = armpmu->max_period - prev_raw_count + new_raw_count + 1;
|
||||
else
|
||||
delta = new_raw_count - prev_raw_count;
|
||||
delta = (new_raw_count - prev_raw_count) & armpmu->max_period;
|
||||
|
||||
local64_add(delta, &event->count);
|
||||
local64_sub(delta, &hwc->period_left);
|
||||
@ -223,7 +217,7 @@ armpmu_read(struct perf_event *event)
|
||||
if (hwc->idx < 0)
|
||||
return;
|
||||
|
||||
armpmu_event_update(event, hwc, hwc->idx, 0);
|
||||
armpmu_event_update(event, hwc, hwc->idx);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -239,7 +233,7 @@ armpmu_stop(struct perf_event *event, int flags)
|
||||
if (!(hwc->state & PERF_HES_STOPPED)) {
|
||||
armpmu->disable(hwc, hwc->idx);
|
||||
barrier(); /* why? */
|
||||
armpmu_event_update(event, hwc, hwc->idx, 0);
|
||||
armpmu_event_update(event, hwc, hwc->idx);
|
||||
hwc->state |= PERF_HES_STOPPED | PERF_HES_UPTODATE;
|
||||
}
|
||||
}
|
||||
@ -519,7 +513,13 @@ __hw_perf_event_init(struct perf_event *event)
|
||||
hwc->config_base |= (unsigned long)mapping;
|
||||
|
||||
if (!hwc->sample_period) {
|
||||
hwc->sample_period = armpmu->max_period;
|
||||
/*
|
||||
* For non-sampling runs, limit the sample_period to half
|
||||
* of the counter width. That way, the new counter value
|
||||
* is far less likely to overtake the previous one unless
|
||||
* you have some serious IRQ latency issues.
|
||||
*/
|
||||
hwc->sample_period = armpmu->max_period >> 1;
|
||||
hwc->last_period = hwc->sample_period;
|
||||
local64_set(&hwc->period_left, hwc->sample_period);
|
||||
}
|
||||
|
||||
@ -463,23 +463,6 @@ armv6pmu_enable_event(struct hw_perf_event *hwc,
|
||||
raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
|
||||
}
|
||||
|
||||
static int counter_is_active(unsigned long pmcr, int idx)
|
||||
{
|
||||
unsigned long mask = 0;
|
||||
if (idx == ARMV6_CYCLE_COUNTER)
|
||||
mask = ARMV6_PMCR_CCOUNT_IEN;
|
||||
else if (idx == ARMV6_COUNTER0)
|
||||
mask = ARMV6_PMCR_COUNT0_IEN;
|
||||
else if (idx == ARMV6_COUNTER1)
|
||||
mask = ARMV6_PMCR_COUNT1_IEN;
|
||||
|
||||
if (mask)
|
||||
return pmcr & mask;
|
||||
|
||||
WARN_ONCE(1, "invalid counter number (%d)\n", idx);
|
||||
return 0;
|
||||
}
|
||||
|
||||
static irqreturn_t
|
||||
armv6pmu_handle_irq(int irq_num,
|
||||
void *dev)
|
||||
@ -509,7 +492,8 @@ armv6pmu_handle_irq(int irq_num,
|
||||
struct perf_event *event = cpuc->events[idx];
|
||||
struct hw_perf_event *hwc;
|
||||
|
||||
if (!counter_is_active(pmcr, idx))
|
||||
/* Ignore if we don't have an event. */
|
||||
if (!event)
|
||||
continue;
|
||||
|
||||
/*
|
||||
@ -520,7 +504,7 @@ armv6pmu_handle_irq(int irq_num,
|
||||
continue;
|
||||
|
||||
hwc = &event->hw;
|
||||
armpmu_event_update(event, hwc, idx, 1);
|
||||
armpmu_event_update(event, hwc, idx);
|
||||
data.period = event->hw.last_period;
|
||||
if (!armpmu_event_set_period(event, hwc, idx))
|
||||
continue;
|
||||
|
||||
@ -878,6 +878,11 @@ static inline int armv7_pmnc_disable_intens(int idx)
|
||||
|
||||
counter = ARMV7_IDX_TO_COUNTER(idx);
|
||||
asm volatile("mcr p15, 0, %0, c9, c14, 2" : : "r" (BIT(counter)));
|
||||
isb();
|
||||
/* Clear the overflow flag in case an interrupt is pending. */
|
||||
asm volatile("mcr p15, 0, %0, c9, c12, 3" : : "r" (BIT(counter)));
|
||||
isb();
|
||||
|
||||
return idx;
|
||||
}
|
||||
|
||||
@ -1024,6 +1029,10 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)
|
||||
struct perf_event *event = cpuc->events[idx];
|
||||
struct hw_perf_event *hwc;
|
||||
|
||||
/* Ignore if we don't have an event. */
|
||||
if (!event)
|
||||
continue;
|
||||
|
||||
/*
|
||||
* We have a single interrupt for all counters. Check that
|
||||
* each counter has overflowed before we process it.
|
||||
@ -1032,7 +1041,7 @@ static irqreturn_t armv7pmu_handle_irq(int irq_num, void *dev)
|
||||
continue;
|
||||
|
||||
hwc = &event->hw;
|
||||
armpmu_event_update(event, hwc, idx, 1);
|
||||
armpmu_event_update(event, hwc, idx);
|
||||
data.period = event->hw.last_period;
|
||||
if (!armpmu_event_set_period(event, hwc, idx))
|
||||
continue;
|
||||
|
||||
@ -253,11 +253,14 @@ xscale1pmu_handle_irq(int irq_num, void *dev)
|
||||
struct perf_event *event = cpuc->events[idx];
|
||||
struct hw_perf_event *hwc;
|
||||
|
||||
if (!event)
|
||||
continue;
|
||||
|
||||
if (!xscale1_pmnc_counter_has_overflowed(pmnc, idx))
|
||||
continue;
|
||||
|
||||
hwc = &event->hw;
|
||||
armpmu_event_update(event, hwc, idx, 1);
|
||||
armpmu_event_update(event, hwc, idx);
|
||||
data.period = event->hw.last_period;
|
||||
if (!armpmu_event_set_period(event, hwc, idx))
|
||||
continue;
|
||||
@ -590,11 +593,14 @@ xscale2pmu_handle_irq(int irq_num, void *dev)
|
||||
struct perf_event *event = cpuc->events[idx];
|
||||
struct hw_perf_event *hwc;
|
||||
|
||||
if (!xscale2_pmnc_counter_has_overflowed(pmnc, idx))
|
||||
if (!event)
|
||||
continue;
|
||||
|
||||
if (!xscale2_pmnc_counter_has_overflowed(of_flags, idx))
|
||||
continue;
|
||||
|
||||
hwc = &event->hw;
|
||||
armpmu_event_update(event, hwc, idx, 1);
|
||||
armpmu_event_update(event, hwc, idx);
|
||||
data.period = event->hw.last_period;
|
||||
if (!armpmu_event_set_period(event, hwc, idx))
|
||||
continue;
|
||||
@ -661,7 +667,7 @@ xscale2pmu_enable_event(struct hw_perf_event *hwc, int idx)
|
||||
static void
|
||||
xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)
|
||||
{
|
||||
unsigned long flags, ien, evtsel;
|
||||
unsigned long flags, ien, evtsel, of_flags;
|
||||
struct pmu_hw_events *events = cpu_pmu->get_hw_events();
|
||||
|
||||
ien = xscale2pmu_read_int_enable();
|
||||
@ -670,26 +676,31 @@ xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)
|
||||
switch (idx) {
|
||||
case XSCALE_CYCLE_COUNTER:
|
||||
ien &= ~XSCALE2_CCOUNT_INT_EN;
|
||||
of_flags = XSCALE2_CCOUNT_OVERFLOW;
|
||||
break;
|
||||
case XSCALE_COUNTER0:
|
||||
ien &= ~XSCALE2_COUNT0_INT_EN;
|
||||
evtsel &= ~XSCALE2_COUNT0_EVT_MASK;
|
||||
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT0_EVT_SHFT;
|
||||
of_flags = XSCALE2_COUNT0_OVERFLOW;
|
||||
break;
|
||||
case XSCALE_COUNTER1:
|
||||
ien &= ~XSCALE2_COUNT1_INT_EN;
|
||||
evtsel &= ~XSCALE2_COUNT1_EVT_MASK;
|
||||
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT1_EVT_SHFT;
|
||||
of_flags = XSCALE2_COUNT1_OVERFLOW;
|
||||
break;
|
||||
case XSCALE_COUNTER2:
|
||||
ien &= ~XSCALE2_COUNT2_INT_EN;
|
||||
evtsel &= ~XSCALE2_COUNT2_EVT_MASK;
|
||||
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT2_EVT_SHFT;
|
||||
of_flags = XSCALE2_COUNT2_OVERFLOW;
|
||||
break;
|
||||
case XSCALE_COUNTER3:
|
||||
ien &= ~XSCALE2_COUNT3_INT_EN;
|
||||
evtsel &= ~XSCALE2_COUNT3_EVT_MASK;
|
||||
evtsel |= XSCALE_PERFCTR_UNUSED << XSCALE2_COUNT3_EVT_SHFT;
|
||||
of_flags = XSCALE2_COUNT3_OVERFLOW;
|
||||
break;
|
||||
default:
|
||||
WARN_ONCE(1, "invalid counter number (%d)\n", idx);
|
||||
@ -699,6 +710,7 @@ xscale2pmu_disable_event(struct hw_perf_event *hwc, int idx)
|
||||
raw_spin_lock_irqsave(&events->pmu_lock, flags);
|
||||
xscale2pmu_write_event_select(evtsel);
|
||||
xscale2pmu_write_int_enable(ien);
|
||||
xscale2pmu_write_overflow_flags(of_flags);
|
||||
raw_spin_unlock_irqrestore(&events->pmu_lock, flags);
|
||||
}
|
||||
|
||||
|
||||
@ -699,10 +699,13 @@ static int vfp_set(struct task_struct *target,
|
||||
{
|
||||
int ret;
|
||||
struct thread_info *thread = task_thread_info(target);
|
||||
struct vfp_hard_struct new_vfp = thread->vfpstate.hard;
|
||||
struct vfp_hard_struct new_vfp;
|
||||
const size_t user_fpregs_offset = offsetof(struct user_vfp, fpregs);
|
||||
const size_t user_fpscr_offset = offsetof(struct user_vfp, fpscr);
|
||||
|
||||
vfp_sync_hwstate(thread);
|
||||
new_vfp = thread->vfpstate.hard;
|
||||
|
||||
ret = user_regset_copyin(&pos, &count, &kbuf, &ubuf,
|
||||
&new_vfp.fpregs,
|
||||
user_fpregs_offset,
|
||||
@ -723,9 +726,8 @@ static int vfp_set(struct task_struct *target,
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
vfp_sync_hwstate(thread);
|
||||
thread->vfpstate.hard = new_vfp;
|
||||
vfp_flush_hwstate(thread);
|
||||
thread->vfpstate.hard = new_vfp;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -227,6 +227,8 @@ static int restore_vfp_context(struct vfp_sigframe __user *frame)
|
||||
if (magic != VFP_MAGIC || size != VFP_STORAGE_SIZE)
|
||||
return -EINVAL;
|
||||
|
||||
vfp_flush_hwstate(thread);
|
||||
|
||||
/*
|
||||
* Copy the floating point registers. There can be unused
|
||||
* registers see asm/hwcap.h for details.
|
||||
@ -251,9 +253,6 @@ static int restore_vfp_context(struct vfp_sigframe __user *frame)
|
||||
__get_user_error(h->fpinst, &frame->ufp_exc.fpinst, err);
|
||||
__get_user_error(h->fpinst2, &frame->ufp_exc.fpinst2, err);
|
||||
|
||||
if (!err)
|
||||
vfp_flush_hwstate(thread);
|
||||
|
||||
return err ? -EFAULT : 0;
|
||||
}
|
||||
|
||||
|
||||
@ -83,7 +83,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}
|
||||
* USB Device (Gadget)
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#ifdef CONFIG_USB_AT91
|
||||
#if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE)
|
||||
static struct at91_udc_data udc_data;
|
||||
|
||||
static struct resource udc_resources[] = {
|
||||
|
||||
@ -84,7 +84,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}
|
||||
* USB Device (Gadget)
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#ifdef CONFIG_USB_AT91
|
||||
#if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE)
|
||||
static struct at91_udc_data udc_data;
|
||||
|
||||
static struct resource udc_resources[] = {
|
||||
|
||||
@ -87,7 +87,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}
|
||||
* USB Device (Gadget)
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#ifdef CONFIG_USB_AT91
|
||||
#if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE)
|
||||
static struct at91_udc_data udc_data;
|
||||
|
||||
static struct resource udc_resources[] = {
|
||||
|
||||
@ -92,7 +92,7 @@ void __init at91_add_device_usbh(struct at91_usbh_data *data) {}
|
||||
* USB Device (Gadget)
|
||||
* -------------------------------------------------------------------- */
|
||||
|
||||
#ifdef CONFIG_USB_AT91
|
||||
#if defined(CONFIG_USB_AT91) || defined(CONFIG_USB_AT91_MODULE)
|
||||
static struct at91_udc_data udc_data;
|
||||
|
||||
static struct resource udc_resources[] = {
|
||||
|
||||
@ -27,9 +27,12 @@ EXPORT_SYMBOL(at91_soc_initdata);
|
||||
void __init at91rm9200_set_type(int type)
|
||||
{
|
||||
if (type == ARCH_REVISON_9200_PQFP)
|
||||
at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA;
|
||||
else
|
||||
at91_soc_initdata.subtype = AT91_SOC_RM9200_PQFP;
|
||||
else
|
||||
at91_soc_initdata.subtype = AT91_SOC_RM9200_BGA;
|
||||
|
||||
pr_info("AT91: filled in soc subtype: %s\n",
|
||||
at91_get_soc_subtype(&at91_soc_initdata));
|
||||
}
|
||||
|
||||
void __init at91_init_irq_default(void)
|
||||
|
||||
@ -29,6 +29,7 @@
|
||||
#include <asm/mach/arch.h>
|
||||
#include <linux/irq.h>
|
||||
#include <plat/time.h>
|
||||
#include <plat/ehci-orion.h>
|
||||
#include <plat/common.h>
|
||||
#include "common.h"
|
||||
|
||||
@ -72,7 +73,7 @@ void __init dove_map_io(void)
|
||||
void __init dove_ehci0_init(void)
|
||||
{
|
||||
orion_ehci_init(&dove_mbus_dram_info,
|
||||
DOVE_USB0_PHYS_BASE, IRQ_DOVE_USB0);
|
||||
DOVE_USB0_PHYS_BASE, IRQ_DOVE_USB0, EHCI_PHY_NA);
|
||||
}
|
||||
|
||||
/*****************************************************************************
|
||||
|
||||
@ -28,6 +28,7 @@
|
||||
#include <plat/cache-feroceon-l2.h>
|
||||
#include <plat/mvsdio.h>
|
||||
#include <plat/orion_nand.h>
|
||||
#include <plat/ehci-orion.h>
|
||||
#include <plat/common.h>
|
||||
#include <plat/time.h>
|
||||
#include "common.h"
|
||||
@ -74,7 +75,7 @@ void __init kirkwood_ehci_init(void)
|
||||
{
|
||||
kirkwood_clk_ctrl |= CGC_USB0;
|
||||
orion_ehci_init(&kirkwood_mbus_dram_info,
|
||||
USB_PHYS_BASE, IRQ_KIRKWOOD_USB);
|
||||
USB_PHYS_BASE, IRQ_KIRKWOOD_USB, EHCI_PHY_NA);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -31,313 +31,313 @@
|
||||
#define MPP_F6282_MASK MPP( 0, 0x0, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP0_GPIO MPP( 0, 0x0, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP0_NF_IO2 MPP( 0, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP0_SPI_SCn MPP( 0, 0x2, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP0_NF_IO2 MPP( 0, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP0_SPI_SCn MPP( 0, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
|
||||
#define MPP1_GPO MPP( 1, 0x0, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP1_NF_IO3 MPP( 1, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP1_SPI_MOSI MPP( 1, 0x2, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP1_NF_IO3 MPP( 1, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP1_SPI_MOSI MPP( 1, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
|
||||
#define MPP2_GPO MPP( 2, 0x0, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP2_NF_IO4 MPP( 2, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP2_SPI_SCK MPP( 2, 0x2, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP2_NF_IO4 MPP( 2, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP2_SPI_SCK MPP( 2, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
|
||||
#define MPP3_GPO MPP( 3, 0x0, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP3_NF_IO5 MPP( 3, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP3_SPI_MISO MPP( 3, 0x2, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP3_NF_IO5 MPP( 3, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP3_SPI_MISO MPP( 3, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
|
||||
#define MPP4_GPIO MPP( 4, 0x0, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP4_NF_IO6 MPP( 4, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP4_UART0_RXD MPP( 4, 0x2, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP4_SATA1_ACTn MPP( 4, 0x5, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP4_NF_IO6 MPP( 4, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP4_UART0_RXD MPP( 4, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP4_SATA1_ACTn MPP( 4, 0x5, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP4_LCD_VGA_HSYNC MPP( 4, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP4_PTP_CLK MPP( 4, 0xd, 1, 0, 1, 1, 1, 1, 0 )
|
||||
#define MPP4_PTP_CLK MPP( 4, 0xd, 0, 0, 1, 1, 1, 1, 0 )
|
||||
|
||||
#define MPP5_GPO MPP( 5, 0x0, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP5_NF_IO7 MPP( 5, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP5_UART0_TXD MPP( 5, 0x2, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP5_PTP_TRIG_GEN MPP( 5, 0x4, 0, 1, 1, 1, 1, 1, 0 )
|
||||
#define MPP5_SATA0_ACTn MPP( 5, 0x5, 0, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP5_NF_IO7 MPP( 5, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP5_UART0_TXD MPP( 5, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP5_PTP_TRIG_GEN MPP( 5, 0x4, 0, 0, 1, 1, 1, 1, 0 )
|
||||
#define MPP5_SATA0_ACTn MPP( 5, 0x5, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP5_LCD_VGA_VSYNC MPP( 5, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP6_SYSRST_OUTn MPP( 6, 0x1, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP6_SPI_MOSI MPP( 6, 0x2, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP6_PTP_TRIG_GEN MPP( 6, 0x3, 0, 1, 1, 1, 1, 1, 0 )
|
||||
#define MPP6_SYSRST_OUTn MPP( 6, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP6_SPI_MOSI MPP( 6, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP6_PTP_TRIG_GEN MPP( 6, 0x3, 0, 0, 1, 1, 1, 1, 0 )
|
||||
|
||||
#define MPP7_GPO MPP( 7, 0x0, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP7_PEX_RST_OUTn MPP( 7, 0x1, 0, 1, 1, 1, 1, 1, 0 )
|
||||
#define MPP7_SPI_SCn MPP( 7, 0x2, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP7_PTP_TRIG_GEN MPP( 7, 0x3, 0, 1, 1, 1, 1, 1, 0 )
|
||||
#define MPP7_LCD_PWM MPP( 7, 0xb, 0, 1, 0, 0, 0, 0, 1 )
|
||||
#define MPP7_PEX_RST_OUTn MPP( 7, 0x1, 0, 0, 1, 1, 1, 1, 0 )
|
||||
#define MPP7_SPI_SCn MPP( 7, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP7_PTP_TRIG_GEN MPP( 7, 0x3, 0, 0, 1, 1, 1, 1, 0 )
|
||||
#define MPP7_LCD_PWM MPP( 7, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP8_GPIO MPP( 8, 0x0, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP8_TW0_SDA MPP( 8, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP8_UART0_RTS MPP( 8, 0x2, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP8_UART1_RTS MPP( 8, 0x3, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP8_MII0_RXERR MPP( 8, 0x4, 1, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP8_SATA1_PRESENTn MPP( 8, 0x5, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP8_PTP_CLK MPP( 8, 0xc, 1, 0, 1, 1, 1, 1, 0 )
|
||||
#define MPP8_MII0_COL MPP( 8, 0xd, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP8_TW0_SDA MPP( 8, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP8_UART0_RTS MPP( 8, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP8_UART1_RTS MPP( 8, 0x3, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP8_MII0_RXERR MPP( 8, 0x4, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP8_SATA1_PRESENTn MPP( 8, 0x5, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP8_PTP_CLK MPP( 8, 0xc, 0, 0, 1, 1, 1, 1, 0 )
|
||||
#define MPP8_MII0_COL MPP( 8, 0xd, 0, 0, 1, 1, 1, 1, 1 )
|
||||
|
||||
#define MPP9_GPIO MPP( 9, 0x0, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP9_TW0_SCK MPP( 9, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP9_UART0_CTS MPP( 9, 0x2, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP9_UART1_CTS MPP( 9, 0x3, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP9_SATA0_PRESENTn MPP( 9, 0x5, 0, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP9_PTP_EVENT_REQ MPP( 9, 0xc, 1, 0, 1, 1, 1, 1, 0 )
|
||||
#define MPP9_MII0_CRS MPP( 9, 0xd, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP9_TW0_SCK MPP( 9, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP9_UART0_CTS MPP( 9, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP9_UART1_CTS MPP( 9, 0x3, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP9_SATA0_PRESENTn MPP( 9, 0x5, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP9_PTP_EVENT_REQ MPP( 9, 0xc, 0, 0, 1, 1, 1, 1, 0 )
|
||||
#define MPP9_MII0_CRS MPP( 9, 0xd, 0, 0, 1, 1, 1, 1, 1 )
|
||||
|
||||
#define MPP10_GPO MPP( 10, 0x0, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP10_SPI_SCK MPP( 10, 0x2, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP10_UART0_TXD MPP( 10, 0X3, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP10_SATA1_ACTn MPP( 10, 0x5, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP10_PTP_TRIG_GEN MPP( 10, 0xc, 0, 1, 1, 1, 1, 1, 0 )
|
||||
#define MPP10_SPI_SCK MPP( 10, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP10_UART0_TXD MPP( 10, 0X3, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP10_SATA1_ACTn MPP( 10, 0x5, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP10_PTP_TRIG_GEN MPP( 10, 0xc, 0, 0, 1, 1, 1, 1, 0 )
|
||||
|
||||
#define MPP11_GPIO MPP( 11, 0x0, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP11_SPI_MISO MPP( 11, 0x2, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP11_UART0_RXD MPP( 11, 0x3, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP11_PTP_EVENT_REQ MPP( 11, 0x4, 1, 0, 1, 1, 1, 1, 0 )
|
||||
#define MPP11_PTP_TRIG_GEN MPP( 11, 0xc, 0, 1, 1, 1, 1, 1, 0 )
|
||||
#define MPP11_PTP_CLK MPP( 11, 0xd, 1, 0, 1, 1, 1, 1, 0 )
|
||||
#define MPP11_SATA0_ACTn MPP( 11, 0x5, 0, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP11_SPI_MISO MPP( 11, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP11_UART0_RXD MPP( 11, 0x3, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP11_PTP_EVENT_REQ MPP( 11, 0x4, 0, 0, 1, 1, 1, 1, 0 )
|
||||
#define MPP11_PTP_TRIG_GEN MPP( 11, 0xc, 0, 0, 1, 1, 1, 1, 0 )
|
||||
#define MPP11_PTP_CLK MPP( 11, 0xd, 0, 0, 1, 1, 1, 1, 0 )
|
||||
#define MPP11_SATA0_ACTn MPP( 11, 0x5, 0, 0, 0, 1, 1, 1, 1 )
|
||||
|
||||
#define MPP12_GPO MPP( 12, 0x0, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP12_SD_CLK MPP( 12, 0x1, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP12_AU_SPDIF0 MPP( 12, 0xa, 0, 1, 0, 0, 0, 0, 1 )
|
||||
#define MPP12_SPI_MOSI MPP( 12, 0xb, 0, 1, 0, 0, 0, 0, 1 )
|
||||
#define MPP12_TW1_SDA MPP( 12, 0xd, 1, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP12_SD_CLK MPP( 12, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP12_AU_SPDIF0 MPP( 12, 0xa, 0, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP12_SPI_MOSI MPP( 12, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP12_TW1_SDA MPP( 12, 0xd, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP13_GPIO MPP( 13, 0x0, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP13_SD_CMD MPP( 13, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP13_UART1_TXD MPP( 13, 0x3, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP13_AU_SPDIFRMCLK MPP( 13, 0xa, 0, 1, 0, 0, 0, 0, 1 )
|
||||
#define MPP13_LCDPWM MPP( 13, 0xb, 0, 1, 0, 0, 0, 0, 1 )
|
||||
#define MPP13_SD_CMD MPP( 13, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP13_UART1_TXD MPP( 13, 0x3, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP13_AU_SPDIFRMCLK MPP( 13, 0xa, 0, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP13_LCDPWM MPP( 13, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP14_GPIO MPP( 14, 0x0, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP14_SD_D0 MPP( 14, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP14_UART1_RXD MPP( 14, 0x3, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP14_SATA1_PRESENTn MPP( 14, 0x4, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP14_AU_SPDIFI MPP( 14, 0xa, 1, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP14_AU_I2SDI MPP( 14, 0xb, 1, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP14_MII0_COL MPP( 14, 0xd, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP14_SD_D0 MPP( 14, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP14_UART1_RXD MPP( 14, 0x3, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP14_SATA1_PRESENTn MPP( 14, 0x4, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP14_AU_SPDIFI MPP( 14, 0xa, 0, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP14_AU_I2SDI MPP( 14, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP14_MII0_COL MPP( 14, 0xd, 0, 0, 1, 1, 1, 1, 1 )
|
||||
|
||||
#define MPP15_GPIO MPP( 15, 0x0, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP15_SD_D1 MPP( 15, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP15_UART0_RTS MPP( 15, 0x2, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP15_UART1_TXD MPP( 15, 0x3, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP15_SATA0_ACTn MPP( 15, 0x4, 0, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP15_SPI_CSn MPP( 15, 0xb, 0, 1, 0, 0, 0, 0, 1 )
|
||||
#define MPP15_SD_D1 MPP( 15, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP15_UART0_RTS MPP( 15, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP15_UART1_TXD MPP( 15, 0x3, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP15_SATA0_ACTn MPP( 15, 0x4, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP15_SPI_CSn MPP( 15, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP16_GPIO MPP( 16, 0x0, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP16_SD_D2 MPP( 16, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP16_UART0_CTS MPP( 16, 0x2, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP16_UART1_RXD MPP( 16, 0x3, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP16_SATA1_ACTn MPP( 16, 0x4, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP16_LCD_EXT_REF_CLK MPP( 16, 0xb, 1, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP16_MII0_CRS MPP( 16, 0xd, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP16_SD_D2 MPP( 16, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP16_UART0_CTS MPP( 16, 0x2, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP16_UART1_RXD MPP( 16, 0x3, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP16_SATA1_ACTn MPP( 16, 0x4, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP16_LCD_EXT_REF_CLK MPP( 16, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP16_MII0_CRS MPP( 16, 0xd, 0, 0, 1, 1, 1, 1, 1 )
|
||||
|
||||
#define MPP17_GPIO MPP( 17, 0x0, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP17_SD_D3 MPP( 17, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP17_SATA0_PRESENTn MPP( 17, 0x4, 0, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP17_SATA1_ACTn MPP( 17, 0xa, 0, 1, 0, 0, 0, 0, 1 )
|
||||
#define MPP17_TW1_SCK MPP( 17, 0xd, 1, 1, 0, 0, 0, 0, 1 )
|
||||
#define MPP17_SD_D3 MPP( 17, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP17_SATA0_PRESENTn MPP( 17, 0x4, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP17_SATA1_ACTn MPP( 17, 0xa, 0, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP17_TW1_SCK MPP( 17, 0xd, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP18_GPO MPP( 18, 0x0, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP18_NF_IO0 MPP( 18, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP18_PEX0_CLKREQ MPP( 18, 0x2, 0, 1, 0, 0, 0, 0, 1 )
|
||||
#define MPP18_NF_IO0 MPP( 18, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP18_PEX0_CLKREQ MPP( 18, 0x2, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP19_GPO MPP( 19, 0x0, 0, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP19_NF_IO1 MPP( 19, 0x1, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP19_NF_IO1 MPP( 19, 0x1, 0, 0, 1, 1, 1, 1, 1 )
|
||||
|
||||
#define MPP20_GPIO MPP( 20, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP20_TSMP0 MPP( 20, 0x1, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP20_TDM_CH0_TX_QL MPP( 20, 0x2, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP20_TSMP0 MPP( 20, 0x1, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP20_TDM_CH0_TX_QL MPP( 20, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP20_GE1_TXD0 MPP( 20, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP20_AU_SPDIFI MPP( 20, 0x4, 1, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP20_SATA1_ACTn MPP( 20, 0x5, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP20_AU_SPDIFI MPP( 20, 0x4, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP20_SATA1_ACTn MPP( 20, 0x5, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP20_LCD_D0 MPP( 20, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP21_GPIO MPP( 21, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP21_TSMP1 MPP( 21, 0x1, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP21_TDM_CH0_RX_QL MPP( 21, 0x2, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP21_TSMP1 MPP( 21, 0x1, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP21_TDM_CH0_RX_QL MPP( 21, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP21_GE1_TXD1 MPP( 21, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP21_AU_SPDIFO MPP( 21, 0x4, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP21_SATA0_ACTn MPP( 21, 0x5, 0, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP21_AU_SPDIFO MPP( 21, 0x4, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP21_SATA0_ACTn MPP( 21, 0x5, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP21_LCD_D1 MPP( 21, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP22_GPIO MPP( 22, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP22_TSMP2 MPP( 22, 0x1, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP22_TDM_CH2_TX_QL MPP( 22, 0x2, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP22_TSMP2 MPP( 22, 0x1, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP22_TDM_CH2_TX_QL MPP( 22, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP22_GE1_TXD2 MPP( 22, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP22_AU_SPDIFRMKCLK MPP( 22, 0x4, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP22_SATA1_PRESENTn MPP( 22, 0x5, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP22_AU_SPDIFRMKCLK MPP( 22, 0x4, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP22_SATA1_PRESENTn MPP( 22, 0x5, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP22_LCD_D2 MPP( 22, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP23_GPIO MPP( 23, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP23_TSMP3 MPP( 23, 0x1, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP23_TDM_CH2_RX_QL MPP( 23, 0x2, 1, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP23_TSMP3 MPP( 23, 0x1, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP23_TDM_CH2_RX_QL MPP( 23, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP23_GE1_TXD3 MPP( 23, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP23_AU_I2SBCLK MPP( 23, 0x4, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP23_SATA0_PRESENTn MPP( 23, 0x5, 0, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP23_AU_I2SBCLK MPP( 23, 0x4, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP23_SATA0_PRESENTn MPP( 23, 0x5, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP23_LCD_D3 MPP( 23, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP24_GPIO MPP( 24, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP24_TSMP4 MPP( 24, 0x1, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP24_TDM_SPI_CS0 MPP( 24, 0x2, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP24_TSMP4 MPP( 24, 0x1, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP24_TDM_SPI_CS0 MPP( 24, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP24_GE1_RXD0 MPP( 24, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP24_AU_I2SDO MPP( 24, 0x4, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP24_AU_I2SDO MPP( 24, 0x4, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP24_LCD_D4 MPP( 24, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP25_GPIO MPP( 25, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP25_TSMP5 MPP( 25, 0x1, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP25_TDM_SPI_SCK MPP( 25, 0x2, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP25_TSMP5 MPP( 25, 0x1, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP25_TDM_SPI_SCK MPP( 25, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP25_GE1_RXD1 MPP( 25, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP25_AU_I2SLRCLK MPP( 25, 0x4, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP25_AU_I2SLRCLK MPP( 25, 0x4, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP25_LCD_D5 MPP( 25, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP26_GPIO MPP( 26, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP26_TSMP6 MPP( 26, 0x1, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP26_TDM_SPI_MISO MPP( 26, 0x2, 1, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP26_TSMP6 MPP( 26, 0x1, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP26_TDM_SPI_MISO MPP( 26, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP26_GE1_RXD2 MPP( 26, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP26_AU_I2SMCLK MPP( 26, 0x4, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP26_AU_I2SMCLK MPP( 26, 0x4, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP26_LCD_D6 MPP( 26, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP27_GPIO MPP( 27, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP27_TSMP7 MPP( 27, 0x1, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP27_TDM_SPI_MOSI MPP( 27, 0x2, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP27_TSMP7 MPP( 27, 0x1, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP27_TDM_SPI_MOSI MPP( 27, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP27_GE1_RXD3 MPP( 27, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP27_AU_I2SDI MPP( 27, 0x4, 1, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP27_AU_I2SDI MPP( 27, 0x4, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP27_LCD_D7 MPP( 27, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP28_GPIO MPP( 28, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP28_TSMP8 MPP( 28, 0x1, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP28_TSMP8 MPP( 28, 0x1, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP28_TDM_CODEC_INTn MPP( 28, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP28_GE1_COL MPP( 28, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP28_AU_EXTCLK MPP( 28, 0x4, 1, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP28_AU_EXTCLK MPP( 28, 0x4, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP28_LCD_D8 MPP( 28, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP29_GPIO MPP( 29, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP29_TSMP9 MPP( 29, 0x1, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP29_TSMP9 MPP( 29, 0x1, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP29_TDM_CODEC_RSTn MPP( 29, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP29_GE1_TCLK MPP( 29, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP29_LCD_D9 MPP( 29, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP30_GPIO MPP( 30, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP30_TSMP10 MPP( 30, 0x1, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP30_TDM_PCLK MPP( 30, 0x2, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP30_TSMP10 MPP( 30, 0x1, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP30_TDM_PCLK MPP( 30, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP30_GE1_RXCTL MPP( 30, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP30_LCD_D10 MPP( 30, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP31_GPIO MPP( 31, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP31_TSMP11 MPP( 31, 0x1, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP31_TDM_FS MPP( 31, 0x2, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP31_TSMP11 MPP( 31, 0x1, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP31_TDM_FS MPP( 31, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP31_GE1_RXCLK MPP( 31, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP31_LCD_D11 MPP( 31, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP32_GPIO MPP( 32, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP32_TSMP12 MPP( 32, 0x1, 1, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP32_TDM_DRX MPP( 32, 0x2, 1, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP32_TSMP12 MPP( 32, 0x1, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP32_TDM_DRX MPP( 32, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP32_GE1_TCLKOUT MPP( 32, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP32_LCD_D12 MPP( 32, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP33_GPO MPP( 33, 0x0, 0, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP33_TDM_DTX MPP( 33, 0x2, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP33_TDM_DTX MPP( 33, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP33_GE1_TXCTL MPP( 33, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP33_LCD_D13 MPP( 33, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP34_GPIO MPP( 34, 0x0, 1, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP34_TDM_SPI_CS1 MPP( 34, 0x2, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP34_TDM_SPI_CS1 MPP( 34, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP34_GE1_TXEN MPP( 34, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP34_SATA1_ACTn MPP( 34, 0x5, 0, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP34_SATA1_ACTn MPP( 34, 0x5, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP34_LCD_D14 MPP( 34, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP35_GPIO MPP( 35, 0x0, 1, 1, 1, 1, 1, 1, 1 )
|
||||
#define MPP35_TDM_CH0_TX_QL MPP( 35, 0x2, 0, 1, 0, 0, 1, 1, 1 )
|
||||
#define MPP35_TDM_CH0_TX_QL MPP( 35, 0x2, 0, 0, 0, 0, 1, 1, 1 )
|
||||
#define MPP35_GE1_RXERR MPP( 35, 0x3, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP35_SATA0_ACTn MPP( 35, 0x5, 0, 1, 0, 1, 1, 1, 1 )
|
||||
#define MPP35_SATA0_ACTn MPP( 35, 0x5, 0, 0, 0, 1, 1, 1, 1 )
|
||||
#define MPP35_LCD_D15 MPP( 22, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP35_MII0_RXERR MPP( 35, 0xc, 1, 0, 1, 1, 1, 1, 1 )
|
||||
#define MPP35_MII0_RXERR MPP( 35, 0xc, 0, 0, 1, 1, 1, 1, 1 )
|
||||
|
||||
#define MPP36_GPIO MPP( 36, 0x0, 1, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP36_TSMP0 MPP( 36, 0x1, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP36_TDM_SPI_CS1 MPP( 36, 0x2, 0, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP36_AU_SPDIFI MPP( 36, 0x4, 1, 0, 1, 0, 0, 1, 1 )
|
||||
#define MPP36_TW1_SDA MPP( 36, 0xb, 1, 1, 0, 0, 0, 0, 1 )
|
||||
#define MPP36_TSMP0 MPP( 36, 0x1, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP36_TDM_SPI_CS1 MPP( 36, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP36_AU_SPDIFI MPP( 36, 0x4, 0, 0, 1, 0, 0, 1, 1 )
|
||||
#define MPP36_TW1_SDA MPP( 36, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP37_GPIO MPP( 37, 0x0, 1, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP37_TSMP1 MPP( 37, 0x1, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP37_TDM_CH2_TX_QL MPP( 37, 0x2, 0, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP37_AU_SPDIFO MPP( 37, 0x4, 0, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP37_TW1_SCK MPP( 37, 0xb, 1, 1, 0, 0, 0, 0, 1 )
|
||||
#define MPP37_TSMP1 MPP( 37, 0x1, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP37_TDM_CH2_TX_QL MPP( 37, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP37_AU_SPDIFO MPP( 37, 0x4, 0, 0, 1, 0, 0, 1, 1 )
|
||||
#define MPP37_TW1_SCK MPP( 37, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP38_GPIO MPP( 38, 0x0, 1, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP38_TSMP2 MPP( 38, 0x1, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP38_TDM_CH2_RX_QL MPP( 38, 0x2, 0, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP38_AU_SPDIFRMLCLK MPP( 38, 0x4, 0, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP38_TSMP2 MPP( 38, 0x1, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP38_TDM_CH2_RX_QL MPP( 38, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP38_AU_SPDIFRMLCLK MPP( 38, 0x4, 0, 0, 1, 0, 0, 1, 1 )
|
||||
#define MPP38_LCD_D18 MPP( 38, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP39_GPIO MPP( 39, 0x0, 1, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP39_TSMP3 MPP( 39, 0x1, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP39_TDM_SPI_CS0 MPP( 39, 0x2, 0, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP39_AU_I2SBCLK MPP( 39, 0x4, 0, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP39_TSMP3 MPP( 39, 0x1, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP39_TDM_SPI_CS0 MPP( 39, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP39_AU_I2SBCLK MPP( 39, 0x4, 0, 0, 1, 0, 0, 1, 1 )
|
||||
#define MPP39_LCD_D19 MPP( 39, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP40_GPIO MPP( 40, 0x0, 1, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP40_TSMP4 MPP( 40, 0x1, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP40_TDM_SPI_SCK MPP( 40, 0x2, 0, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP40_AU_I2SDO MPP( 40, 0x4, 0, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP40_TSMP4 MPP( 40, 0x1, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP40_TDM_SPI_SCK MPP( 40, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP40_AU_I2SDO MPP( 40, 0x4, 0, 0, 1, 0, 0, 1, 1 )
|
||||
#define MPP40_LCD_D20 MPP( 40, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP41_GPIO MPP( 41, 0x0, 1, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP41_TSMP5 MPP( 41, 0x1, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP41_TDM_SPI_MISO MPP( 41, 0x2, 1, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP41_AU_I2SLRCLK MPP( 41, 0x4, 0, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP41_TSMP5 MPP( 41, 0x1, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP41_TDM_SPI_MISO MPP( 41, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP41_AU_I2SLRCLK MPP( 41, 0x4, 0, 0, 1, 0, 0, 1, 1 )
|
||||
#define MPP41_LCD_D21 MPP( 41, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP42_GPIO MPP( 42, 0x0, 1, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP42_TSMP6 MPP( 42, 0x1, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP42_TDM_SPI_MOSI MPP( 42, 0x2, 0, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP42_AU_I2SMCLK MPP( 42, 0x4, 0, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP42_TSMP6 MPP( 42, 0x1, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP42_TDM_SPI_MOSI MPP( 42, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP42_AU_I2SMCLK MPP( 42, 0x4, 0, 0, 1, 0, 0, 1, 1 )
|
||||
#define MPP42_LCD_D22 MPP( 42, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP43_GPIO MPP( 43, 0x0, 1, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP43_TSMP7 MPP( 43, 0x1, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP43_TSMP7 MPP( 43, 0x1, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP43_TDM_CODEC_INTn MPP( 43, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP43_AU_I2SDI MPP( 43, 0x4, 1, 0, 1, 0, 0, 1, 1 )
|
||||
#define MPP43_AU_I2SDI MPP( 43, 0x4, 0, 0, 1, 0, 0, 1, 1 )
|
||||
#define MPP43_LCD_D23 MPP( 22, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP44_GPIO MPP( 44, 0x0, 1, 1, 1, 0, 0, 1, 1 )
|
||||
#define MPP44_TSMP8 MPP( 44, 0x1, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP44_TSMP8 MPP( 44, 0x1, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP44_TDM_CODEC_RSTn MPP( 44, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP44_AU_EXTCLK MPP( 44, 0x4, 1, 0, 1, 0, 0, 1, 1 )
|
||||
#define MPP44_AU_EXTCLK MPP( 44, 0x4, 0, 0, 1, 0, 0, 1, 1 )
|
||||
#define MPP44_LCD_CLK MPP( 44, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP45_GPIO MPP( 45, 0x0, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP45_TSMP9 MPP( 45, 0x1, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP45_TDM_PCLK MPP( 45, 0x2, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP45_TSMP9 MPP( 45, 0x1, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP45_TDM_PCLK MPP( 45, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP245_LCD_E MPP( 45, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP46_GPIO MPP( 46, 0x0, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP46_TSMP10 MPP( 46, 0x1, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP46_TDM_FS MPP( 46, 0x2, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP46_TSMP10 MPP( 46, 0x1, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP46_TDM_FS MPP( 46, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP46_LCD_HSYNC MPP( 46, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP47_GPIO MPP( 47, 0x0, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP47_TSMP11 MPP( 47, 0x1, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP47_TDM_DRX MPP( 47, 0x2, 1, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP47_TSMP11 MPP( 47, 0x1, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP47_TDM_DRX MPP( 47, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP47_LCD_VSYNC MPP( 47, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP48_GPIO MPP( 48, 0x0, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP48_TSMP12 MPP( 48, 0x1, 1, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP48_TDM_DTX MPP( 48, 0x2, 0, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP48_TSMP12 MPP( 48, 0x1, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP48_TDM_DTX MPP( 48, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP48_LCD_D16 MPP( 22, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP49_GPIO MPP( 49, 0x0, 1, 1, 0, 0, 0, 1, 0 )
|
||||
#define MPP49_GPO MPP( 49, 0x0, 0, 1, 0, 0, 0, 0, 1 )
|
||||
#define MPP49_TSMP9 MPP( 49, 0x1, 1, 1, 0, 0, 0, 1, 0 )
|
||||
#define MPP49_TDM_CH0_RX_QL MPP( 49, 0x2, 0, 1, 0, 0, 0, 1, 1 )
|
||||
#define MPP49_PTP_CLK MPP( 49, 0x5, 1, 0, 0, 0, 0, 1, 0 )
|
||||
#define MPP49_PEX0_CLKREQ MPP( 49, 0xa, 0, 1, 0, 0, 0, 0, 1 )
|
||||
#define MPP49_TSMP9 MPP( 49, 0x1, 0, 0, 0, 0, 0, 1, 0 )
|
||||
#define MPP49_TDM_CH0_RX_QL MPP( 49, 0x2, 0, 0, 0, 0, 0, 1, 1 )
|
||||
#define MPP49_PTP_CLK MPP( 49, 0x5, 0, 0, 0, 0, 0, 1, 0 )
|
||||
#define MPP49_PEX0_CLKREQ MPP( 49, 0xa, 0, 0, 0, 0, 0, 0, 1 )
|
||||
#define MPP49_LCD_D17 MPP( 49, 0xb, 0, 0, 0, 0, 0, 0, 1 )
|
||||
|
||||
#define MPP_MAX 49
|
||||
|
||||
@ -61,7 +61,7 @@
|
||||
*/
|
||||
#define IRQ_LPC32XX_JTAG_COMM_TX LPC32XX_SIC1_IRQ(1)
|
||||
#define IRQ_LPC32XX_JTAG_COMM_RX LPC32XX_SIC1_IRQ(2)
|
||||
#define IRQ_LPC32XX_GPI_11 LPC32XX_SIC1_IRQ(4)
|
||||
#define IRQ_LPC32XX_GPI_28 LPC32XX_SIC1_IRQ(4)
|
||||
#define IRQ_LPC32XX_TS_P LPC32XX_SIC1_IRQ(6)
|
||||
#define IRQ_LPC32XX_TS_IRQ LPC32XX_SIC1_IRQ(7)
|
||||
#define IRQ_LPC32XX_TS_AUX LPC32XX_SIC1_IRQ(8)
|
||||
|
||||
@ -118,6 +118,10 @@ static const struct lpc32xx_event_info lpc32xx_events[NR_IRQS] = {
|
||||
.event_group = &lpc32xx_event_pin_regs,
|
||||
.mask = LPC32XX_CLKPWR_EXTSRC_GPI_06_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPI_28] = {
|
||||
.event_group = &lpc32xx_event_pin_regs,
|
||||
.mask = LPC32XX_CLKPWR_EXTSRC_GPI_28_BIT,
|
||||
},
|
||||
[IRQ_LPC32XX_GPIO_00] = {
|
||||
.event_group = &lpc32xx_event_int_regs,
|
||||
.mask = LPC32XX_CLKPWR_INTSRC_GPIO_00_BIT,
|
||||
@ -305,9 +309,18 @@ static int lpc32xx_irq_wake(struct irq_data *d, unsigned int state)
|
||||
|
||||
if (state)
|
||||
eventreg |= lpc32xx_events[d->irq].mask;
|
||||
else
|
||||
else {
|
||||
eventreg &= ~lpc32xx_events[d->irq].mask;
|
||||
|
||||
/*
|
||||
* When disabling the wakeup, clear the latched
|
||||
* event
|
||||
*/
|
||||
__raw_writel(lpc32xx_events[d->irq].mask,
|
||||
lpc32xx_events[d->irq].
|
||||
event_group->rawstat_reg);
|
||||
}
|
||||
|
||||
__raw_writel(eventreg,
|
||||
lpc32xx_events[d->irq].event_group->enab_reg);
|
||||
|
||||
@ -380,13 +393,15 @@ void __init lpc32xx_init_irq(void)
|
||||
|
||||
/* Setup SIC1 */
|
||||
__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC1_BASE));
|
||||
__raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC1_BASE));
|
||||
__raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC1_BASE));
|
||||
__raw_writel(SIC1_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC1_BASE));
|
||||
__raw_writel(SIC1_ATR_DEFAULT,
|
||||
LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC1_BASE));
|
||||
|
||||
/* Setup SIC2 */
|
||||
__raw_writel(0, LPC32XX_INTC_MASK(LPC32XX_SIC2_BASE));
|
||||
__raw_writel(MIC_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC2_BASE));
|
||||
__raw_writel(MIC_ATR_DEFAULT, LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC2_BASE));
|
||||
__raw_writel(SIC2_APR_DEFAULT, LPC32XX_INTC_POLAR(LPC32XX_SIC2_BASE));
|
||||
__raw_writel(SIC2_ATR_DEFAULT,
|
||||
LPC32XX_INTC_ACT_TYPE(LPC32XX_SIC2_BASE));
|
||||
|
||||
/* Configure supported IRQ's */
|
||||
for (i = 0; i < NR_IRQS; i++) {
|
||||
|
||||
@ -88,6 +88,7 @@ struct uartinit {
|
||||
char *uart_ck_name;
|
||||
u32 ck_mode_mask;
|
||||
void __iomem *pdiv_clk_reg;
|
||||
resource_size_t mapbase;
|
||||
};
|
||||
|
||||
static struct uartinit uartinit_data[] __initdata = {
|
||||
@ -97,6 +98,7 @@ static struct uartinit uartinit_data[] __initdata = {
|
||||
.ck_mode_mask =
|
||||
LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 5),
|
||||
.pdiv_clk_reg = LPC32XX_CLKPWR_UART5_CLK_CTRL,
|
||||
.mapbase = LPC32XX_UART5_BASE,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_LPC32XX_UART3_SELECT
|
||||
@ -105,6 +107,7 @@ static struct uartinit uartinit_data[] __initdata = {
|
||||
.ck_mode_mask =
|
||||
LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 3),
|
||||
.pdiv_clk_reg = LPC32XX_CLKPWR_UART3_CLK_CTRL,
|
||||
.mapbase = LPC32XX_UART3_BASE,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_LPC32XX_UART4_SELECT
|
||||
@ -113,6 +116,7 @@ static struct uartinit uartinit_data[] __initdata = {
|
||||
.ck_mode_mask =
|
||||
LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 4),
|
||||
.pdiv_clk_reg = LPC32XX_CLKPWR_UART4_CLK_CTRL,
|
||||
.mapbase = LPC32XX_UART4_BASE,
|
||||
},
|
||||
#endif
|
||||
#ifdef CONFIG_ARCH_LPC32XX_UART6_SELECT
|
||||
@ -121,6 +125,7 @@ static struct uartinit uartinit_data[] __initdata = {
|
||||
.ck_mode_mask =
|
||||
LPC32XX_UART_CLKMODE_LOAD(LPC32XX_UART_CLKMODE_ON, 6),
|
||||
.pdiv_clk_reg = LPC32XX_CLKPWR_UART6_CLK_CTRL,
|
||||
.mapbase = LPC32XX_UART6_BASE,
|
||||
},
|
||||
#endif
|
||||
};
|
||||
@ -165,11 +170,24 @@ void __init lpc32xx_serial_init(void)
|
||||
|
||||
/* pre-UART clock divider set to 1 */
|
||||
__raw_writel(0x0101, uartinit_data[i].pdiv_clk_reg);
|
||||
|
||||
/*
|
||||
* Force a flush of the RX FIFOs to work around a
|
||||
* HW bug
|
||||
*/
|
||||
puart = uartinit_data[i].mapbase;
|
||||
__raw_writel(0xC1, LPC32XX_UART_IIR_FCR(puart));
|
||||
__raw_writel(0x00, LPC32XX_UART_DLL_FIFO(puart));
|
||||
j = LPC32XX_SUART_FIFO_SIZE;
|
||||
while (j--)
|
||||
tmp = __raw_readl(
|
||||
LPC32XX_UART_DLL_FIFO(puart));
|
||||
__raw_writel(0, LPC32XX_UART_IIR_FCR(puart));
|
||||
}
|
||||
|
||||
/* This needs to be done after all UART clocks are setup */
|
||||
__raw_writel(clkmodes, LPC32XX_UARTCTL_CLKMODE);
|
||||
for (i = 0; i < ARRAY_SIZE(uartinit_data) - 1; i++) {
|
||||
for (i = 0; i < ARRAY_SIZE(uartinit_data); i++) {
|
||||
/* Force a flush of the RX FIFOs to work around a HW bug */
|
||||
puart = serial_std_platform_data[i].mapbase;
|
||||
__raw_writel(0xC1, LPC32XX_UART_IIR_FCR(puart));
|
||||
|
||||
@ -20,6 +20,7 @@
|
||||
#include <mach/mv78xx0.h>
|
||||
#include <mach/bridge-regs.h>
|
||||
#include <plat/cache-feroceon-l2.h>
|
||||
#include <plat/ehci-orion.h>
|
||||
#include <plat/orion_nand.h>
|
||||
#include <plat/time.h>
|
||||
#include <plat/common.h>
|
||||
@ -170,7 +171,7 @@ void __init mv78xx0_map_io(void)
|
||||
void __init mv78xx0_ehci0_init(void)
|
||||
{
|
||||
orion_ehci_init(&mv78xx0_mbus_dram_info,
|
||||
USB0_PHYS_BASE, IRQ_MV78XX0_USB_0);
|
||||
USB0_PHYS_BASE, IRQ_MV78XX0_USB_0, EHCI_PHY_NA);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -24,296 +24,296 @@
|
||||
#define MPP_78100_A0_MASK MPP(0, 0x0, 0, 0, 1)
|
||||
|
||||
#define MPP0_GPIO MPP(0, 0x0, 1, 1, 1)
|
||||
#define MPP0_GE0_COL MPP(0, 0x1, 1, 0, 1)
|
||||
#define MPP0_GE1_TXCLK MPP(0, 0x2, 0, 1, 1)
|
||||
#define MPP0_GE0_COL MPP(0, 0x1, 0, 0, 1)
|
||||
#define MPP0_GE1_TXCLK MPP(0, 0x2, 0, 0, 1)
|
||||
#define MPP0_UNUSED MPP(0, 0x3, 0, 0, 1)
|
||||
|
||||
#define MPP1_GPIO MPP(1, 0x0, 1, 1, 1)
|
||||
#define MPP1_GE0_RXERR MPP(1, 0x1, 1, 0, 1)
|
||||
#define MPP1_GE1_TXCTL MPP(1, 0x2, 0, 1, 1)
|
||||
#define MPP1_GE0_RXERR MPP(1, 0x1, 0, 0, 1)
|
||||
#define MPP1_GE1_TXCTL MPP(1, 0x2, 0, 0, 1)
|
||||
#define MPP1_UNUSED MPP(1, 0x3, 0, 0, 1)
|
||||
|
||||
#define MPP2_GPIO MPP(2, 0x0, 1, 1, 1)
|
||||
#define MPP2_GE0_CRS MPP(2, 0x1, 1, 0, 1)
|
||||
#define MPP2_GE1_RXCTL MPP(2, 0x2, 1, 0, 1)
|
||||
#define MPP2_GE0_CRS MPP(2, 0x1, 0, 0, 1)
|
||||
#define MPP2_GE1_RXCTL MPP(2, 0x2, 0, 0, 1)
|
||||
#define MPP2_UNUSED MPP(2, 0x3, 0, 0, 1)
|
||||
|
||||
#define MPP3_GPIO MPP(3, 0x0, 1, 1, 1)
|
||||
#define MPP3_GE0_TXERR MPP(3, 0x1, 0, 1, 1)
|
||||
#define MPP3_GE1_RXCLK MPP(3, 0x2, 1, 0, 1)
|
||||
#define MPP3_GE0_TXERR MPP(3, 0x1, 0, 0, 1)
|
||||
#define MPP3_GE1_RXCLK MPP(3, 0x2, 0, 0, 1)
|
||||
#define MPP3_UNUSED MPP(3, 0x3, 0, 0, 1)
|
||||
|
||||
#define MPP4_GPIO MPP(4, 0x0, 1, 1, 1)
|
||||
#define MPP4_GE0_TXD4 MPP(4, 0x1, 0, 1, 1)
|
||||
#define MPP4_GE1_TXD0 MPP(4, 0x2, 0, 1, 1)
|
||||
#define MPP4_GE0_TXD4 MPP(4, 0x1, 0, 0, 1)
|
||||
#define MPP4_GE1_TXD0 MPP(4, 0x2, 0, 0, 1)
|
||||
#define MPP4_UNUSED MPP(4, 0x3, 0, 0, 1)
|
||||
|
||||
#define MPP5_GPIO MPP(5, 0x0, 1, 1, 1)
|
||||
#define MPP5_GE0_TXD5 MPP(5, 0x1, 0, 1, 1)
|
||||
#define MPP5_GE1_TXD1 MPP(5, 0x2, 0, 1, 1)
|
||||
#define MPP5_GE0_TXD5 MPP(5, 0x1, 0, 0, 1)
|
||||
#define MPP5_GE1_TXD1 MPP(5, 0x2, 0, 0, 1)
|
||||
#define MPP5_UNUSED MPP(5, 0x3, 0, 0, 1)
|
||||
|
||||
#define MPP6_GPIO MPP(6, 0x0, 1, 1, 1)
|
||||
#define MPP6_GE0_TXD6 MPP(6, 0x1, 0, 1, 1)
|
||||
#define MPP6_GE1_TXD2 MPP(6, 0x2, 0, 1, 1)
|
||||
#define MPP6_GE0_TXD6 MPP(6, 0x1, 0, 0, 1)
|
||||
#define MPP6_GE1_TXD2 MPP(6, 0x2, 0, 0, 1)
|
||||
#define MPP6_UNUSED MPP(6, 0x3, 0, 0, 1)
|
||||
|
||||
#define MPP7_GPIO MPP(7, 0x0, 1, 1, 1)
|
||||
#define MPP7_GE0_TXD7 MPP(7, 0x1, 0, 1, 1)
|
||||
#define MPP7_GE1_TXD3 MPP(7, 0x2, 0, 1, 1)
|
||||
#define MPP7_GE0_TXD7 MPP(7, 0x1, 0, 0, 1)
|
||||
#define MPP7_GE1_TXD3 MPP(7, 0x2, 0, 0, 1)
|
||||
#define MPP7_UNUSED MPP(7, 0x3, 0, 0, 1)
|
||||
|
||||
#define MPP8_GPIO MPP(8, 0x0, 1, 1, 1)
|
||||
#define MPP8_GE0_RXD4 MPP(8, 0x1, 1, 0, 1)
|
||||
#define MPP8_GE1_RXD0 MPP(8, 0x2, 1, 0, 1)
|
||||
#define MPP8_GE0_RXD4 MPP(8, 0x1, 0, 0, 1)
|
||||
#define MPP8_GE1_RXD0 MPP(8, 0x2, 0, 0, 1)
|
||||
#define MPP8_UNUSED MPP(8, 0x3, 0, 0, 1)
|
||||
|
||||
#define MPP9_GPIO MPP(9, 0x0, 1, 1, 1)
|
||||
#define MPP9_GE0_RXD5 MPP(9, 0x1, 1, 0, 1)
|
||||
#define MPP9_GE1_RXD1 MPP(9, 0x2, 1, 0, 1)
|
||||
#define MPP9_GE0_RXD5 MPP(9, 0x1, 0, 0, 1)
|
||||
#define MPP9_GE1_RXD1 MPP(9, 0x2, 0, 0, 1)
|
||||
#define MPP9_UNUSED MPP(9, 0x3, 0, 0, 1)
|
||||
|
||||
#define MPP10_GPIO MPP(10, 0x0, 1, 1, 1)
|
||||
#define MPP10_GE0_RXD6 MPP(10, 0x1, 1, 0, 1)
|
||||
#define MPP10_GE1_RXD2 MPP(10, 0x2, 1, 0, 1)
|
||||
#define MPP10_GE0_RXD6 MPP(10, 0x1, 0, 0, 1)
|
||||
#define MPP10_GE1_RXD2 MPP(10, 0x2, 0, 0, 1)
|
||||
#define MPP10_UNUSED MPP(10, 0x3, 0, 0, 1)
|
||||
|
||||
#define MPP11_GPIO MPP(11, 0x0, 1, 1, 1)
|
||||
#define MPP11_GE0_RXD7 MPP(11, 0x1, 1, 0, 1)
|
||||
#define MPP11_GE1_RXD3 MPP(11, 0x2, 1, 0, 1)
|
||||
#define MPP11_GE0_RXD7 MPP(11, 0x1, 0, 0, 1)
|
||||
#define MPP11_GE1_RXD3 MPP(11, 0x2, 0, 0, 1)
|
||||
#define MPP11_UNUSED MPP(11, 0x3, 0, 0, 1)
|
||||
|
||||
#define MPP12_GPIO MPP(12, 0x0, 1, 1, 1)
|
||||
#define MPP12_M_BB MPP(12, 0x3, 1, 0, 1)
|
||||
#define MPP12_UA0_CTSn MPP(12, 0x4, 1, 0, 1)
|
||||
#define MPP12_NAND_FLASH_REn0 MPP(12, 0x5, 0, 1, 1)
|
||||
#define MPP12_TDM0_SCSn MPP(12, 0X6, 0, 1, 1)
|
||||
#define MPP12_M_BB MPP(12, 0x3, 0, 0, 1)
|
||||
#define MPP12_UA0_CTSn MPP(12, 0x4, 0, 0, 1)
|
||||
#define MPP12_NAND_FLASH_REn0 MPP(12, 0x5, 0, 0, 1)
|
||||
#define MPP12_TDM0_SCSn MPP(12, 0X6, 0, 0, 1)
|
||||
#define MPP12_UNUSED MPP(12, 0x1, 0, 0, 1)
|
||||
|
||||
#define MPP13_GPIO MPP(13, 0x0, 1, 1, 1)
|
||||
#define MPP13_SYSRST_OUTn MPP(13, 0x3, 0, 1, 1)
|
||||
#define MPP13_UA0_RTSn MPP(13, 0x4, 0, 1, 1)
|
||||
#define MPP13_NAN_FLASH_WEn0 MPP(13, 0x5, 0, 1, 1)
|
||||
#define MPP13_TDM_SCLK MPP(13, 0x6, 0, 1, 1)
|
||||
#define MPP13_SYSRST_OUTn MPP(13, 0x3, 0, 0, 1)
|
||||
#define MPP13_UA0_RTSn MPP(13, 0x4, 0, 0, 1)
|
||||
#define MPP13_NAN_FLASH_WEn0 MPP(13, 0x5, 0, 0, 1)
|
||||
#define MPP13_TDM_SCLK MPP(13, 0x6, 0, 0, 1)
|
||||
#define MPP13_UNUSED MPP(13, 0x1, 0, 0, 1)
|
||||
|
||||
#define MPP14_GPIO MPP(14, 0x0, 1, 1, 1)
|
||||
#define MPP14_SATA1_ACTn MPP(14, 0x3, 0, 1, 1)
|
||||
#define MPP14_UA1_CTSn MPP(14, 0x4, 1, 0, 1)
|
||||
#define MPP14_NAND_FLASH_REn1 MPP(14, 0x5, 0, 1, 1)
|
||||
#define MPP14_TDM_SMOSI MPP(14, 0x6, 0, 1, 1)
|
||||
#define MPP14_SATA1_ACTn MPP(14, 0x3, 0, 0, 1)
|
||||
#define MPP14_UA1_CTSn MPP(14, 0x4, 0, 0, 1)
|
||||
#define MPP14_NAND_FLASH_REn1 MPP(14, 0x5, 0, 0, 1)
|
||||
#define MPP14_TDM_SMOSI MPP(14, 0x6, 0, 0, 1)
|
||||
#define MPP14_UNUSED MPP(14, 0x1, 0, 0, 1)
|
||||
|
||||
#define MPP15_GPIO MPP(15, 0x0, 1, 1, 1)
|
||||
#define MPP15_SATA0_ACTn MPP(15, 0x3, 0, 1, 1)
|
||||
#define MPP15_UA1_RTSn MPP(15, 0x4, 0, 1, 1)
|
||||
#define MPP15_NAND_FLASH_WEn1 MPP(15, 0x5, 0, 1, 1)
|
||||
#define MPP15_TDM_SMISO MPP(15, 0x6, 1, 0, 1)
|
||||
#define MPP15_SATA0_ACTn MPP(15, 0x3, 0, 0, 1)
|
||||
#define MPP15_UA1_RTSn MPP(15, 0x4, 0, 0, 1)
|
||||
#define MPP15_NAND_FLASH_WEn1 MPP(15, 0x5, 0, 0, 1)
|
||||
#define MPP15_TDM_SMISO MPP(15, 0x6, 0, 0, 1)
|
||||
#define MPP15_UNUSED MPP(15, 0x1, 0, 0, 1)
|
||||
|
||||
#define MPP16_GPIO MPP(16, 0x0, 1, 1, 1)
|
||||
#define MPP16_SATA1_PRESENTn MPP(16, 0x3, 0, 1, 1)
|
||||
#define MPP16_UA2_TXD MPP(16, 0x4, 0, 1, 1)
|
||||
#define MPP16_NAND_FLASH_REn3 MPP(16, 0x5, 0, 1, 1)
|
||||
#define MPP16_TDM_INTn MPP(16, 0x6, 1, 0, 1)
|
||||
#define MPP16_SATA1_PRESENTn MPP(16, 0x3, 0, 0, 1)
|
||||
#define MPP16_UA2_TXD MPP(16, 0x4, 0, 0, 1)
|
||||
#define MPP16_NAND_FLASH_REn3 MPP(16, 0x5, 0, 0, 1)
|
||||
#define MPP16_TDM_INTn MPP(16, 0x6, 0, 0, 1)
|
||||
#define MPP16_UNUSED MPP(16, 0x1, 0, 0, 1)
|
||||
|
||||
|
||||
#define MPP17_GPIO MPP(17, 0x0, 1, 1, 1)
|
||||
#define MPP17_SATA0_PRESENTn MPP(17, 0x3, 0, 1, 1)
|
||||
#define MPP17_UA2_RXD MPP(17, 0x4, 1, 0, 1)
|
||||
#define MPP17_NAND_FLASH_WEn3 MPP(17, 0x5, 0, 1, 1)
|
||||
#define MPP17_TDM_RSTn MPP(17, 0x6, 0, 1, 1)
|
||||
#define MPP17_SATA0_PRESENTn MPP(17, 0x3, 0, 0, 1)
|
||||
#define MPP17_UA2_RXD MPP(17, 0x4, 0, 0, 1)
|
||||
#define MPP17_NAND_FLASH_WEn3 MPP(17, 0x5, 0, 0, 1)
|
||||
#define MPP17_TDM_RSTn MPP(17, 0x6, 0, 0, 1)
|
||||
#define MPP17_UNUSED MPP(17, 0x1, 0, 0, 1)
|
||||
|
||||
|
||||
#define MPP18_GPIO MPP(18, 0x0, 1, 1, 1)
|
||||
#define MPP18_UA0_CTSn MPP(18, 0x4, 1, 0, 1)
|
||||
#define MPP18_BOOT_FLASH_REn MPP(18, 0x5, 0, 1, 1)
|
||||
#define MPP18_UA0_CTSn MPP(18, 0x4, 0, 0, 1)
|
||||
#define MPP18_BOOT_FLASH_REn MPP(18, 0x5, 0, 0, 1)
|
||||
#define MPP18_UNUSED MPP(18, 0x1, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
#define MPP19_GPIO MPP(19, 0x0, 1, 1, 1)
|
||||
#define MPP19_UA0_CTSn MPP(19, 0x4, 0, 1, 1)
|
||||
#define MPP19_BOOT_FLASH_WEn MPP(19, 0x5, 0, 1, 1)
|
||||
#define MPP19_UA0_CTSn MPP(19, 0x4, 0, 0, 1)
|
||||
#define MPP19_BOOT_FLASH_WEn MPP(19, 0x5, 0, 0, 1)
|
||||
#define MPP19_UNUSED MPP(19, 0x1, 0, 0, 1)
|
||||
|
||||
|
||||
#define MPP20_GPIO MPP(20, 0x0, 1, 1, 1)
|
||||
#define MPP20_UA1_CTSs MPP(20, 0x4, 1, 0, 1)
|
||||
#define MPP20_TDM_PCLK MPP(20, 0x6, 1, 1, 0)
|
||||
#define MPP20_UA1_CTSs MPP(20, 0x4, 0, 0, 1)
|
||||
#define MPP20_TDM_PCLK MPP(20, 0x6, 0, 0, 0)
|
||||
#define MPP20_UNUSED MPP(20, 0x1, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
#define MPP21_GPIO MPP(21, 0x0, 1, 1, 1)
|
||||
#define MPP21_UA1_CTSs MPP(21, 0x4, 0, 1, 1)
|
||||
#define MPP21_TDM_FSYNC MPP(21, 0x6, 1, 1, 0)
|
||||
#define MPP21_UA1_CTSs MPP(21, 0x4, 0, 0, 1)
|
||||
#define MPP21_TDM_FSYNC MPP(21, 0x6, 0, 0, 0)
|
||||
#define MPP21_UNUSED MPP(21, 0x1, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
#define MPP22_GPIO MPP(22, 0x0, 1, 1, 1)
|
||||
#define MPP22_UA3_TDX MPP(22, 0x4, 0, 1, 1)
|
||||
#define MPP22_NAND_FLASH_REn2 MPP(22, 0x5, 0, 1, 1)
|
||||
#define MPP22_TDM_DRX MPP(22, 0x6, 1, 0, 1)
|
||||
#define MPP22_UA3_TDX MPP(22, 0x4, 0, 0, 1)
|
||||
#define MPP22_NAND_FLASH_REn2 MPP(22, 0x5, 0, 0, 1)
|
||||
#define MPP22_TDM_DRX MPP(22, 0x6, 0, 0, 1)
|
||||
#define MPP22_UNUSED MPP(22, 0x1, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
#define MPP23_GPIO MPP(23, 0x0, 1, 1, 1)
|
||||
#define MPP23_UA3_RDX MPP(23, 0x4, 1, 0, 1)
|
||||
#define MPP23_NAND_FLASH_WEn2 MPP(23, 0x5, 0, 1, 1)
|
||||
#define MPP23_TDM_DTX MPP(23, 0x6, 0, 1, 1)
|
||||
#define MPP23_UA3_RDX MPP(23, 0x4, 0, 0, 1)
|
||||
#define MPP23_NAND_FLASH_WEn2 MPP(23, 0x5, 0, 0, 1)
|
||||
#define MPP23_TDM_DTX MPP(23, 0x6, 0, 0, 1)
|
||||
#define MPP23_UNUSED MPP(23, 0x1, 0, 0, 1)
|
||||
|
||||
|
||||
#define MPP24_GPIO MPP(24, 0x0, 1, 1, 1)
|
||||
#define MPP24_UA2_TXD MPP(24, 0x4, 0, 1, 1)
|
||||
#define MPP24_TDM_INTn MPP(24, 0x6, 1, 0, 1)
|
||||
#define MPP24_UA2_TXD MPP(24, 0x4, 0, 0, 1)
|
||||
#define MPP24_TDM_INTn MPP(24, 0x6, 0, 0, 1)
|
||||
#define MPP24_UNUSED MPP(24, 0x1, 0, 0, 1)
|
||||
|
||||
|
||||
#define MPP25_GPIO MPP(25, 0x0, 1, 1, 1)
|
||||
#define MPP25_UA2_RXD MPP(25, 0x4, 1, 0, 1)
|
||||
#define MPP25_TDM_RSTn MPP(25, 0x6, 0, 1, 1)
|
||||
#define MPP25_UA2_RXD MPP(25, 0x4, 0, 0, 1)
|
||||
#define MPP25_TDM_RSTn MPP(25, 0x6, 0, 0, 1)
|
||||
#define MPP25_UNUSED MPP(25, 0x1, 0, 0, 1)
|
||||
|
||||
|
||||
#define MPP26_GPIO MPP(26, 0x0, 1, 1, 1)
|
||||
#define MPP26_UA2_CTSn MPP(26, 0x4, 1, 0, 1)
|
||||
#define MPP26_TDM_PCLK MPP(26, 0x6, 1, 1, 1)
|
||||
#define MPP26_UA2_CTSn MPP(26, 0x4, 0, 0, 1)
|
||||
#define MPP26_TDM_PCLK MPP(26, 0x6, 0, 0, 1)
|
||||
#define MPP26_UNUSED MPP(26, 0x1, 0, 0, 1)
|
||||
|
||||
|
||||
#define MPP27_GPIO MPP(27, 0x0, 1, 1, 1)
|
||||
#define MPP27_UA2_RTSn MPP(27, 0x4, 0, 1, 1)
|
||||
#define MPP27_TDM_FSYNC MPP(27, 0x6, 1, 1, 1)
|
||||
#define MPP27_UA2_RTSn MPP(27, 0x4, 0, 0, 1)
|
||||
#define MPP27_TDM_FSYNC MPP(27, 0x6, 0, 0, 1)
|
||||
#define MPP27_UNUSED MPP(27, 0x1, 0, 0, 1)
|
||||
|
||||
|
||||
#define MPP28_GPIO MPP(28, 0x0, 1, 1, 1)
|
||||
#define MPP28_UA3_TXD MPP(28, 0x4, 0, 1, 1)
|
||||
#define MPP28_TDM_DRX MPP(28, 0x6, 1, 0, 1)
|
||||
#define MPP28_UA3_TXD MPP(28, 0x4, 0, 0, 1)
|
||||
#define MPP28_TDM_DRX MPP(28, 0x6, 0, 0, 1)
|
||||
#define MPP28_UNUSED MPP(28, 0x1, 0, 0, 1)
|
||||
|
||||
#define MPP29_GPIO MPP(29, 0x0, 1, 1, 1)
|
||||
#define MPP29_UA3_RXD MPP(29, 0x4, 1, 0, 1)
|
||||
#define MPP29_SYSRST_OUTn MPP(29, 0x5, 0, 1, 1)
|
||||
#define MPP29_TDM_DTX MPP(29, 0x6, 0, 1, 1)
|
||||
#define MPP29_UA3_RXD MPP(29, 0x4, 0, 0, 1)
|
||||
#define MPP29_SYSRST_OUTn MPP(29, 0x5, 0, 0, 1)
|
||||
#define MPP29_TDM_DTX MPP(29, 0x6, 0, 0, 1)
|
||||
#define MPP29_UNUSED MPP(29, 0x1, 0, 0, 1)
|
||||
|
||||
#define MPP30_GPIO MPP(30, 0x0, 1, 1, 1)
|
||||
#define MPP30_UA3_CTSn MPP(30, 0x4, 1, 0, 1)
|
||||
#define MPP30_UA3_CTSn MPP(30, 0x4, 0, 0, 1)
|
||||
#define MPP30_UNUSED MPP(30, 0x1, 0, 0, 1)
|
||||
|
||||
#define MPP31_GPIO MPP(31, 0x0, 1, 1, 1)
|
||||
#define MPP31_UA3_RTSn MPP(31, 0x4, 0, 1, 1)
|
||||
#define MPP31_TDM1_SCSn MPP(31, 0x6, 0, 1, 1)
|
||||
#define MPP31_UA3_RTSn MPP(31, 0x4, 0, 0, 1)
|
||||
#define MPP31_TDM1_SCSn MPP(31, 0x6, 0, 0, 1)
|
||||
#define MPP31_UNUSED MPP(31, 0x1, 0, 0, 1)
|
||||
|
||||
|
||||
#define MPP32_GPIO MPP(32, 0x1, 1, 1, 1)
|
||||
#define MPP32_UA3_TDX MPP(32, 0x4, 0, 1, 1)
|
||||
#define MPP32_SYSRST_OUTn MPP(32, 0x5, 0, 1, 1)
|
||||
#define MPP32_TDM0_RXQ MPP(32, 0x6, 0, 1, 1)
|
||||
#define MPP32_UA3_TDX MPP(32, 0x4, 0, 0, 1)
|
||||
#define MPP32_SYSRST_OUTn MPP(32, 0x5, 0, 0, 1)
|
||||
#define MPP32_TDM0_RXQ MPP(32, 0x6, 0, 0, 1)
|
||||
#define MPP32_UNUSED MPP(32, 0x3, 0, 0, 1)
|
||||
|
||||
|
||||
#define MPP33_GPIO MPP(33, 0x1, 1, 1, 1)
|
||||
#define MPP33_UA3_RDX MPP(33, 0x4, 1, 0, 1)
|
||||
#define MPP33_TDM0_TXQ MPP(33, 0x6, 0, 1, 1)
|
||||
#define MPP33_UA3_RDX MPP(33, 0x4, 0, 0, 1)
|
||||
#define MPP33_TDM0_TXQ MPP(33, 0x6, 0, 0, 1)
|
||||
#define MPP33_UNUSED MPP(33, 0x3, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
#define MPP34_GPIO MPP(34, 0x1, 1, 1, 1)
|
||||
#define MPP34_UA2_TDX MPP(34, 0x4, 0, 1, 1)
|
||||
#define MPP34_TDM1_RXQ MPP(34, 0x6, 0, 1, 1)
|
||||
#define MPP34_UA2_TDX MPP(34, 0x4, 0, 0, 1)
|
||||
#define MPP34_TDM1_RXQ MPP(34, 0x6, 0, 0, 1)
|
||||
#define MPP34_UNUSED MPP(34, 0x3, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
#define MPP35_GPIO MPP(35, 0x1, 1, 1, 1)
|
||||
#define MPP35_UA2_RDX MPP(35, 0x4, 1, 0, 1)
|
||||
#define MPP35_TDM1_TXQ MPP(35, 0x6, 0, 1, 1)
|
||||
#define MPP35_UA2_RDX MPP(35, 0x4, 0, 0, 1)
|
||||
#define MPP35_TDM1_TXQ MPP(35, 0x6, 0, 0, 1)
|
||||
#define MPP35_UNUSED MPP(35, 0x3, 0, 0, 1)
|
||||
|
||||
#define MPP36_GPIO MPP(36, 0x1, 1, 1, 1)
|
||||
#define MPP36_UA0_CTSn MPP(36, 0x2, 1, 0, 1)
|
||||
#define MPP36_UA2_TDX MPP(36, 0x4, 0, 1, 1)
|
||||
#define MPP36_TDM0_SCSn MPP(36, 0x6, 0, 1, 1)
|
||||
#define MPP36_UA0_CTSn MPP(36, 0x2, 0, 0, 1)
|
||||
#define MPP36_UA2_TDX MPP(36, 0x4, 0, 0, 1)
|
||||
#define MPP36_TDM0_SCSn MPP(36, 0x6, 0, 0, 1)
|
||||
#define MPP36_UNUSED MPP(36, 0x3, 0, 0, 1)
|
||||
|
||||
|
||||
#define MPP37_GPIO MPP(37, 0x1, 1, 1, 1)
|
||||
#define MPP37_UA0_RTSn MPP(37, 0x2, 0, 1, 1)
|
||||
#define MPP37_UA2_RXD MPP(37, 0x4, 1, 0, 1)
|
||||
#define MPP37_SYSRST_OUTn MPP(37, 0x5, 0, 1, 1)
|
||||
#define MPP37_TDM_SCLK MPP(37, 0x6, 0, 1, 1)
|
||||
#define MPP37_UA0_RTSn MPP(37, 0x2, 0, 0, 1)
|
||||
#define MPP37_UA2_RXD MPP(37, 0x4, 0, 0, 1)
|
||||
#define MPP37_SYSRST_OUTn MPP(37, 0x5, 0, 0, 1)
|
||||
#define MPP37_TDM_SCLK MPP(37, 0x6, 0, 0, 1)
|
||||
#define MPP37_UNUSED MPP(37, 0x3, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
|
||||
#define MPP38_GPIO MPP(38, 0x1, 1, 1, 1)
|
||||
#define MPP38_UA1_CTSn MPP(38, 0x2, 1, 0, 1)
|
||||
#define MPP38_UA3_TXD MPP(38, 0x4, 0, 1, 1)
|
||||
#define MPP38_SYSRST_OUTn MPP(38, 0x5, 0, 1, 1)
|
||||
#define MPP38_TDM_SMOSI MPP(38, 0x6, 0, 1, 1)
|
||||
#define MPP38_UA1_CTSn MPP(38, 0x2, 0, 0, 1)
|
||||
#define MPP38_UA3_TXD MPP(38, 0x4, 0, 0, 1)
|
||||
#define MPP38_SYSRST_OUTn MPP(38, 0x5, 0, 0, 1)
|
||||
#define MPP38_TDM_SMOSI MPP(38, 0x6, 0, 0, 1)
|
||||
#define MPP38_UNUSED MPP(38, 0x3, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
|
||||
#define MPP39_GPIO MPP(39, 0x1, 1, 1, 1)
|
||||
#define MPP39_UA1_RTSn MPP(39, 0x2, 0, 1, 1)
|
||||
#define MPP39_UA3_RXD MPP(39, 0x4, 1, 0, 1)
|
||||
#define MPP39_SYSRST_OUTn MPP(39, 0x5, 0, 1, 1)
|
||||
#define MPP39_TDM_SMISO MPP(39, 0x6, 1, 0, 1)
|
||||
#define MPP39_UA1_RTSn MPP(39, 0x2, 0, 0, 1)
|
||||
#define MPP39_UA3_RXD MPP(39, 0x4, 0, 0, 1)
|
||||
#define MPP39_SYSRST_OUTn MPP(39, 0x5, 0, 0, 1)
|
||||
#define MPP39_TDM_SMISO MPP(39, 0x6, 0, 0, 1)
|
||||
#define MPP39_UNUSED MPP(39, 0x3, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
#define MPP40_GPIO MPP(40, 0x1, 1, 1, 1)
|
||||
#define MPP40_TDM_INTn MPP(40, 0x6, 1, 0, 1)
|
||||
#define MPP40_TDM_INTn MPP(40, 0x6, 0, 0, 1)
|
||||
#define MPP40_UNUSED MPP(40, 0x0, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
#define MPP41_GPIO MPP(41, 0x1, 1, 1, 1)
|
||||
#define MPP41_TDM_RSTn MPP(41, 0x6, 0, 1, 1)
|
||||
#define MPP41_TDM_RSTn MPP(41, 0x6, 0, 0, 1)
|
||||
#define MPP41_UNUSED MPP(41, 0x0, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
#define MPP42_GPIO MPP(42, 0x1, 1, 1, 1)
|
||||
#define MPP42_TDM_PCLK MPP(42, 0x6, 1, 1, 1)
|
||||
#define MPP42_TDM_PCLK MPP(42, 0x6, 0, 0, 1)
|
||||
#define MPP42_UNUSED MPP(42, 0x0, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
#define MPP43_GPIO MPP(43, 0x1, 1, 1, 1)
|
||||
#define MPP43_TDM_FSYNC MPP(43, 0x6, 1, 1, 1)
|
||||
#define MPP43_TDM_FSYNC MPP(43, 0x6, 0, 0, 1)
|
||||
#define MPP43_UNUSED MPP(43, 0x0, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
#define MPP44_GPIO MPP(44, 0x1, 1, 1, 1)
|
||||
#define MPP44_TDM_DRX MPP(44, 0x6, 1, 0, 1)
|
||||
#define MPP44_TDM_DRX MPP(44, 0x6, 0, 0, 1)
|
||||
#define MPP44_UNUSED MPP(44, 0x0, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
#define MPP45_GPIO MPP(45, 0x1, 1, 1, 1)
|
||||
#define MPP45_SATA0_ACTn MPP(45, 0x3, 0, 1, 1)
|
||||
#define MPP45_TDM_DRX MPP(45, 0x6, 0, 1, 1)
|
||||
#define MPP45_SATA0_ACTn MPP(45, 0x3, 0, 0, 1)
|
||||
#define MPP45_TDM_DRX MPP(45, 0x6, 0, 0, 1)
|
||||
#define MPP45_UNUSED MPP(45, 0x0, 0, 0, 1)
|
||||
|
||||
|
||||
#define MPP46_GPIO MPP(46, 0x1, 1, 1, 1)
|
||||
#define MPP46_TDM_SCSn MPP(46, 0x6, 0, 1, 1)
|
||||
#define MPP46_TDM_SCSn MPP(46, 0x6, 0, 0, 1)
|
||||
#define MPP46_UNUSED MPP(46, 0x0, 0, 0, 1)
|
||||
|
||||
|
||||
@ -323,14 +323,14 @@
|
||||
|
||||
|
||||
#define MPP48_GPIO MPP(48, 0x1, 1, 1, 1)
|
||||
#define MPP48_SATA1_ACTn MPP(48, 0x3, 0, 1, 1)
|
||||
#define MPP48_SATA1_ACTn MPP(48, 0x3, 0, 0, 1)
|
||||
#define MPP48_UNUSED MPP(48, 0x2, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
#define MPP49_GPIO MPP(49, 0x1, 1, 1, 1)
|
||||
#define MPP49_SATA0_ACTn MPP(49, 0x3, 0, 1, 1)
|
||||
#define MPP49_M_BB MPP(49, 0x4, 1, 0, 1)
|
||||
#define MPP49_SATA0_ACTn MPP(49, 0x3, 0, 0, 1)
|
||||
#define MPP49_M_BB MPP(49, 0x4, 0, 0, 1)
|
||||
#define MPP49_UNUSED MPP(49, 0x2, 0, 0, 1)
|
||||
|
||||
|
||||
|
||||
@ -52,8 +52,9 @@
|
||||
#define ETH_KS8851_QUART 138
|
||||
#define OMAP4_SFH7741_SENSOR_OUTPUT_GPIO 184
|
||||
#define OMAP4_SFH7741_ENABLE_GPIO 188
|
||||
#define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */
|
||||
#define HDMI_GPIO_CT_CP_HPD 60 /* HPD mode enable/disable */
|
||||
#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
|
||||
#define HDMI_GPIO_HPD 63 /* Hotplug detect */
|
||||
#define DISPLAY_SEL_GPIO 59 /* LCD2/PicoDLP switch */
|
||||
#define DLP_POWER_ON_GPIO 40
|
||||
|
||||
@ -597,12 +598,8 @@ static void __init omap_sfh7741prox_init(void)
|
||||
|
||||
static void sdp4430_hdmi_mux_init(void)
|
||||
{
|
||||
/* PAD0_HDMI_HPD_PAD1_HDMI_CEC */
|
||||
omap_mux_init_signal("hdmi_hpd",
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("hdmi_cec",
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
/* PAD0_HDMI_DDC_SCL_PAD1_HDMI_DDC_SDA */
|
||||
omap_mux_init_signal("hdmi_ddc_scl",
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("hdmi_ddc_sda",
|
||||
@ -610,8 +607,9 @@ static void sdp4430_hdmi_mux_init(void)
|
||||
}
|
||||
|
||||
static struct gpio sdp4430_hdmi_gpios[] = {
|
||||
{ HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd" },
|
||||
{ HDMI_GPIO_CT_CP_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ct_cp_hpd" },
|
||||
{ HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },
|
||||
{ HDMI_GPIO_HPD, GPIOF_DIR_IN, "hdmi_gpio_hpd" },
|
||||
};
|
||||
|
||||
static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev)
|
||||
@ -628,8 +626,7 @@ static int sdp4430_panel_enable_hdmi(struct omap_dss_device *dssdev)
|
||||
|
||||
static void sdp4430_panel_disable_hdmi(struct omap_dss_device *dssdev)
|
||||
{
|
||||
gpio_free(HDMI_GPIO_LS_OE);
|
||||
gpio_free(HDMI_GPIO_HPD);
|
||||
gpio_free_array(sdp4430_hdmi_gpios, ARRAY_SIZE(sdp4430_hdmi_gpios));
|
||||
}
|
||||
|
||||
static struct nokia_dsi_panel_data dsi1_panel = {
|
||||
@ -745,6 +742,10 @@ static void sdp4430_lcd_init(void)
|
||||
pr_err("%s: Could not get lcd2_reset_gpio\n", __func__);
|
||||
}
|
||||
|
||||
static struct omap_dss_hdmi_data sdp4430_hdmi_data = {
|
||||
.hpd_gpio = HDMI_GPIO_HPD,
|
||||
};
|
||||
|
||||
static struct omap_dss_device sdp4430_hdmi_device = {
|
||||
.name = "hdmi",
|
||||
.driver_name = "hdmi_panel",
|
||||
@ -752,6 +753,7 @@ static struct omap_dss_device sdp4430_hdmi_device = {
|
||||
.platform_enable = sdp4430_panel_enable_hdmi,
|
||||
.platform_disable = sdp4430_panel_disable_hdmi,
|
||||
.channel = OMAP_DSS_CHANNEL_DIGIT,
|
||||
.data = &sdp4430_hdmi_data,
|
||||
};
|
||||
|
||||
static struct picodlp_panel_data sdp4430_picodlp_pdata = {
|
||||
@ -829,6 +831,10 @@ static void omap_4430sdp_display_init(void)
|
||||
sdp4430_hdmi_mux_init();
|
||||
sdp4430_picodlp_init();
|
||||
omap_display_init(&sdp4430_dss_data);
|
||||
|
||||
omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN);
|
||||
}
|
||||
|
||||
#ifdef CONFIG_OMAP_MUX
|
||||
|
||||
@ -51,8 +51,9 @@
|
||||
#define GPIO_HUB_NRESET 62
|
||||
#define GPIO_WIFI_PMENA 43
|
||||
#define GPIO_WIFI_IRQ 53
|
||||
#define HDMI_GPIO_HPD 60 /* Hot plug pin for HDMI */
|
||||
#define HDMI_GPIO_CT_CP_HPD 60 /* HPD mode enable/disable */
|
||||
#define HDMI_GPIO_LS_OE 41 /* Level shifter for HDMI */
|
||||
#define HDMI_GPIO_HPD 63 /* Hotplug detect */
|
||||
|
||||
/* wl127x BT, FM, GPS connectivity chip */
|
||||
static int wl1271_gpios[] = {46, -1, -1};
|
||||
@ -481,12 +482,8 @@ int __init omap4_panda_dvi_init(void)
|
||||
|
||||
static void omap4_panda_hdmi_mux_init(void)
|
||||
{
|
||||
/* PAD0_HDMI_HPD_PAD1_HDMI_CEC */
|
||||
omap_mux_init_signal("hdmi_hpd",
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("hdmi_cec",
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
/* PAD0_HDMI_DDC_SCL_PAD1_HDMI_DDC_SDA */
|
||||
omap_mux_init_signal("hdmi_ddc_scl",
|
||||
OMAP_PIN_INPUT_PULLUP);
|
||||
omap_mux_init_signal("hdmi_ddc_sda",
|
||||
@ -494,8 +491,9 @@ static void omap4_panda_hdmi_mux_init(void)
|
||||
}
|
||||
|
||||
static struct gpio panda_hdmi_gpios[] = {
|
||||
{ HDMI_GPIO_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_hpd" },
|
||||
{ HDMI_GPIO_CT_CP_HPD, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ct_cp_hpd" },
|
||||
{ HDMI_GPIO_LS_OE, GPIOF_OUT_INIT_HIGH, "hdmi_gpio_ls_oe" },
|
||||
{ HDMI_GPIO_HPD, GPIOF_DIR_IN, "hdmi_gpio_hpd" },
|
||||
};
|
||||
|
||||
static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev)
|
||||
@ -512,10 +510,13 @@ static int omap4_panda_panel_enable_hdmi(struct omap_dss_device *dssdev)
|
||||
|
||||
static void omap4_panda_panel_disable_hdmi(struct omap_dss_device *dssdev)
|
||||
{
|
||||
gpio_free(HDMI_GPIO_LS_OE);
|
||||
gpio_free(HDMI_GPIO_HPD);
|
||||
gpio_free_array(panda_hdmi_gpios, ARRAY_SIZE(panda_hdmi_gpios));
|
||||
}
|
||||
|
||||
static struct omap_dss_hdmi_data omap4_panda_hdmi_data = {
|
||||
.hpd_gpio = HDMI_GPIO_HPD,
|
||||
};
|
||||
|
||||
static struct omap_dss_device omap4_panda_hdmi_device = {
|
||||
.name = "hdmi",
|
||||
.driver_name = "hdmi_panel",
|
||||
@ -523,6 +524,7 @@ static struct omap_dss_device omap4_panda_hdmi_device = {
|
||||
.platform_enable = omap4_panda_panel_enable_hdmi,
|
||||
.platform_disable = omap4_panda_panel_disable_hdmi,
|
||||
.channel = OMAP_DSS_CHANNEL_DIGIT,
|
||||
.data = &omap4_panda_hdmi_data,
|
||||
};
|
||||
|
||||
static struct omap_dss_device *omap4_panda_dss_devices[] = {
|
||||
@ -546,6 +548,10 @@ void omap4_panda_display_init(void)
|
||||
|
||||
omap4_panda_hdmi_mux_init();
|
||||
omap_display_init(&omap4_panda_dss_data);
|
||||
|
||||
omap_mux_init_gpio(HDMI_GPIO_LS_OE, OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_gpio(HDMI_GPIO_CT_CP_HPD, OMAP_PIN_OUTPUT);
|
||||
omap_mux_init_gpio(HDMI_GPIO_HPD, OMAP_PIN_INPUT_PULLDOWN);
|
||||
}
|
||||
|
||||
static void __init omap4_panda_init(void)
|
||||
|
||||
@ -528,7 +528,13 @@ int gpmc_cs_configure(int cs, int cmd, int wval)
|
||||
|
||||
case GPMC_CONFIG_DEV_SIZE:
|
||||
regval = gpmc_cs_read_reg(cs, GPMC_CS_CONFIG1);
|
||||
|
||||
/* clear 2 target bits */
|
||||
regval &= ~GPMC_CONFIG1_DEVICESIZE(3);
|
||||
|
||||
/* set the proper value */
|
||||
regval |= GPMC_CONFIG1_DEVICESIZE(wval);
|
||||
|
||||
gpmc_cs_write_reg(cs, GPMC_CS_CONFIG1, regval);
|
||||
break;
|
||||
|
||||
|
||||
@ -150,7 +150,8 @@ err_out:
|
||||
platform_device_put(omap_iommu_pdev[i]);
|
||||
return err;
|
||||
}
|
||||
module_init(omap_iommu_init);
|
||||
/* must be ready before omap3isp is probed */
|
||||
subsys_initcall(omap_iommu_init);
|
||||
|
||||
static void __exit omap_iommu_exit(void)
|
||||
{
|
||||
|
||||
@ -41,6 +41,11 @@ void __init omap_vp_init(struct voltagedomain *voltdm)
|
||||
u32 val, sys_clk_rate, timeout, waittime;
|
||||
u32 vddmin, vddmax, vstepmin, vstepmax;
|
||||
|
||||
if (!voltdm->pmic || !voltdm->pmic->uv_to_vsel) {
|
||||
pr_err("%s: No PMIC info for vdd_%s\n", __func__, voltdm->name);
|
||||
return;
|
||||
}
|
||||
|
||||
if (!voltdm->read || !voltdm->write) {
|
||||
pr_err("%s: No read/write API for accessing vdd_%s regs\n",
|
||||
__func__, voltdm->name);
|
||||
|
||||
@ -29,6 +29,7 @@
|
||||
#include <mach/hardware.h>
|
||||
#include <mach/orion5x.h>
|
||||
#include <plat/orion_nand.h>
|
||||
#include <plat/ehci-orion.h>
|
||||
#include <plat/time.h>
|
||||
#include <plat/common.h>
|
||||
#include "common.h"
|
||||
@ -72,7 +73,8 @@ void __init orion5x_map_io(void)
|
||||
void __init orion5x_ehci0_init(void)
|
||||
{
|
||||
orion_ehci_init(&orion5x_mbus_dram_info,
|
||||
ORION5X_USB0_PHYS_BASE, IRQ_ORION5X_USB0_CTRL);
|
||||
ORION5X_USB0_PHYS_BASE, IRQ_ORION5X_USB0_CTRL,
|
||||
EHCI_PHY_ORION);
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -7,6 +7,7 @@ config UX500_SOC_COMMON
|
||||
select HAS_MTU
|
||||
select ARM_ERRATA_753970
|
||||
select ARM_ERRATA_754322
|
||||
select ARM_ERRATA_764369
|
||||
|
||||
menu "Ux500 SoC"
|
||||
|
||||
|
||||
@ -233,6 +233,8 @@ void __init snowball_sdi_init(void)
|
||||
{
|
||||
u32 periphid = 0x10480180;
|
||||
|
||||
/* On Snowball MMC_CAP_SD_HIGHSPEED isn't supported on sdi0 */
|
||||
mop500_sdi0_data.capabilities &= ~MMC_CAP_SD_HIGHSPEED;
|
||||
mop500_sdi2_data.capabilities |= MMC_CAP_MMC_HIGHSPEED;
|
||||
|
||||
/* On-board eMMC */
|
||||
|
||||
@ -54,9 +54,15 @@ loop1:
|
||||
and r1, r1, #7 @ mask of the bits for current cache only
|
||||
cmp r1, #2 @ see what cache we have at this level
|
||||
blt skip @ skip if no cache, or just i-cache
|
||||
#ifdef CONFIG_PREEMPT
|
||||
save_and_disable_irqs_notrace r9 @ make cssr&csidr read atomic
|
||||
#endif
|
||||
mcr p15, 2, r10, c0, c0, 0 @ select current cache level in cssr
|
||||
isb @ isb to sych the new cssr&csidr
|
||||
mrc p15, 1, r1, c0, c0, 0 @ read the new csidr
|
||||
#ifdef CONFIG_PREEMPT
|
||||
restore_irqs_notrace r9
|
||||
#endif
|
||||
and r2, r1, #7 @ extract the length of the cache lines
|
||||
add r2, r2, #4 @ add 4 (line length offset)
|
||||
ldr r4, =0x3ff
|
||||
|
||||
@ -271,10 +271,6 @@ ENDPROC(cpu_v7_do_resume)
|
||||
* Initialise TLB, Caches, and MMU state ready to switch the MMU
|
||||
* on. Return in r0 the new CP15 C1 control register setting.
|
||||
*
|
||||
* We automatically detect if we have a Harvard cache, and use the
|
||||
* Harvard cache control instructions insead of the unified cache
|
||||
* control instructions.
|
||||
*
|
||||
* This should be able to cover all ARMv7 cores.
|
||||
*
|
||||
* It is assumed that:
|
||||
@ -356,9 +352,7 @@ __v7_setup:
|
||||
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||
#endif
|
||||
#ifdef CONFIG_ARM_ERRATA_743622
|
||||
teq r6, #0x20 @ present in r2p0
|
||||
teqne r6, #0x21 @ present in r2p1
|
||||
teqne r6, #0x22 @ present in r2p2
|
||||
teq r5, #0x00200000 @ only present in r2p*
|
||||
mrceq p15, 0, r10, c15, c0, 1 @ read diagnostic register
|
||||
orreq r10, r10, #1 << 6 @ set bit #6
|
||||
mcreq p15, 0, r10, c15, c0, 1 @ write diagnostic register
|
||||
@ -373,9 +367,7 @@ __v7_setup:
|
||||
#endif
|
||||
|
||||
3: mov r10, #0
|
||||
#ifdef HARVARD_CACHE
|
||||
mcr p15, 0, r10, c7, c5, 0 @ I+BTB cache invalidate
|
||||
#endif
|
||||
dsb
|
||||
#ifdef CONFIG_MMU
|
||||
mcr p15, 0, r10, c8, c7, 0 @ invalidate I + D TLBs
|
||||
|
||||
@ -806,10 +806,7 @@ void __init orion_xor1_init(unsigned long mapbase_low,
|
||||
/*****************************************************************************
|
||||
* EHCI
|
||||
****************************************************************************/
|
||||
static struct orion_ehci_data orion_ehci_data = {
|
||||
.phy_version = EHCI_PHY_NA,
|
||||
};
|
||||
|
||||
static struct orion_ehci_data orion_ehci_data;
|
||||
static u64 ehci_dmamask = DMA_BIT_MASK(32);
|
||||
|
||||
|
||||
@ -830,9 +827,11 @@ static struct platform_device orion_ehci = {
|
||||
|
||||
void __init orion_ehci_init(struct mbus_dram_target_info *mbus_dram_info,
|
||||
unsigned long mapbase,
|
||||
unsigned long irq)
|
||||
unsigned long irq,
|
||||
enum orion_ehci_phy_ver phy_version)
|
||||
{
|
||||
orion_ehci_data.dram = mbus_dram_info;
|
||||
orion_ehci_data.phy_version = phy_version;
|
||||
fill_resources(&orion_ehci, orion_ehci_resources, mapbase, SZ_4K - 1,
|
||||
irq);
|
||||
|
||||
|
||||
@ -95,7 +95,8 @@ void __init orion_xor1_init(unsigned long mapbase_low,
|
||||
|
||||
void __init orion_ehci_init(struct mbus_dram_target_info *mbus_dram_info,
|
||||
unsigned long mapbase,
|
||||
unsigned long irq);
|
||||
unsigned long irq,
|
||||
enum orion_ehci_phy_ver phy_version);
|
||||
|
||||
void __init orion_ehci_1_init(struct mbus_dram_target_info *mbus_dram_info,
|
||||
unsigned long mapbase,
|
||||
|
||||
@ -64,8 +64,7 @@ void __init orion_mpp_conf(unsigned int *mpp_list, unsigned int variant_mask,
|
||||
gpio_mode |= GPIO_INPUT_OK;
|
||||
if (*mpp_list & MPP_OUTPUT_MASK)
|
||||
gpio_mode |= GPIO_OUTPUT_OK;
|
||||
if (sel != 0)
|
||||
gpio_mode = 0;
|
||||
|
||||
orion_gpio_set_valid(num, gpio_mode);
|
||||
}
|
||||
|
||||
|
||||
@ -1249,7 +1249,7 @@ static void s3c2410_dma_resume(void)
|
||||
struct s3c2410_dma_chan *cp = s3c2410_chans + dma_channels - 1;
|
||||
int channel;
|
||||
|
||||
for (channel = dma_channels - 1; channel >= 0; cp++, channel--)
|
||||
for (channel = dma_channels - 1; channel >= 0; cp--, channel--)
|
||||
s3c2410_dma_resume_chan(cp);
|
||||
}
|
||||
|
||||
|
||||
@ -8,6 +8,7 @@ config AVR32
|
||||
select HAVE_KPROBES
|
||||
select HAVE_GENERIC_HARDIRQS
|
||||
select GENERIC_IRQ_PROBE
|
||||
select GENERIC_ATOMIC64
|
||||
select HARDIRQS_SW_RESEND
|
||||
select GENERIC_IRQ_SHOW
|
||||
select ARCH_HAVE_NMI_SAFE_CMPXCHG
|
||||
|
||||
@ -429,22 +429,24 @@ static u32 __devinitdata pxm_flag[PXM_FLAG_LEN];
|
||||
static struct acpi_table_slit __initdata *slit_table;
|
||||
cpumask_t early_cpu_possible_map = CPU_MASK_NONE;
|
||||
|
||||
static int get_processor_proximity_domain(struct acpi_srat_cpu_affinity *pa)
|
||||
static int __init
|
||||
get_processor_proximity_domain(struct acpi_srat_cpu_affinity *pa)
|
||||
{
|
||||
int pxm;
|
||||
|
||||
pxm = pa->proximity_domain_lo;
|
||||
if (ia64_platform_is("sn2"))
|
||||
if (ia64_platform_is("sn2") || acpi_srat_revision >= 2)
|
||||
pxm += pa->proximity_domain_hi[0] << 8;
|
||||
return pxm;
|
||||
}
|
||||
|
||||
static int get_memory_proximity_domain(struct acpi_srat_mem_affinity *ma)
|
||||
static int __init
|
||||
get_memory_proximity_domain(struct acpi_srat_mem_affinity *ma)
|
||||
{
|
||||
int pxm;
|
||||
|
||||
pxm = ma->proximity_domain;
|
||||
if (!ia64_platform_is("sn2"))
|
||||
if (!ia64_platform_is("sn2") && acpi_srat_revision <= 1)
|
||||
pxm &= 0xff;
|
||||
|
||||
return pxm;
|
||||
|
||||
@ -414,9 +414,9 @@ void __init config_atari(void)
|
||||
* FDC val = 4 -> Supervisor only */
|
||||
asm volatile ("\n"
|
||||
" .chip 68030\n"
|
||||
" pmove %0@,%/tt1\n"
|
||||
" pmove %0,%/tt1\n"
|
||||
" .chip 68k"
|
||||
: : "a" (&tt1_val));
|
||||
: : "m" (tt1_val));
|
||||
} else {
|
||||
asm volatile ("\n"
|
||||
" .chip 68040\n"
|
||||
@ -569,10 +569,10 @@ static void atari_reset(void)
|
||||
: "d0");
|
||||
} else
|
||||
asm volatile ("\n"
|
||||
" pmove %0@,%%tc\n"
|
||||
" pmove %0,%%tc\n"
|
||||
" jmp %1@"
|
||||
: /* no outputs */
|
||||
: "a" (&tc_val), "a" (reset_addr));
|
||||
: "m" (tc_val), "a" (reset_addr));
|
||||
}
|
||||
|
||||
|
||||
|
||||
@ -189,8 +189,8 @@ void flush_thread(void)
|
||||
current->thread.fs = __USER_DS;
|
||||
if (!FPU_IS_EMU)
|
||||
asm volatile (".chip 68k/68881\n\t"
|
||||
"frestore %0@\n\t"
|
||||
".chip 68k" : : "a" (&zero));
|
||||
"frestore %0\n\t"
|
||||
".chip 68k" : : "m" (zero));
|
||||
}
|
||||
|
||||
/*
|
||||
|
||||
@ -163,8 +163,8 @@ void flush_thread(void)
|
||||
#ifdef CONFIG_FPU
|
||||
if (!FPU_IS_EMU)
|
||||
asm volatile (".chip 68k/68881\n\t"
|
||||
"frestore %0@\n\t"
|
||||
".chip 68k" : : "a" (&zero));
|
||||
"frestore %0\n\t"
|
||||
".chip 68k" : : "m" (zero));
|
||||
#endif
|
||||
}
|
||||
|
||||
|
||||
@ -552,13 +552,13 @@ static inline void bus_error030 (struct frame *fp)
|
||||
|
||||
#ifdef DEBUG
|
||||
asm volatile ("ptestr %3,%2@,#7,%0\n\t"
|
||||
"pmove %%psr,%1@"
|
||||
: "=a&" (desc)
|
||||
: "a" (&temp), "a" (addr), "d" (ssw));
|
||||
"pmove %%psr,%1"
|
||||
: "=a&" (desc), "=m" (temp)
|
||||
: "a" (addr), "d" (ssw));
|
||||
#else
|
||||
asm volatile ("ptestr %2,%1@,#7\n\t"
|
||||
"pmove %%psr,%0@"
|
||||
: : "a" (&temp), "a" (addr), "d" (ssw));
|
||||
"pmove %%psr,%0"
|
||||
: "=m" (temp) : "a" (addr), "d" (ssw));
|
||||
#endif
|
||||
mmusr = temp;
|
||||
|
||||
@ -605,20 +605,18 @@ static inline void bus_error030 (struct frame *fp)
|
||||
!(ssw & RW) ? "write" : "read", addr,
|
||||
fp->ptregs.pc, ssw);
|
||||
asm volatile ("ptestr #1,%1@,#0\n\t"
|
||||
"pmove %%psr,%0@"
|
||||
: /* no outputs */
|
||||
: "a" (&temp), "a" (addr));
|
||||
"pmove %%psr,%0"
|
||||
: "=m" (temp)
|
||||
: "a" (addr));
|
||||
mmusr = temp;
|
||||
|
||||
printk ("level 0 mmusr is %#x\n", mmusr);
|
||||
#if 0
|
||||
asm volatile ("pmove %%tt0,%0@"
|
||||
: /* no outputs */
|
||||
: "a" (&tlong));
|
||||
asm volatile ("pmove %%tt0,%0"
|
||||
: "=m" (tlong));
|
||||
printk("tt0 is %#lx, ", tlong);
|
||||
asm volatile ("pmove %%tt1,%0@"
|
||||
: /* no outputs */
|
||||
: "a" (&tlong));
|
||||
asm volatile ("pmove %%tt1,%0"
|
||||
: "=m" (tlong));
|
||||
printk("tt1 is %#lx\n", tlong);
|
||||
#endif
|
||||
#ifdef DEBUG
|
||||
@ -668,13 +666,13 @@ static inline void bus_error030 (struct frame *fp)
|
||||
|
||||
#ifdef DEBUG
|
||||
asm volatile ("ptestr #1,%2@,#7,%0\n\t"
|
||||
"pmove %%psr,%1@"
|
||||
: "=a&" (desc)
|
||||
: "a" (&temp), "a" (addr));
|
||||
"pmove %%psr,%1"
|
||||
: "=a&" (desc), "=m" (temp)
|
||||
: "a" (addr));
|
||||
#else
|
||||
asm volatile ("ptestr #1,%1@,#7\n\t"
|
||||
"pmove %%psr,%0@"
|
||||
: : "a" (&temp), "a" (addr));
|
||||
"pmove %%psr,%0"
|
||||
: "=m" (temp) : "a" (addr));
|
||||
#endif
|
||||
mmusr = temp;
|
||||
|
||||
|
||||
@ -52,9 +52,9 @@ static unsigned long virt_to_phys_slow(unsigned long vaddr)
|
||||
unsigned long *descaddr;
|
||||
|
||||
asm volatile ("ptestr %3,%2@,#7,%0\n\t"
|
||||
"pmove %%psr,%1@"
|
||||
: "=a&" (descaddr)
|
||||
: "a" (&mmusr), "a" (vaddr), "d" (get_fs().seg));
|
||||
"pmove %%psr,%1"
|
||||
: "=a&" (descaddr), "=m" (mmusr)
|
||||
: "a" (vaddr), "d" (get_fs().seg));
|
||||
if (mmusr & (MMU_I|MMU_B|MMU_L))
|
||||
return 0;
|
||||
descaddr = phys_to_virt((unsigned long)descaddr);
|
||||
|
||||
@ -219,5 +219,7 @@ DECLARE_PER_CPU(struct cpu_usage, cpu_usage_array);
|
||||
extern void secondary_cpu_time_init(void);
|
||||
extern void iSeries_time_init_early(void);
|
||||
|
||||
extern void decrementer_check_overflow(void);
|
||||
|
||||
#endif /* __KERNEL__ */
|
||||
#endif /* __POWERPC_TIME_H */
|
||||
|
||||
@ -164,16 +164,13 @@ notrace void arch_local_irq_restore(unsigned long en)
|
||||
*/
|
||||
local_paca->hard_enabled = en;
|
||||
|
||||
#ifndef CONFIG_BOOKE
|
||||
/* On server, re-trigger the decrementer if it went negative since
|
||||
* some processors only trigger on edge transitions of the sign bit.
|
||||
*
|
||||
* BookE has a level sensitive decrementer (latches in TSR) so we
|
||||
* don't need that
|
||||
/*
|
||||
* Trigger the decrementer if we have a pending event. Some processors
|
||||
* only trigger on edge transitions of the sign bit. We might also
|
||||
* have disabled interrupts long enough that the decrementer wrapped
|
||||
* to positive.
|
||||
*/
|
||||
if ((int)mfspr(SPRN_DEC) < 0)
|
||||
mtspr(SPRN_DEC, 1);
|
||||
#endif /* CONFIG_BOOKE */
|
||||
decrementer_check_overflow();
|
||||
|
||||
/*
|
||||
* Force the delivery of pending soft-disabled interrupts on PS3.
|
||||
|
||||
@ -865,6 +865,7 @@ static void power_pmu_start(struct perf_event *event, int ef_flags)
|
||||
{
|
||||
unsigned long flags;
|
||||
s64 left;
|
||||
unsigned long val;
|
||||
|
||||
if (!event->hw.idx || !event->hw.sample_period)
|
||||
return;
|
||||
@ -880,7 +881,12 @@ static void power_pmu_start(struct perf_event *event, int ef_flags)
|
||||
|
||||
event->hw.state = 0;
|
||||
left = local64_read(&event->hw.period_left);
|
||||
write_pmc(event->hw.idx, left);
|
||||
|
||||
val = 0;
|
||||
if (left < 0x80000000L)
|
||||
val = 0x80000000L - left;
|
||||
|
||||
write_pmc(event->hw.idx, val);
|
||||
|
||||
perf_event_update_userpage(event);
|
||||
perf_pmu_enable(event->pmu);
|
||||
|
||||
@ -889,6 +889,15 @@ static void __init clocksource_init(void)
|
||||
clock->name, clock->mult, clock->shift);
|
||||
}
|
||||
|
||||
void decrementer_check_overflow(void)
|
||||
{
|
||||
u64 now = get_tb_or_rtc();
|
||||
struct decrementer_clock *decrementer = &__get_cpu_var(decrementers);
|
||||
|
||||
if (now >= decrementer->next_tb)
|
||||
set_dec(1);
|
||||
}
|
||||
|
||||
static int decrementer_set_next_event(unsigned long evt,
|
||||
struct clock_event_device *dev)
|
||||
{
|
||||
|
||||
@ -109,7 +109,7 @@ static void probe_hcall_entry(void *ignored, unsigned long opcode, unsigned long
|
||||
if (opcode > MAX_HCALL_OPCODE)
|
||||
return;
|
||||
|
||||
h = &get_cpu_var(hcall_stats)[opcode / 4];
|
||||
h = &__get_cpu_var(hcall_stats)[opcode / 4];
|
||||
h->tb_start = mftb();
|
||||
h->purr_start = mfspr(SPRN_PURR);
|
||||
}
|
||||
@ -126,8 +126,6 @@ static void probe_hcall_exit(void *ignored, unsigned long opcode, unsigned long
|
||||
h->num_calls++;
|
||||
h->tb_total += mftb() - h->tb_start;
|
||||
h->purr_total += mfspr(SPRN_PURR) - h->purr_start;
|
||||
|
||||
put_cpu_var(hcall_stats);
|
||||
}
|
||||
|
||||
static int __init hcall_inst_init(void)
|
||||
|
||||
@ -554,6 +554,7 @@ void __trace_hcall_entry(unsigned long opcode, unsigned long *args)
|
||||
goto out;
|
||||
|
||||
(*depth)++;
|
||||
preempt_disable();
|
||||
trace_hcall_entry(opcode, args);
|
||||
(*depth)--;
|
||||
|
||||
@ -576,6 +577,7 @@ void __trace_hcall_exit(long opcode, unsigned long retval,
|
||||
|
||||
(*depth)++;
|
||||
trace_hcall_exit(opcode, retval, retbuf);
|
||||
preempt_enable();
|
||||
(*depth)--;
|
||||
|
||||
out:
|
||||
|
||||
@ -230,6 +230,9 @@ config COMPAT
|
||||
config SYSVIPC_COMPAT
|
||||
def_bool y if COMPAT && SYSVIPC
|
||||
|
||||
config KEYS_COMPAT
|
||||
def_bool y if COMPAT && KEYS
|
||||
|
||||
config AUDIT_ARCH
|
||||
def_bool y
|
||||
|
||||
|
||||
@ -172,13 +172,6 @@ static inline int is_compat_task(void)
|
||||
return is_32bit_task();
|
||||
}
|
||||
|
||||
#else
|
||||
|
||||
static inline int is_compat_task(void)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
static inline void __user *arch_compat_alloc_user_space(long len)
|
||||
|
||||
@ -29,7 +29,6 @@
|
||||
#include <asm/irq.h>
|
||||
#include <asm/timer.h>
|
||||
#include <asm/nmi.h>
|
||||
#include <asm/compat.h>
|
||||
#include <asm/smp.h>
|
||||
#include "entry.h"
|
||||
|
||||
|
||||
@ -20,8 +20,8 @@
|
||||
#include <linux/regset.h>
|
||||
#include <linux/tracehook.h>
|
||||
#include <linux/seccomp.h>
|
||||
#include <linux/compat.h>
|
||||
#include <trace/syscall.h>
|
||||
#include <asm/compat.h>
|
||||
#include <asm/segment.h>
|
||||
#include <asm/page.h>
|
||||
#include <asm/pgtable.h>
|
||||
|
||||
@ -45,6 +45,7 @@
|
||||
#include <linux/kexec.h>
|
||||
#include <linux/crash_dump.h>
|
||||
#include <linux/memory.h>
|
||||
#include <linux/compat.h>
|
||||
|
||||
#include <asm/ipl.h>
|
||||
#include <asm/uaccess.h>
|
||||
@ -58,7 +59,6 @@
|
||||
#include <asm/ptrace.h>
|
||||
#include <asm/sections.h>
|
||||
#include <asm/ebcdic.h>
|
||||
#include <asm/compat.h>
|
||||
#include <asm/kvm_virtio.h>
|
||||
#include <asm/diag.h>
|
||||
|
||||
|
||||
@ -30,7 +30,6 @@
|
||||
#include <asm/ucontext.h>
|
||||
#include <asm/uaccess.h>
|
||||
#include <asm/lowcore.h>
|
||||
#include <asm/compat.h>
|
||||
#include "entry.h"
|
||||
|
||||
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
|
||||
|
||||
@ -113,11 +113,14 @@ static void fixup_clock_comparator(unsigned long long delta)
|
||||
static int s390_next_ktime(ktime_t expires,
|
||||
struct clock_event_device *evt)
|
||||
{
|
||||
struct timespec ts;
|
||||
u64 nsecs;
|
||||
|
||||
nsecs = ktime_to_ns(ktime_sub(expires, ktime_get_monotonic_offset()));
|
||||
ts.tv_sec = ts.tv_nsec = 0;
|
||||
monotonic_to_bootbased(&ts);
|
||||
nsecs = ktime_to_ns(ktime_add(timespec_to_ktime(ts), expires));
|
||||
do_div(nsecs, 125);
|
||||
S390_lowcore.clock_comparator = TOD_UNIX_EPOCH + (nsecs << 9);
|
||||
S390_lowcore.clock_comparator = sched_clock_base_cc + (nsecs << 9);
|
||||
set_clock_comparator(S390_lowcore.clock_comparator);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -36,7 +36,6 @@
|
||||
#include <asm/pgtable.h>
|
||||
#include <asm/irq.h>
|
||||
#include <asm/mmu_context.h>
|
||||
#include <asm/compat.h>
|
||||
#include "../kernel/entry.h"
|
||||
|
||||
#ifndef CONFIG_64BIT
|
||||
|
||||
@ -29,8 +29,8 @@
|
||||
#include <linux/mman.h>
|
||||
#include <linux/module.h>
|
||||
#include <linux/random.h>
|
||||
#include <linux/compat.h>
|
||||
#include <asm/pgalloc.h>
|
||||
#include <asm/compat.h>
|
||||
|
||||
static unsigned long stack_maxrandom_size(void)
|
||||
{
|
||||
|
||||
@ -408,7 +408,7 @@ ENTRY(handle_sys)
|
||||
sw r9, [r0, PT_EPC]
|
||||
|
||||
cmpi.c r27, __NR_syscalls # check syscall number
|
||||
bgtu illegal_syscall
|
||||
bgeu illegal_syscall
|
||||
|
||||
slli r8, r27, 2 # get syscall routine
|
||||
la r11, sys_call_table
|
||||
|
||||
@ -1,6 +1,7 @@
|
||||
#ifndef _ASM_X86_AMD_NB_H
|
||||
#define _ASM_X86_AMD_NB_H
|
||||
|
||||
#include <linux/ioport.h>
|
||||
#include <linux/pci.h>
|
||||
|
||||
struct amd_nb_bus_dev_range {
|
||||
@ -13,6 +14,7 @@ extern const struct pci_device_id amd_nb_misc_ids[];
|
||||
extern const struct amd_nb_bus_dev_range amd_nb_bus_dev_ranges[];
|
||||
|
||||
extern bool early_is_amd_nb(u32 value);
|
||||
extern struct resource *amd_get_mmconfig_range(struct resource *res);
|
||||
extern int amd_cache_northbridges(void);
|
||||
extern void amd_flush_garts(void);
|
||||
extern int amd_numa_init(void);
|
||||
|
||||
@ -29,8 +29,8 @@ extern unsigned int sig_xstate_size;
|
||||
extern void fpu_init(void);
|
||||
extern void mxcsr_feature_mask_init(void);
|
||||
extern int init_fpu(struct task_struct *child);
|
||||
extern asmlinkage void math_state_restore(void);
|
||||
extern void __math_state_restore(void);
|
||||
extern void __math_state_restore(struct task_struct *);
|
||||
extern void math_state_restore(void);
|
||||
extern int dump_fpu(struct pt_regs *, struct user_i387_struct *);
|
||||
|
||||
extern user_regset_active_fn fpregs_active, xfpregs_active;
|
||||
@ -212,19 +212,11 @@ static inline void fpu_fxsave(struct fpu *fpu)
|
||||
|
||||
#endif /* CONFIG_X86_64 */
|
||||
|
||||
/* We need a safe address that is cheap to find and that is already
|
||||
in L1 during context switch. The best choices are unfortunately
|
||||
different for UP and SMP */
|
||||
#ifdef CONFIG_SMP
|
||||
#define safe_address (__per_cpu_offset[0])
|
||||
#else
|
||||
#define safe_address (kstat_cpu(0).cpustat.user)
|
||||
#endif
|
||||
|
||||
/*
|
||||
* These must be called with preempt disabled
|
||||
* These must be called with preempt disabled. Returns
|
||||
* 'true' if the FPU state is still intact.
|
||||
*/
|
||||
static inline void fpu_save_init(struct fpu *fpu)
|
||||
static inline int fpu_save_init(struct fpu *fpu)
|
||||
{
|
||||
if (use_xsave()) {
|
||||
fpu_xsave(fpu);
|
||||
@ -233,33 +225,33 @@ static inline void fpu_save_init(struct fpu *fpu)
|
||||
* xsave header may indicate the init state of the FP.
|
||||
*/
|
||||
if (!(fpu->state->xsave.xsave_hdr.xstate_bv & XSTATE_FP))
|
||||
return;
|
||||
return 1;
|
||||
} else if (use_fxsr()) {
|
||||
fpu_fxsave(fpu);
|
||||
} else {
|
||||
asm volatile("fnsave %[fx]; fwait"
|
||||
: [fx] "=m" (fpu->state->fsave));
|
||||
return;
|
||||
return 0;
|
||||
}
|
||||
|
||||
if (unlikely(fpu->state->fxsave.swd & X87_FSW_ES))
|
||||
/*
|
||||
* If exceptions are pending, we need to clear them so
|
||||
* that we don't randomly get exceptions later.
|
||||
*
|
||||
* FIXME! Is this perhaps only true for the old-style
|
||||
* irq13 case? Maybe we could leave the x87 state
|
||||
* intact otherwise?
|
||||
*/
|
||||
if (unlikely(fpu->state->fxsave.swd & X87_FSW_ES)) {
|
||||
asm volatile("fnclex");
|
||||
|
||||
/* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception
|
||||
is pending. Clear the x87 state here by setting it to fixed
|
||||
values. safe_address is a random variable that should be in L1 */
|
||||
alternative_input(
|
||||
ASM_NOP8 ASM_NOP2,
|
||||
"emms\n\t" /* clear stack tags */
|
||||
"fildl %P[addr]", /* set F?P to defined value */
|
||||
X86_FEATURE_FXSAVE_LEAK,
|
||||
[addr] "m" (safe_address));
|
||||
return 0;
|
||||
}
|
||||
return 1;
|
||||
}
|
||||
|
||||
static inline void __save_init_fpu(struct task_struct *tsk)
|
||||
static inline int __save_init_fpu(struct task_struct *tsk)
|
||||
{
|
||||
fpu_save_init(&tsk->thread.fpu);
|
||||
task_thread_info(tsk)->status &= ~TS_USEDFPU;
|
||||
return fpu_save_init(&tsk->thread.fpu);
|
||||
}
|
||||
|
||||
static inline int fpu_fxrstor_checking(struct fpu *fpu)
|
||||
@ -280,40 +272,186 @@ static inline int restore_fpu_checking(struct task_struct *tsk)
|
||||
return fpu_restore_checking(&tsk->thread.fpu);
|
||||
}
|
||||
|
||||
/*
|
||||
* Software FPU state helpers. Careful: these need to
|
||||
* be preemption protection *and* they need to be
|
||||
* properly paired with the CR0.TS changes!
|
||||
*/
|
||||
static inline int __thread_has_fpu(struct task_struct *tsk)
|
||||
{
|
||||
return tsk->thread.has_fpu;
|
||||
}
|
||||
|
||||
/* Must be paired with an 'stts' after! */
|
||||
static inline void __thread_clear_has_fpu(struct task_struct *tsk)
|
||||
{
|
||||
tsk->thread.has_fpu = 0;
|
||||
}
|
||||
|
||||
/* Must be paired with a 'clts' before! */
|
||||
static inline void __thread_set_has_fpu(struct task_struct *tsk)
|
||||
{
|
||||
tsk->thread.has_fpu = 1;
|
||||
}
|
||||
|
||||
/*
|
||||
* Encapsulate the CR0.TS handling together with the
|
||||
* software flag.
|
||||
*
|
||||
* These generally need preemption protection to work,
|
||||
* do try to avoid using these on their own.
|
||||
*/
|
||||
static inline void __thread_fpu_end(struct task_struct *tsk)
|
||||
{
|
||||
__thread_clear_has_fpu(tsk);
|
||||
stts();
|
||||
}
|
||||
|
||||
static inline void __thread_fpu_begin(struct task_struct *tsk)
|
||||
{
|
||||
clts();
|
||||
__thread_set_has_fpu(tsk);
|
||||
}
|
||||
|
||||
/*
|
||||
* FPU state switching for scheduling.
|
||||
*
|
||||
* This is a two-stage process:
|
||||
*
|
||||
* - switch_fpu_prepare() saves the old state and
|
||||
* sets the new state of the CR0.TS bit. This is
|
||||
* done within the context of the old process.
|
||||
*
|
||||
* - switch_fpu_finish() restores the new state as
|
||||
* necessary.
|
||||
*/
|
||||
typedef struct { int preload; } fpu_switch_t;
|
||||
|
||||
/*
|
||||
* FIXME! We could do a totally lazy restore, but we need to
|
||||
* add a per-cpu "this was the task that last touched the FPU
|
||||
* on this CPU" variable, and the task needs to have a "I last
|
||||
* touched the FPU on this CPU" and check them.
|
||||
*
|
||||
* We don't do that yet, so "fpu_lazy_restore()" always returns
|
||||
* false, but some day..
|
||||
*/
|
||||
#define fpu_lazy_restore(tsk) (0)
|
||||
#define fpu_lazy_state_intact(tsk) do { } while (0)
|
||||
|
||||
static inline fpu_switch_t switch_fpu_prepare(struct task_struct *old, struct task_struct *new)
|
||||
{
|
||||
fpu_switch_t fpu;
|
||||
|
||||
fpu.preload = tsk_used_math(new) && new->fpu_counter > 5;
|
||||
if (__thread_has_fpu(old)) {
|
||||
if (__save_init_fpu(old))
|
||||
fpu_lazy_state_intact(old);
|
||||
__thread_clear_has_fpu(old);
|
||||
old->fpu_counter++;
|
||||
|
||||
/* Don't change CR0.TS if we just switch! */
|
||||
if (fpu.preload) {
|
||||
__thread_set_has_fpu(new);
|
||||
prefetch(new->thread.fpu.state);
|
||||
} else
|
||||
stts();
|
||||
} else {
|
||||
old->fpu_counter = 0;
|
||||
if (fpu.preload) {
|
||||
if (fpu_lazy_restore(new))
|
||||
fpu.preload = 0;
|
||||
else
|
||||
prefetch(new->thread.fpu.state);
|
||||
__thread_fpu_begin(new);
|
||||
}
|
||||
}
|
||||
return fpu;
|
||||
}
|
||||
|
||||
/*
|
||||
* By the time this gets called, we've already cleared CR0.TS and
|
||||
* given the process the FPU if we are going to preload the FPU
|
||||
* state - all we need to do is to conditionally restore the register
|
||||
* state itself.
|
||||
*/
|
||||
static inline void switch_fpu_finish(struct task_struct *new, fpu_switch_t fpu)
|
||||
{
|
||||
if (fpu.preload)
|
||||
__math_state_restore(new);
|
||||
}
|
||||
|
||||
/*
|
||||
* Signal frame handlers...
|
||||
*/
|
||||
extern int save_i387_xstate(void __user *buf);
|
||||
extern int restore_i387_xstate(void __user *buf);
|
||||
|
||||
static inline void __unlazy_fpu(struct task_struct *tsk)
|
||||
{
|
||||
if (task_thread_info(tsk)->status & TS_USEDFPU) {
|
||||
__save_init_fpu(tsk);
|
||||
stts();
|
||||
} else
|
||||
tsk->fpu_counter = 0;
|
||||
}
|
||||
|
||||
static inline void __clear_fpu(struct task_struct *tsk)
|
||||
{
|
||||
if (task_thread_info(tsk)->status & TS_USEDFPU) {
|
||||
if (__thread_has_fpu(tsk)) {
|
||||
/* Ignore delayed exceptions from user space */
|
||||
asm volatile("1: fwait\n"
|
||||
"2:\n"
|
||||
_ASM_EXTABLE(1b, 2b));
|
||||
task_thread_info(tsk)->status &= ~TS_USEDFPU;
|
||||
stts();
|
||||
__thread_fpu_end(tsk);
|
||||
}
|
||||
}
|
||||
|
||||
/*
|
||||
* Were we in an interrupt that interrupted kernel mode?
|
||||
*
|
||||
* We can do a kernel_fpu_begin/end() pair *ONLY* if that
|
||||
* pair does nothing at all: the thread must not have fpu (so
|
||||
* that we don't try to save the FPU state), and TS must
|
||||
* be set (so that the clts/stts pair does nothing that is
|
||||
* visible in the interrupted kernel thread).
|
||||
*/
|
||||
static inline bool interrupted_kernel_fpu_idle(void)
|
||||
{
|
||||
return !__thread_has_fpu(current) &&
|
||||
(read_cr0() & X86_CR0_TS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Were we in user mode (or vm86 mode) when we were
|
||||
* interrupted?
|
||||
*
|
||||
* Doing kernel_fpu_begin/end() is ok if we are running
|
||||
* in an interrupt context from user mode - we'll just
|
||||
* save the FPU state as required.
|
||||
*/
|
||||
static inline bool interrupted_user_mode(void)
|
||||
{
|
||||
struct pt_regs *regs = get_irq_regs();
|
||||
return regs && user_mode_vm(regs);
|
||||
}
|
||||
|
||||
/*
|
||||
* Can we use the FPU in kernel mode with the
|
||||
* whole "kernel_fpu_begin/end()" sequence?
|
||||
*
|
||||
* It's always ok in process context (ie "not interrupt")
|
||||
* but it is sometimes ok even from an irq.
|
||||
*/
|
||||
static inline bool irq_fpu_usable(void)
|
||||
{
|
||||
return !in_interrupt() ||
|
||||
interrupted_user_mode() ||
|
||||
interrupted_kernel_fpu_idle();
|
||||
}
|
||||
|
||||
static inline void kernel_fpu_begin(void)
|
||||
{
|
||||
struct thread_info *me = current_thread_info();
|
||||
struct task_struct *me = current;
|
||||
|
||||
WARN_ON_ONCE(!irq_fpu_usable());
|
||||
preempt_disable();
|
||||
if (me->status & TS_USEDFPU)
|
||||
__save_init_fpu(me->task);
|
||||
else
|
||||
if (__thread_has_fpu(me)) {
|
||||
__save_init_fpu(me);
|
||||
__thread_clear_has_fpu(me);
|
||||
/* We do 'stts()' in kernel_fpu_end() */
|
||||
} else
|
||||
clts();
|
||||
}
|
||||
|
||||
@ -323,14 +461,6 @@ static inline void kernel_fpu_end(void)
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
static inline bool irq_fpu_usable(void)
|
||||
{
|
||||
struct pt_regs *regs;
|
||||
|
||||
return !in_interrupt() || !(regs = get_irq_regs()) || \
|
||||
user_mode(regs) || (read_cr0() & X86_CR0_TS);
|
||||
}
|
||||
|
||||
/*
|
||||
* Some instructions like VIA's padlock instructions generate a spurious
|
||||
* DNA fault but don't modify SSE registers. And these instructions
|
||||
@ -362,21 +492,65 @@ static inline void irq_ts_restore(int TS_state)
|
||||
stts();
|
||||
}
|
||||
|
||||
/*
|
||||
* The question "does this thread have fpu access?"
|
||||
* is slightly racy, since preemption could come in
|
||||
* and revoke it immediately after the test.
|
||||
*
|
||||
* However, even in that very unlikely scenario,
|
||||
* we can just assume we have FPU access - typically
|
||||
* to save the FP state - we'll just take a #NM
|
||||
* fault and get the FPU access back.
|
||||
*
|
||||
* The actual user_fpu_begin/end() functions
|
||||
* need to be preemption-safe, though.
|
||||
*
|
||||
* NOTE! user_fpu_end() must be used only after you
|
||||
* have saved the FP state, and user_fpu_begin() must
|
||||
* be used only immediately before restoring it.
|
||||
* These functions do not do any save/restore on
|
||||
* their own.
|
||||
*/
|
||||
static inline int user_has_fpu(void)
|
||||
{
|
||||
return __thread_has_fpu(current);
|
||||
}
|
||||
|
||||
static inline void user_fpu_end(void)
|
||||
{
|
||||
preempt_disable();
|
||||
__thread_fpu_end(current);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
static inline void user_fpu_begin(void)
|
||||
{
|
||||
preempt_disable();
|
||||
if (!user_has_fpu())
|
||||
__thread_fpu_begin(current);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
/*
|
||||
* These disable preemption on their own and are safe
|
||||
*/
|
||||
static inline void save_init_fpu(struct task_struct *tsk)
|
||||
{
|
||||
WARN_ON_ONCE(!__thread_has_fpu(tsk));
|
||||
preempt_disable();
|
||||
__save_init_fpu(tsk);
|
||||
stts();
|
||||
__thread_fpu_end(tsk);
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
static inline void unlazy_fpu(struct task_struct *tsk)
|
||||
{
|
||||
preempt_disable();
|
||||
__unlazy_fpu(tsk);
|
||||
if (__thread_has_fpu(tsk)) {
|
||||
__save_init_fpu(tsk);
|
||||
__thread_fpu_end(tsk);
|
||||
} else
|
||||
tsk->fpu_counter = 0;
|
||||
preempt_enable();
|
||||
}
|
||||
|
||||
|
||||
@ -212,4 +212,12 @@ static inline perf_guest_switch_msr *perf_guest_get_msrs(int *nr)
|
||||
static inline void perf_events_lapic_init(void) { }
|
||||
#endif
|
||||
|
||||
#if defined(CONFIG_PERF_EVENTS) && defined(CONFIG_CPU_SUP_AMD)
|
||||
extern void amd_pmu_enable_virt(void);
|
||||
extern void amd_pmu_disable_virt(void);
|
||||
#else
|
||||
static inline void amd_pmu_enable_virt(void) { }
|
||||
static inline void amd_pmu_disable_virt(void) { }
|
||||
#endif
|
||||
|
||||
#endif /* _ASM_X86_PERF_EVENT_H */
|
||||
|
||||
@ -456,6 +456,7 @@ struct thread_struct {
|
||||
unsigned long trap_no;
|
||||
unsigned long error_code;
|
||||
/* floating point and extended processor state */
|
||||
unsigned long has_fpu;
|
||||
struct fpu fpu;
|
||||
#ifdef CONFIG_X86_32
|
||||
/* Virtual 86 mode info */
|
||||
|
||||
@ -242,8 +242,6 @@ static inline struct thread_info *current_thread_info(void)
|
||||
* ever touches our thread-synchronous status, so we don't
|
||||
* have to worry about atomic accesses.
|
||||
*/
|
||||
#define TS_USEDFPU 0x0001 /* FPU was used by this task
|
||||
this quantum (SMP) */
|
||||
#define TS_COMPAT 0x0002 /* 32bit syscall active (64BIT)*/
|
||||
#define TS_POLLING 0x0004 /* idle task polling need_resched,
|
||||
skip sending interrupt */
|
||||
|
||||
@ -65,7 +65,7 @@
|
||||
* UV2: Bit 19 selects between
|
||||
* (0): 10 microsecond timebase and
|
||||
* (1): 80 microseconds
|
||||
* we're using 655us, similar to UV1: 65 units of 10us
|
||||
* we're using 560us, similar to UV1: 65 units of 10us
|
||||
*/
|
||||
#define UV1_INTD_SOFT_ACK_TIMEOUT_PERIOD (9UL)
|
||||
#define UV2_INTD_SOFT_ACK_TIMEOUT_PERIOD (15UL)
|
||||
@ -167,6 +167,7 @@
|
||||
#define FLUSH_RETRY_TIMEOUT 2
|
||||
#define FLUSH_GIVEUP 3
|
||||
#define FLUSH_COMPLETE 4
|
||||
#define FLUSH_RETRY_BUSYBUG 5
|
||||
|
||||
/*
|
||||
* tuning the action when the numalink network is extremely delayed
|
||||
@ -235,10 +236,10 @@ struct bau_msg_payload {
|
||||
|
||||
|
||||
/*
|
||||
* Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor)
|
||||
* UV1 Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor)
|
||||
* see table 4.2.3.0.1 in broacast_assist spec.
|
||||
*/
|
||||
struct bau_msg_header {
|
||||
struct uv1_bau_msg_header {
|
||||
unsigned int dest_subnodeid:6; /* must be 0x10, for the LB */
|
||||
/* bits 5:0 */
|
||||
unsigned int base_dest_nasid:15; /* nasid of the first bit */
|
||||
@ -317,20 +318,88 @@ struct bau_msg_header {
|
||||
/* bits 127:107 */
|
||||
};
|
||||
|
||||
/*
|
||||
* UV2 Message header: 16 bytes (128 bits) (bytes 0x30-0x3f of descriptor)
|
||||
* see figure 9-2 of harp_sys.pdf
|
||||
*/
|
||||
struct uv2_bau_msg_header {
|
||||
unsigned int base_dest_nasid:15; /* nasid of the first bit */
|
||||
/* bits 14:0 */ /* in uvhub map */
|
||||
unsigned int dest_subnodeid:5; /* must be 0x10, for the LB */
|
||||
/* bits 19:15 */
|
||||
unsigned int rsvd_1:1; /* must be zero */
|
||||
/* bit 20 */
|
||||
/* Address bits 59:21 */
|
||||
/* bits 25:2 of address (44:21) are payload */
|
||||
/* these next 24 bits become bytes 12-14 of msg */
|
||||
/* bits 28:21 land in byte 12 */
|
||||
unsigned int replied_to:1; /* sent as 0 by the source to
|
||||
byte 12 */
|
||||
/* bit 21 */
|
||||
unsigned int msg_type:3; /* software type of the
|
||||
message */
|
||||
/* bits 24:22 */
|
||||
unsigned int canceled:1; /* message canceled, resource
|
||||
is to be freed*/
|
||||
/* bit 25 */
|
||||
unsigned int payload_1:3; /* not currently used */
|
||||
/* bits 28:26 */
|
||||
|
||||
/* bits 36:29 land in byte 13 */
|
||||
unsigned int payload_2a:3; /* not currently used */
|
||||
unsigned int payload_2b:5; /* not currently used */
|
||||
/* bits 36:29 */
|
||||
|
||||
/* bits 44:37 land in byte 14 */
|
||||
unsigned int payload_3:8; /* not currently used */
|
||||
/* bits 44:37 */
|
||||
|
||||
unsigned int rsvd_2:7; /* reserved */
|
||||
/* bits 51:45 */
|
||||
unsigned int swack_flag:1; /* software acknowledge flag */
|
||||
/* bit 52 */
|
||||
unsigned int rsvd_3a:3; /* must be zero */
|
||||
unsigned int rsvd_3b:8; /* must be zero */
|
||||
unsigned int rsvd_3c:8; /* must be zero */
|
||||
unsigned int rsvd_3d:3; /* must be zero */
|
||||
/* bits 74:53 */
|
||||
unsigned int fairness:3; /* usually zero */
|
||||
/* bits 77:75 */
|
||||
|
||||
unsigned int sequence:16; /* message sequence number */
|
||||
/* bits 93:78 Suppl_A */
|
||||
unsigned int chaining:1; /* next descriptor is part of
|
||||
this activation*/
|
||||
/* bit 94 */
|
||||
unsigned int multilevel:1; /* multi-level multicast
|
||||
format */
|
||||
/* bit 95 */
|
||||
unsigned int rsvd_4:24; /* ordered / source node /
|
||||
source subnode / aging
|
||||
must be zero */
|
||||
/* bits 119:96 */
|
||||
unsigned int command:8; /* message type */
|
||||
/* bits 127:120 */
|
||||
};
|
||||
|
||||
/*
|
||||
* The activation descriptor:
|
||||
* The format of the message to send, plus all accompanying control
|
||||
* Should be 64 bytes
|
||||
*/
|
||||
struct bau_desc {
|
||||
struct pnmask distribution;
|
||||
struct pnmask distribution;
|
||||
/*
|
||||
* message template, consisting of header and payload:
|
||||
*/
|
||||
struct bau_msg_header header;
|
||||
struct bau_msg_payload payload;
|
||||
union bau_msg_header {
|
||||
struct uv1_bau_msg_header uv1_hdr;
|
||||
struct uv2_bau_msg_header uv2_hdr;
|
||||
} header;
|
||||
|
||||
struct bau_msg_payload payload;
|
||||
};
|
||||
/*
|
||||
/* UV1:
|
||||
* -payload-- ---------header------
|
||||
* bytes 0-11 bits 41-56 bits 58-81
|
||||
* A B (2) C (3)
|
||||
@ -340,6 +409,16 @@ struct bau_desc {
|
||||
* bytes 0-11 bytes 12-14 bytes 16-17 (byte 15 filled in by hw as vector)
|
||||
* ------------payload queue-----------
|
||||
*/
|
||||
/* UV2:
|
||||
* -payload-- ---------header------
|
||||
* bytes 0-11 bits 70-78 bits 21-44
|
||||
* A B (2) C (3)
|
||||
*
|
||||
* A/B/C are moved to:
|
||||
* A C B
|
||||
* bytes 0-11 bytes 12-14 bytes 16-17 (byte 15 filled in by hw as vector)
|
||||
* ------------payload queue-----------
|
||||
*/
|
||||
|
||||
/*
|
||||
* The payload queue on the destination side is an array of these.
|
||||
@ -385,7 +464,6 @@ struct bau_pq_entry {
|
||||
struct msg_desc {
|
||||
struct bau_pq_entry *msg;
|
||||
int msg_slot;
|
||||
int swack_slot;
|
||||
struct bau_pq_entry *queue_first;
|
||||
struct bau_pq_entry *queue_last;
|
||||
};
|
||||
@ -439,6 +517,9 @@ struct ptc_stats {
|
||||
unsigned long s_retry_messages; /* retry broadcasts */
|
||||
unsigned long s_bau_reenabled; /* for bau enable/disable */
|
||||
unsigned long s_bau_disabled; /* for bau enable/disable */
|
||||
unsigned long s_uv2_wars; /* uv2 workaround, perm. busy */
|
||||
unsigned long s_uv2_wars_hw; /* uv2 workaround, hiwater */
|
||||
unsigned long s_uv2_war_waits; /* uv2 workaround, long waits */
|
||||
/* destination statistics */
|
||||
unsigned long d_alltlb; /* times all tlb's on this
|
||||
cpu were flushed */
|
||||
@ -511,9 +592,12 @@ struct bau_control {
|
||||
short osnode;
|
||||
short uvhub_cpu;
|
||||
short uvhub;
|
||||
short uvhub_version;
|
||||
short cpus_in_socket;
|
||||
short cpus_in_uvhub;
|
||||
short partition_base_pnode;
|
||||
short using_desc; /* an index, like uvhub_cpu */
|
||||
unsigned int inuse_map;
|
||||
unsigned short message_number;
|
||||
unsigned short uvhub_quiesce;
|
||||
short socket_acknowledge_count[DEST_Q_SIZE];
|
||||
@ -531,6 +615,7 @@ struct bau_control {
|
||||
int cong_response_us;
|
||||
int cong_reps;
|
||||
int cong_period;
|
||||
unsigned long clocks_per_100_usec;
|
||||
cycles_t period_time;
|
||||
long period_requests;
|
||||
struct hub_and_pnode *thp;
|
||||
@ -591,6 +676,11 @@ static inline void write_mmr_sw_ack(unsigned long mr)
|
||||
uv_write_local_mmr(UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, mr);
|
||||
}
|
||||
|
||||
static inline void write_gmmr_sw_ack(int pnode, unsigned long mr)
|
||||
{
|
||||
write_gmmr(pnode, UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE_ALIAS, mr);
|
||||
}
|
||||
|
||||
static inline unsigned long read_mmr_sw_ack(void)
|
||||
{
|
||||
return read_lmmr(UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE);
|
||||
|
||||
@ -318,13 +318,13 @@ uv_gpa_in_mmr_space(unsigned long gpa)
|
||||
/* UV global physical address --> socket phys RAM */
|
||||
static inline unsigned long uv_gpa_to_soc_phys_ram(unsigned long gpa)
|
||||
{
|
||||
unsigned long paddr = gpa & uv_hub_info->gpa_mask;
|
||||
unsigned long paddr;
|
||||
unsigned long remap_base = uv_hub_info->lowmem_remap_base;
|
||||
unsigned long remap_top = uv_hub_info->lowmem_remap_top;
|
||||
|
||||
gpa = ((gpa << uv_hub_info->m_shift) >> uv_hub_info->m_shift) |
|
||||
((gpa >> uv_hub_info->n_lshift) << uv_hub_info->m_val);
|
||||
gpa = gpa & uv_hub_info->gpa_mask;
|
||||
paddr = gpa & uv_hub_info->gpa_mask;
|
||||
if (paddr >= remap_base && paddr < remap_base + remap_top)
|
||||
paddr -= remap_base;
|
||||
return paddr;
|
||||
|
||||
@ -119,6 +119,37 @@ bool __init early_is_amd_nb(u32 device)
|
||||
return false;
|
||||
}
|
||||
|
||||
struct resource *amd_get_mmconfig_range(struct resource *res)
|
||||
{
|
||||
u32 address;
|
||||
u64 base, msr;
|
||||
unsigned segn_busn_bits;
|
||||
|
||||
if (boot_cpu_data.x86_vendor != X86_VENDOR_AMD)
|
||||
return NULL;
|
||||
|
||||
/* assume all cpus from fam10h have mmconfig */
|
||||
if (boot_cpu_data.x86 < 0x10)
|
||||
return NULL;
|
||||
|
||||
address = MSR_FAM10H_MMIO_CONF_BASE;
|
||||
rdmsrl(address, msr);
|
||||
|
||||
/* mmconfig is not enabled */
|
||||
if (!(msr & FAM10H_MMIO_CONF_ENABLE))
|
||||
return NULL;
|
||||
|
||||
base = msr & (FAM10H_MMIO_CONF_BASE_MASK<<FAM10H_MMIO_CONF_BASE_SHIFT);
|
||||
|
||||
segn_busn_bits = (msr >> FAM10H_MMIO_CONF_BUSRANGE_SHIFT) &
|
||||
FAM10H_MMIO_CONF_BUSRANGE_MASK;
|
||||
|
||||
res->flags = IORESOURCE_MEM;
|
||||
res->start = base;
|
||||
res->end = base + (1ULL<<(segn_busn_bits + 20)) - 1;
|
||||
return res;
|
||||
}
|
||||
|
||||
int amd_get_subcaches(int cpu)
|
||||
{
|
||||
struct pci_dev *link = node_to_amd_nb(amd_get_nb_id(cpu))->link;
|
||||
|
||||
@ -769,7 +769,12 @@ void __init uv_system_init(void)
|
||||
for(i = 0; i < UVH_NODE_PRESENT_TABLE_DEPTH; i++)
|
||||
uv_possible_blades +=
|
||||
hweight64(uv_read_local_mmr( UVH_NODE_PRESENT_TABLE + i * 8));
|
||||
printk(KERN_DEBUG "UV: Found %d blades\n", uv_num_possible_blades());
|
||||
|
||||
/* uv_num_possible_blades() is really the hub count */
|
||||
printk(KERN_INFO "UV: Found %d blades, %d hubs\n",
|
||||
is_uv1_hub() ? uv_num_possible_blades() :
|
||||
(uv_num_possible_blades() + 1) / 2,
|
||||
uv_num_possible_blades());
|
||||
|
||||
bytes = sizeof(struct uv_blade_info) * uv_num_possible_blades();
|
||||
uv_blade_info = kzalloc(bytes, GFP_KERNEL);
|
||||
|
||||
@ -326,8 +326,7 @@ static void __cpuinit amd_calc_l3_indices(struct amd_northbridge *nb)
|
||||
l3->indices = (max(max3(sc0, sc1, sc2), sc3) << 10) - 1;
|
||||
}
|
||||
|
||||
static void __cpuinit amd_init_l3_cache(struct _cpuid4_info_regs *this_leaf,
|
||||
int index)
|
||||
static void __cpuinit amd_init_l3_cache(struct _cpuid4_info_regs *this_leaf, int index)
|
||||
{
|
||||
int node;
|
||||
|
||||
@ -725,14 +724,16 @@ static DEFINE_PER_CPU(struct _cpuid4_info *, ici_cpuid4_info);
|
||||
#define CPUID4_INFO_IDX(x, y) (&((per_cpu(ici_cpuid4_info, x))[y]))
|
||||
|
||||
#ifdef CONFIG_SMP
|
||||
static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
|
||||
|
||||
static int __cpuinit cache_shared_amd_cpu_map_setup(unsigned int cpu, int index)
|
||||
{
|
||||
struct _cpuid4_info *this_leaf, *sibling_leaf;
|
||||
unsigned long num_threads_sharing;
|
||||
int index_msb, i, sibling;
|
||||
struct _cpuid4_info *this_leaf;
|
||||
int ret, i, sibling;
|
||||
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
||||
|
||||
if ((index == 3) && (c->x86_vendor == X86_VENDOR_AMD)) {
|
||||
ret = 0;
|
||||
if (index == 3) {
|
||||
ret = 1;
|
||||
for_each_cpu(i, cpu_llc_shared_mask(cpu)) {
|
||||
if (!per_cpu(ici_cpuid4_info, i))
|
||||
continue;
|
||||
@ -743,8 +744,35 @@ static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
|
||||
set_bit(sibling, this_leaf->shared_cpu_map);
|
||||
}
|
||||
}
|
||||
return;
|
||||
} else if ((c->x86 == 0x15) && ((index == 1) || (index == 2))) {
|
||||
ret = 1;
|
||||
for_each_cpu(i, cpu_sibling_mask(cpu)) {
|
||||
if (!per_cpu(ici_cpuid4_info, i))
|
||||
continue;
|
||||
this_leaf = CPUID4_INFO_IDX(i, index);
|
||||
for_each_cpu(sibling, cpu_sibling_mask(cpu)) {
|
||||
if (!cpu_online(sibling))
|
||||
continue;
|
||||
set_bit(sibling, this_leaf->shared_cpu_map);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
||||
static void __cpuinit cache_shared_cpu_map_setup(unsigned int cpu, int index)
|
||||
{
|
||||
struct _cpuid4_info *this_leaf, *sibling_leaf;
|
||||
unsigned long num_threads_sharing;
|
||||
int index_msb, i;
|
||||
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
||||
|
||||
if (c->x86_vendor == X86_VENDOR_AMD) {
|
||||
if (cache_shared_amd_cpu_map_setup(cpu, index))
|
||||
return;
|
||||
}
|
||||
|
||||
this_leaf = CPUID4_INFO_IDX(cpu, index);
|
||||
num_threads_sharing = 1 + this_leaf->base.eax.split.num_threads_sharing;
|
||||
|
||||
|
||||
@ -146,7 +146,9 @@ struct cpu_hw_events {
|
||||
/*
|
||||
* AMD specific bits
|
||||
*/
|
||||
struct amd_nb *amd_nb;
|
||||
struct amd_nb *amd_nb;
|
||||
/* Inverted mask of bits to clear in the perf_ctr ctrl registers */
|
||||
u64 perf_ctr_virt_mask;
|
||||
|
||||
void *kfree_on_online;
|
||||
};
|
||||
@ -372,9 +374,11 @@ void x86_pmu_disable_all(void);
|
||||
static inline void __x86_pmu_enable_event(struct hw_perf_event *hwc,
|
||||
u64 enable_mask)
|
||||
{
|
||||
u64 disable_mask = __this_cpu_read(cpu_hw_events.perf_ctr_virt_mask);
|
||||
|
||||
if (hwc->extra_reg.reg)
|
||||
wrmsrl(hwc->extra_reg.reg, hwc->extra_reg.config);
|
||||
wrmsrl(hwc->config_base, hwc->config | enable_mask);
|
||||
wrmsrl(hwc->config_base, (hwc->config | enable_mask) & ~disable_mask);
|
||||
}
|
||||
|
||||
void x86_pmu_enable_all(int added);
|
||||
|
||||
@ -1,4 +1,5 @@
|
||||
#include <linux/perf_event.h>
|
||||
#include <linux/export.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/init.h>
|
||||
#include <linux/slab.h>
|
||||
@ -357,7 +358,9 @@ static void amd_pmu_cpu_starting(int cpu)
|
||||
struct amd_nb *nb;
|
||||
int i, nb_id;
|
||||
|
||||
if (boot_cpu_data.x86_max_cores < 2)
|
||||
cpuc->perf_ctr_virt_mask = AMD_PERFMON_EVENTSEL_HOSTONLY;
|
||||
|
||||
if (boot_cpu_data.x86_max_cores < 2 || boot_cpu_data.x86 == 0x15)
|
||||
return;
|
||||
|
||||
nb_id = amd_get_nb_id(cpu);
|
||||
@ -587,9 +590,9 @@ static __initconst const struct x86_pmu amd_pmu_f15h = {
|
||||
.put_event_constraints = amd_put_event_constraints,
|
||||
|
||||
.cpu_prepare = amd_pmu_cpu_prepare,
|
||||
.cpu_starting = amd_pmu_cpu_starting,
|
||||
.cpu_dead = amd_pmu_cpu_dead,
|
||||
#endif
|
||||
.cpu_starting = amd_pmu_cpu_starting,
|
||||
};
|
||||
|
||||
__init int amd_pmu_init(void)
|
||||
@ -621,3 +624,33 @@ __init int amd_pmu_init(void)
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void amd_pmu_enable_virt(void)
|
||||
{
|
||||
struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
|
||||
|
||||
cpuc->perf_ctr_virt_mask = 0;
|
||||
|
||||
/* Reload all events */
|
||||
x86_pmu_disable_all();
|
||||
x86_pmu_enable_all(0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(amd_pmu_enable_virt);
|
||||
|
||||
void amd_pmu_disable_virt(void)
|
||||
{
|
||||
struct cpu_hw_events *cpuc = &__get_cpu_var(cpu_hw_events);
|
||||
|
||||
/*
|
||||
* We only mask out the Host-only bit so that host-only counting works
|
||||
* when SVM is disabled. If someone sets up a guest-only counter when
|
||||
* SVM is disabled the Guest-only bits still gets set and the counter
|
||||
* will not count anything.
|
||||
*/
|
||||
cpuc->perf_ctr_virt_mask = AMD_PERFMON_EVENTSEL_HOSTONLY;
|
||||
|
||||
/* Reload all events */
|
||||
x86_pmu_disable_all();
|
||||
x86_pmu_enable_all(0);
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(amd_pmu_disable_virt);
|
||||
|
||||
@ -300,13 +300,33 @@ free_table:
|
||||
return state;
|
||||
}
|
||||
|
||||
/*
|
||||
* AMD microcode firmware naming convention, up to family 15h they are in
|
||||
* the legacy file:
|
||||
*
|
||||
* amd-ucode/microcode_amd.bin
|
||||
*
|
||||
* This legacy file is always smaller than 2K in size.
|
||||
*
|
||||
* Starting at family 15h they are in family specific firmware files:
|
||||
*
|
||||
* amd-ucode/microcode_amd_fam15h.bin
|
||||
* amd-ucode/microcode_amd_fam16h.bin
|
||||
* ...
|
||||
*
|
||||
* These might be larger than 2K.
|
||||
*/
|
||||
static enum ucode_state request_microcode_amd(int cpu, struct device *device)
|
||||
{
|
||||
const char *fw_name = "amd-ucode/microcode_amd.bin";
|
||||
char fw_name[36] = "amd-ucode/microcode_amd.bin";
|
||||
const struct firmware *fw;
|
||||
enum ucode_state ret = UCODE_NFOUND;
|
||||
struct cpuinfo_x86 *c = &cpu_data(cpu);
|
||||
|
||||
if (request_firmware(&fw, fw_name, device)) {
|
||||
if (c->x86 >= 0x15)
|
||||
snprintf(fw_name, sizeof(fw_name), "amd-ucode/microcode_amd_fam%.2xh.bin", c->x86);
|
||||
|
||||
if (request_firmware(&fw, (const char *)fw_name, device)) {
|
||||
pr_err("failed to load file %s\n", fw_name);
|
||||
goto out;
|
||||
}
|
||||
|
||||
@ -297,22 +297,11 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
|
||||
*next = &next_p->thread;
|
||||
int cpu = smp_processor_id();
|
||||
struct tss_struct *tss = &per_cpu(init_tss, cpu);
|
||||
bool preload_fpu;
|
||||
fpu_switch_t fpu;
|
||||
|
||||
/* never put a printk in __switch_to... printk() calls wake_up*() indirectly */
|
||||
|
||||
/*
|
||||
* If the task has used fpu the last 5 timeslices, just do a full
|
||||
* restore of the math state immediately to avoid the trap; the
|
||||
* chances of needing FPU soon are obviously high now
|
||||
*/
|
||||
preload_fpu = tsk_used_math(next_p) && next_p->fpu_counter > 5;
|
||||
|
||||
__unlazy_fpu(prev_p);
|
||||
|
||||
/* we're going to use this soon, after a few expensive things */
|
||||
if (preload_fpu)
|
||||
prefetch(next->fpu.state);
|
||||
fpu = switch_fpu_prepare(prev_p, next_p);
|
||||
|
||||
/*
|
||||
* Reload esp0.
|
||||
@ -352,11 +341,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
|
||||
task_thread_info(next_p)->flags & _TIF_WORK_CTXSW_NEXT))
|
||||
__switch_to_xtra(prev_p, next_p, tss);
|
||||
|
||||
/* If we're going to preload the fpu context, make sure clts
|
||||
is run while we're batching the cpu state updates. */
|
||||
if (preload_fpu)
|
||||
clts();
|
||||
|
||||
/*
|
||||
* Leave lazy mode, flushing any hypercalls made here.
|
||||
* This must be done before restoring TLS segments so
|
||||
@ -366,15 +350,14 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
|
||||
*/
|
||||
arch_end_context_switch(next_p);
|
||||
|
||||
if (preload_fpu)
|
||||
__math_state_restore();
|
||||
|
||||
/*
|
||||
* Restore %gs if needed (which is common)
|
||||
*/
|
||||
if (prev->gs | next->gs)
|
||||
lazy_load_gs(next->gs);
|
||||
|
||||
switch_fpu_finish(next_p, fpu);
|
||||
|
||||
percpu_write(current_task, next_p);
|
||||
|
||||
return prev_p;
|
||||
|
||||
@ -381,18 +381,9 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
|
||||
int cpu = smp_processor_id();
|
||||
struct tss_struct *tss = &per_cpu(init_tss, cpu);
|
||||
unsigned fsindex, gsindex;
|
||||
bool preload_fpu;
|
||||
fpu_switch_t fpu;
|
||||
|
||||
/*
|
||||
* If the task has used fpu the last 5 timeslices, just do a full
|
||||
* restore of the math state immediately to avoid the trap; the
|
||||
* chances of needing FPU soon are obviously high now
|
||||
*/
|
||||
preload_fpu = tsk_used_math(next_p) && next_p->fpu_counter > 5;
|
||||
|
||||
/* we're going to use this soon, after a few expensive things */
|
||||
if (preload_fpu)
|
||||
prefetch(next->fpu.state);
|
||||
fpu = switch_fpu_prepare(prev_p, next_p);
|
||||
|
||||
/*
|
||||
* Reload esp0, LDT and the page table pointer:
|
||||
@ -422,13 +413,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
|
||||
|
||||
load_TLS(next, cpu);
|
||||
|
||||
/* Must be after DS reload */
|
||||
__unlazy_fpu(prev_p);
|
||||
|
||||
/* Make sure cpu is ready for new context */
|
||||
if (preload_fpu)
|
||||
clts();
|
||||
|
||||
/*
|
||||
* Leave lazy mode, flushing any hypercalls made here.
|
||||
* This must be done before restoring TLS segments so
|
||||
@ -469,6 +453,8 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
|
||||
wrmsrl(MSR_KERNEL_GS_BASE, next->gs);
|
||||
prev->gsindex = gsindex;
|
||||
|
||||
switch_fpu_finish(next_p, fpu);
|
||||
|
||||
/*
|
||||
* Switch the PDA and FPU contexts.
|
||||
*/
|
||||
@ -487,13 +473,6 @@ __switch_to(struct task_struct *prev_p, struct task_struct *next_p)
|
||||
task_thread_info(prev_p)->flags & _TIF_WORK_CTXSW_PREV))
|
||||
__switch_to_xtra(prev_p, next_p, tss);
|
||||
|
||||
/*
|
||||
* Preload the FPU context, now that we've determined that the
|
||||
* task is likely to be using it.
|
||||
*/
|
||||
if (preload_fpu)
|
||||
__math_state_restore();
|
||||
|
||||
return prev_p;
|
||||
}
|
||||
|
||||
|
||||
@ -562,25 +562,34 @@ asmlinkage void __attribute__((weak)) smp_threshold_interrupt(void)
|
||||
}
|
||||
|
||||
/*
|
||||
* __math_state_restore assumes that cr0.TS is already clear and the
|
||||
* fpu state is all ready for use. Used during context switch.
|
||||
* This gets called with the process already owning the
|
||||
* FPU state, and with CR0.TS cleared. It just needs to
|
||||
* restore the FPU register state.
|
||||
*/
|
||||
void __math_state_restore(void)
|
||||
void __math_state_restore(struct task_struct *tsk)
|
||||
{
|
||||
struct thread_info *thread = current_thread_info();
|
||||
struct task_struct *tsk = thread->task;
|
||||
/* We need a safe address that is cheap to find and that is already
|
||||
in L1. We've just brought in "tsk->thread.has_fpu", so use that */
|
||||
#define safe_address (tsk->thread.has_fpu)
|
||||
|
||||
/* AMD K7/K8 CPUs don't save/restore FDP/FIP/FOP unless an exception
|
||||
is pending. Clear the x87 state here by setting it to fixed
|
||||
values. safe_address is a random variable that should be in L1 */
|
||||
alternative_input(
|
||||
ASM_NOP8 ASM_NOP2,
|
||||
"emms\n\t" /* clear stack tags */
|
||||
"fildl %P[addr]", /* set F?P to defined value */
|
||||
X86_FEATURE_FXSAVE_LEAK,
|
||||
[addr] "m" (safe_address));
|
||||
|
||||
/*
|
||||
* Paranoid restore. send a SIGSEGV if we fail to restore the state.
|
||||
*/
|
||||
if (unlikely(restore_fpu_checking(tsk))) {
|
||||
stts();
|
||||
__thread_fpu_end(tsk);
|
||||
force_sig(SIGSEGV, tsk);
|
||||
return;
|
||||
}
|
||||
|
||||
thread->status |= TS_USEDFPU; /* So we fnsave on switch_to() */
|
||||
tsk->fpu_counter++;
|
||||
}
|
||||
|
||||
/*
|
||||
@ -590,13 +599,12 @@ void __math_state_restore(void)
|
||||
* Careful.. There are problems with IBM-designed IRQ13 behaviour.
|
||||
* Don't touch unless you *really* know how it works.
|
||||
*
|
||||
* Must be called with kernel preemption disabled (in this case,
|
||||
* local interrupts are disabled at the call-site in entry.S).
|
||||
* Must be called with kernel preemption disabled (eg with local
|
||||
* local interrupts as in the case of do_device_not_available).
|
||||
*/
|
||||
asmlinkage void math_state_restore(void)
|
||||
void math_state_restore(void)
|
||||
{
|
||||
struct thread_info *thread = current_thread_info();
|
||||
struct task_struct *tsk = thread->task;
|
||||
struct task_struct *tsk = current;
|
||||
|
||||
if (!tsk_used_math(tsk)) {
|
||||
local_irq_enable();
|
||||
@ -613,9 +621,10 @@ asmlinkage void math_state_restore(void)
|
||||
local_irq_disable();
|
||||
}
|
||||
|
||||
clts(); /* Allow maths ops (or we recurse) */
|
||||
__thread_fpu_begin(tsk);
|
||||
__math_state_restore(tsk);
|
||||
|
||||
__math_state_restore();
|
||||
tsk->fpu_counter++;
|
||||
}
|
||||
EXPORT_SYMBOL_GPL(math_state_restore);
|
||||
|
||||
|
||||
@ -47,7 +47,7 @@ void __sanitize_i387_state(struct task_struct *tsk)
|
||||
if (!fx)
|
||||
return;
|
||||
|
||||
BUG_ON(task_thread_info(tsk)->status & TS_USEDFPU);
|
||||
BUG_ON(__thread_has_fpu(tsk));
|
||||
|
||||
xstate_bv = tsk->thread.fpu.state->xsave.xsave_hdr.xstate_bv;
|
||||
|
||||
@ -168,7 +168,7 @@ int save_i387_xstate(void __user *buf)
|
||||
if (!used_math())
|
||||
return 0;
|
||||
|
||||
if (task_thread_info(tsk)->status & TS_USEDFPU) {
|
||||
if (user_has_fpu()) {
|
||||
if (use_xsave())
|
||||
err = xsave_user(buf);
|
||||
else
|
||||
@ -176,8 +176,7 @@ int save_i387_xstate(void __user *buf)
|
||||
|
||||
if (err)
|
||||
return err;
|
||||
task_thread_info(tsk)->status &= ~TS_USEDFPU;
|
||||
stts();
|
||||
user_fpu_end();
|
||||
} else {
|
||||
sanitize_i387_state(tsk);
|
||||
if (__copy_to_user(buf, &tsk->thread.fpu.state->fxsave,
|
||||
@ -292,10 +291,7 @@ int restore_i387_xstate(void __user *buf)
|
||||
return err;
|
||||
}
|
||||
|
||||
if (!(task_thread_info(current)->status & TS_USEDFPU)) {
|
||||
clts();
|
||||
task_thread_info(current)->status |= TS_USEDFPU;
|
||||
}
|
||||
user_fpu_begin();
|
||||
if (use_xsave())
|
||||
err = restore_user_xstate(buf);
|
||||
else
|
||||
|
||||
@ -29,6 +29,7 @@
|
||||
#include <linux/ftrace_event.h>
|
||||
#include <linux/slab.h>
|
||||
|
||||
#include <asm/perf_event.h>
|
||||
#include <asm/tlbflush.h>
|
||||
#include <asm/desc.h>
|
||||
#include <asm/kvm_para.h>
|
||||
@ -575,6 +576,8 @@ static void svm_hardware_disable(void *garbage)
|
||||
wrmsrl(MSR_AMD64_TSC_RATIO, TSC_RATIO_DEFAULT);
|
||||
|
||||
cpu_svm_disable();
|
||||
|
||||
amd_pmu_disable_virt();
|
||||
}
|
||||
|
||||
static int svm_hardware_enable(void *garbage)
|
||||
@ -622,6 +625,8 @@ static int svm_hardware_enable(void *garbage)
|
||||
|
||||
svm_init_erratum_383();
|
||||
|
||||
amd_pmu_enable_virt();
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
@ -1456,7 +1456,7 @@ static void __vmx_load_host_state(struct vcpu_vmx *vmx)
|
||||
#ifdef CONFIG_X86_64
|
||||
wrmsrl(MSR_KERNEL_GS_BASE, vmx->msr_host_kernel_gs_base);
|
||||
#endif
|
||||
if (current_thread_info()->status & TS_USEDFPU)
|
||||
if (__thread_has_fpu(current))
|
||||
clts();
|
||||
load_gdt(&__get_cpu_var(host_gdt));
|
||||
}
|
||||
|
||||
@ -75,9 +75,9 @@ static unsigned long mmap_rnd(void)
|
||||
*/
|
||||
if (current->flags & PF_RANDOMIZE) {
|
||||
if (mmap_is_ia32())
|
||||
rnd = (long)get_random_int() % (1<<8);
|
||||
rnd = get_random_int() % (1<<8);
|
||||
else
|
||||
rnd = (long)(get_random_int() % (1<<28));
|
||||
rnd = get_random_int() % (1<<28);
|
||||
}
|
||||
return rnd << PAGE_SHIFT;
|
||||
}
|
||||
|
||||
@ -104,6 +104,8 @@ acpi_numa_processor_affinity_init(struct acpi_srat_cpu_affinity *pa)
|
||||
if ((pa->flags & ACPI_SRAT_CPU_ENABLED) == 0)
|
||||
return;
|
||||
pxm = pa->proximity_domain_lo;
|
||||
if (acpi_srat_revision >= 2)
|
||||
pxm |= *((unsigned int*)pa->proximity_domain_hi) << 8;
|
||||
node = setup_node(pxm);
|
||||
if (node < 0) {
|
||||
printk(KERN_ERR "SRAT: Too many proximity domains %x\n", pxm);
|
||||
@ -155,6 +157,8 @@ acpi_numa_memory_affinity_init(struct acpi_srat_mem_affinity *ma)
|
||||
start = ma->base_address;
|
||||
end = start + ma->length;
|
||||
pxm = ma->proximity_domain;
|
||||
if (acpi_srat_revision <= 1)
|
||||
pxm &= 0xff;
|
||||
node = setup_node(pxm);
|
||||
if (node < 0) {
|
||||
printk(KERN_ERR "SRAT: Too many proximity domains.\n");
|
||||
|
||||
@ -151,17 +151,18 @@ void bpf_jit_compile(struct sk_filter *fp)
|
||||
cleanup_addr = proglen; /* epilogue address */
|
||||
|
||||
for (pass = 0; pass < 10; pass++) {
|
||||
u8 seen_or_pass0 = (pass == 0) ? (SEEN_XREG | SEEN_DATAREF | SEEN_MEM) : seen;
|
||||
/* no prologue/epilogue for trivial filters (RET something) */
|
||||
proglen = 0;
|
||||
prog = temp;
|
||||
|
||||
if (seen) {
|
||||
if (seen_or_pass0) {
|
||||
EMIT4(0x55, 0x48, 0x89, 0xe5); /* push %rbp; mov %rsp,%rbp */
|
||||
EMIT4(0x48, 0x83, 0xec, 96); /* subq $96,%rsp */
|
||||
/* note : must save %rbx in case bpf_error is hit */
|
||||
if (seen & (SEEN_XREG | SEEN_DATAREF))
|
||||
if (seen_or_pass0 & (SEEN_XREG | SEEN_DATAREF))
|
||||
EMIT4(0x48, 0x89, 0x5d, 0xf8); /* mov %rbx, -8(%rbp) */
|
||||
if (seen & SEEN_XREG)
|
||||
if (seen_or_pass0 & SEEN_XREG)
|
||||
CLEAR_X(); /* make sure we dont leek kernel memory */
|
||||
|
||||
/*
|
||||
@ -170,7 +171,7 @@ void bpf_jit_compile(struct sk_filter *fp)
|
||||
* r9 = skb->len - skb->data_len
|
||||
* r8 = skb->data
|
||||
*/
|
||||
if (seen & SEEN_DATAREF) {
|
||||
if (seen_or_pass0 & SEEN_DATAREF) {
|
||||
if (offsetof(struct sk_buff, len) <= 127)
|
||||
/* mov off8(%rdi),%r9d */
|
||||
EMIT4(0x44, 0x8b, 0x4f, offsetof(struct sk_buff, len));
|
||||
@ -260,9 +261,14 @@ void bpf_jit_compile(struct sk_filter *fp)
|
||||
case BPF_S_ALU_DIV_X: /* A /= X; */
|
||||
seen |= SEEN_XREG;
|
||||
EMIT2(0x85, 0xdb); /* test %ebx,%ebx */
|
||||
if (pc_ret0 != -1)
|
||||
EMIT_COND_JMP(X86_JE, addrs[pc_ret0] - (addrs[i] - 4));
|
||||
else {
|
||||
if (pc_ret0 > 0) {
|
||||
/* addrs[pc_ret0 - 1] is start address of target
|
||||
* (addrs[i] - 4) is the address following this jmp
|
||||
* ("xor %edx,%edx; div %ebx" being 4 bytes long)
|
||||
*/
|
||||
EMIT_COND_JMP(X86_JE, addrs[pc_ret0 - 1] -
|
||||
(addrs[i] - 4));
|
||||
} else {
|
||||
EMIT_COND_JMP(X86_JNE, 2 + 5);
|
||||
CLEAR_A();
|
||||
EMIT1_off32(0xe9, cleanup_addr - (addrs[i] - 4)); /* jmp .+off32 */
|
||||
@ -335,12 +341,12 @@ void bpf_jit_compile(struct sk_filter *fp)
|
||||
}
|
||||
/* fallinto */
|
||||
case BPF_S_RET_A:
|
||||
if (seen) {
|
||||
if (seen_or_pass0) {
|
||||
if (i != flen - 1) {
|
||||
EMIT_JMP(cleanup_addr - addrs[i]);
|
||||
break;
|
||||
}
|
||||
if (seen & SEEN_XREG)
|
||||
if (seen_or_pass0 & SEEN_XREG)
|
||||
EMIT4(0x48, 0x8b, 0x5d, 0xf8); /* mov -8(%rbp),%rbx */
|
||||
EMIT1(0xc9); /* leaveq */
|
||||
}
|
||||
@ -483,8 +489,9 @@ common_load: seen |= SEEN_DATAREF;
|
||||
goto common_load;
|
||||
case BPF_S_LDX_B_MSH:
|
||||
if ((int)K < 0) {
|
||||
if (pc_ret0 != -1) {
|
||||
EMIT_JMP(addrs[pc_ret0] - addrs[i]);
|
||||
if (pc_ret0 > 0) {
|
||||
/* addrs[pc_ret0 - 1] is the start address */
|
||||
EMIT_JMP(addrs[pc_ret0 - 1] - addrs[i]);
|
||||
break;
|
||||
}
|
||||
CLEAR_A();
|
||||
@ -599,13 +606,14 @@ cond_branch: f_offset = addrs[i + filter[i].jf] - addrs[i];
|
||||
* use it to give the cleanup instruction(s) addr
|
||||
*/
|
||||
cleanup_addr = proglen - 1; /* ret */
|
||||
if (seen)
|
||||
if (seen_or_pass0)
|
||||
cleanup_addr -= 1; /* leaveq */
|
||||
if (seen & SEEN_XREG)
|
||||
if (seen_or_pass0 & SEEN_XREG)
|
||||
cleanup_addr -= 4; /* mov -8(%rbp),%rbx */
|
||||
|
||||
if (image) {
|
||||
WARN_ON(proglen != oldproglen);
|
||||
if (proglen != oldproglen)
|
||||
pr_err("bpb_jit_compile proglen=%u != oldproglen=%u\n", proglen, oldproglen);
|
||||
break;
|
||||
}
|
||||
if (proglen == oldproglen) {
|
||||
|
||||
@ -18,8 +18,9 @@ obj-$(CONFIG_X86_NUMAQ) += numaq_32.o
|
||||
obj-$(CONFIG_X86_MRST) += mrst.o
|
||||
|
||||
obj-y += common.o early.o
|
||||
obj-y += amd_bus.o bus_numa.o
|
||||
obj-y += bus_numa.o
|
||||
|
||||
obj-$(CONFIG_AMD_NB) += amd_bus.o
|
||||
obj-$(CONFIG_PCI_CNB20LE_QUIRK) += broadcom_bus.o
|
||||
|
||||
ifeq ($(CONFIG_PCI_DEBUG),y)
|
||||
|
||||
@ -149,7 +149,7 @@ setup_resource(struct acpi_resource *acpi_res, void *data)
|
||||
struct acpi_resource_address64 addr;
|
||||
acpi_status status;
|
||||
unsigned long flags;
|
||||
u64 start, end;
|
||||
u64 start, orig_end, end;
|
||||
|
||||
status = resource_to_addr(acpi_res, &addr);
|
||||
if (!ACPI_SUCCESS(status))
|
||||
@ -165,7 +165,21 @@ setup_resource(struct acpi_resource *acpi_res, void *data)
|
||||
return AE_OK;
|
||||
|
||||
start = addr.minimum + addr.translation_offset;
|
||||
end = addr.maximum + addr.translation_offset;
|
||||
orig_end = end = addr.maximum + addr.translation_offset;
|
||||
|
||||
/* Exclude non-addressable range or non-addressable portion of range */
|
||||
end = min(end, (u64)iomem_resource.end);
|
||||
if (end <= start) {
|
||||
dev_info(&info->bridge->dev,
|
||||
"host bridge window [%#llx-%#llx] "
|
||||
"(ignored, not CPU addressable)\n", start, orig_end);
|
||||
return AE_OK;
|
||||
} else if (orig_end != end) {
|
||||
dev_info(&info->bridge->dev,
|
||||
"host bridge window [%#llx-%#llx] "
|
||||
"([%#llx-%#llx] ignored, not CPU addressable)\n",
|
||||
start, orig_end, end + 1, orig_end);
|
||||
}
|
||||
|
||||
res = &info->res[info->res_num];
|
||||
res->name = info->name;
|
||||
|
||||
@ -30,34 +30,6 @@ static struct pci_hostbridge_probe pci_probes[] __initdata = {
|
||||
{ 0, 0x18, PCI_VENDOR_ID_AMD, 0x1300 },
|
||||
};
|
||||
|
||||
static u64 __initdata fam10h_mmconf_start;
|
||||
static u64 __initdata fam10h_mmconf_end;
|
||||
static void __init get_pci_mmcfg_amd_fam10h_range(void)
|
||||
{
|
||||
u32 address;
|
||||
u64 base, msr;
|
||||
unsigned segn_busn_bits;
|
||||
|
||||
/* assume all cpus from fam10h have mmconf */
|
||||
if (boot_cpu_data.x86 < 0x10)
|
||||
return;
|
||||
|
||||
address = MSR_FAM10H_MMIO_CONF_BASE;
|
||||
rdmsrl(address, msr);
|
||||
|
||||
/* mmconfig is not enable */
|
||||
if (!(msr & FAM10H_MMIO_CONF_ENABLE))
|
||||
return;
|
||||
|
||||
base = msr & (FAM10H_MMIO_CONF_BASE_MASK<<FAM10H_MMIO_CONF_BASE_SHIFT);
|
||||
|
||||
segn_busn_bits = (msr >> FAM10H_MMIO_CONF_BUSRANGE_SHIFT) &
|
||||
FAM10H_MMIO_CONF_BUSRANGE_MASK;
|
||||
|
||||
fam10h_mmconf_start = base;
|
||||
fam10h_mmconf_end = base + (1ULL<<(segn_busn_bits + 20)) - 1;
|
||||
}
|
||||
|
||||
#define RANGE_NUM 16
|
||||
|
||||
/**
|
||||
@ -85,6 +57,9 @@ static int __init early_fill_mp_bus_info(void)
|
||||
u64 val;
|
||||
u32 address;
|
||||
bool found;
|
||||
struct resource fam10h_mmconf_res, *fam10h_mmconf;
|
||||
u64 fam10h_mmconf_start;
|
||||
u64 fam10h_mmconf_end;
|
||||
|
||||
if (!early_pci_allowed())
|
||||
return -1;
|
||||
@ -211,12 +186,17 @@ static int __init early_fill_mp_bus_info(void)
|
||||
subtract_range(range, RANGE_NUM, 0, end);
|
||||
|
||||
/* get mmconfig */
|
||||
get_pci_mmcfg_amd_fam10h_range();
|
||||
fam10h_mmconf = amd_get_mmconfig_range(&fam10h_mmconf_res);
|
||||
/* need to take out mmconf range */
|
||||
if (fam10h_mmconf_end) {
|
||||
printk(KERN_DEBUG "Fam 10h mmconf [%llx, %llx]\n", fam10h_mmconf_start, fam10h_mmconf_end);
|
||||
if (fam10h_mmconf) {
|
||||
printk(KERN_DEBUG "Fam 10h mmconf %pR\n", fam10h_mmconf);
|
||||
fam10h_mmconf_start = fam10h_mmconf->start;
|
||||
fam10h_mmconf_end = fam10h_mmconf->end;
|
||||
subtract_range(range, RANGE_NUM, fam10h_mmconf_start,
|
||||
fam10h_mmconf_end + 1);
|
||||
} else {
|
||||
fam10h_mmconf_start = 0;
|
||||
fam10h_mmconf_end = 0;
|
||||
}
|
||||
|
||||
/* mmio resource */
|
||||
|
||||
@ -374,7 +374,7 @@ int __init pci_xen_init(void)
|
||||
|
||||
int __init pci_xen_hvm_init(void)
|
||||
{
|
||||
if (!xen_feature(XENFEAT_hvm_pirqs))
|
||||
if (!xen_have_vector_callback || !xen_feature(XENFEAT_hvm_pirqs))
|
||||
return 0;
|
||||
|
||||
#ifdef CONFIG_ACPI
|
||||
|
||||
@ -157,13 +157,14 @@ static int __init uvhub_to_first_apicid(int uvhub)
|
||||
* clear of the Timeout bit (as well) will free the resource. No reply will
|
||||
* be sent (the hardware will only do one reply per message).
|
||||
*/
|
||||
static void reply_to_message(struct msg_desc *mdp, struct bau_control *bcp)
|
||||
static void reply_to_message(struct msg_desc *mdp, struct bau_control *bcp,
|
||||
int do_acknowledge)
|
||||
{
|
||||
unsigned long dw;
|
||||
struct bau_pq_entry *msg;
|
||||
|
||||
msg = mdp->msg;
|
||||
if (!msg->canceled) {
|
||||
if (!msg->canceled && do_acknowledge) {
|
||||
dw = (msg->swack_vec << UV_SW_ACK_NPENDING) | msg->swack_vec;
|
||||
write_mmr_sw_ack(dw);
|
||||
}
|
||||
@ -212,8 +213,8 @@ static void bau_process_retry_msg(struct msg_desc *mdp,
|
||||
if (mmr & (msg_res << UV_SW_ACK_NPENDING)) {
|
||||
unsigned long mr;
|
||||
/*
|
||||
* is the resource timed out?
|
||||
* make everyone ignore the cancelled message.
|
||||
* Is the resource timed out?
|
||||
* Make everyone ignore the cancelled message.
|
||||
*/
|
||||
msg2->canceled = 1;
|
||||
stat->d_canceled++;
|
||||
@ -231,8 +232,8 @@ static void bau_process_retry_msg(struct msg_desc *mdp,
|
||||
* Do all the things a cpu should do for a TLB shootdown message.
|
||||
* Other cpu's may come here at the same time for this message.
|
||||
*/
|
||||
static void bau_process_message(struct msg_desc *mdp,
|
||||
struct bau_control *bcp)
|
||||
static void bau_process_message(struct msg_desc *mdp, struct bau_control *bcp,
|
||||
int do_acknowledge)
|
||||
{
|
||||
short socket_ack_count = 0;
|
||||
short *sp;
|
||||
@ -284,8 +285,9 @@ static void bau_process_message(struct msg_desc *mdp,
|
||||
if (msg_ack_count == bcp->cpus_in_uvhub) {
|
||||
/*
|
||||
* All cpus in uvhub saw it; reply
|
||||
* (unless we are in the UV2 workaround)
|
||||
*/
|
||||
reply_to_message(mdp, bcp);
|
||||
reply_to_message(mdp, bcp, do_acknowledge);
|
||||
}
|
||||
}
|
||||
|
||||
@ -491,27 +493,138 @@ static int uv1_wait_completion(struct bau_desc *bau_desc,
|
||||
/*
|
||||
* UV2 has an extra bit of status in the ACTIVATION_STATUS_2 register.
|
||||
*/
|
||||
static unsigned long uv2_read_status(unsigned long offset, int rshft, int cpu)
|
||||
static unsigned long uv2_read_status(unsigned long offset, int rshft, int desc)
|
||||
{
|
||||
unsigned long descriptor_status;
|
||||
unsigned long descriptor_status2;
|
||||
|
||||
descriptor_status = ((read_lmmr(offset) >> rshft) & UV_ACT_STATUS_MASK);
|
||||
descriptor_status2 = (read_mmr_uv2_status() >> cpu) & 0x1UL;
|
||||
descriptor_status2 = (read_mmr_uv2_status() >> desc) & 0x1UL;
|
||||
descriptor_status = (descriptor_status << 1) | descriptor_status2;
|
||||
return descriptor_status;
|
||||
}
|
||||
|
||||
/*
|
||||
* Return whether the status of the descriptor that is normally used for this
|
||||
* cpu (the one indexed by its hub-relative cpu number) is busy.
|
||||
* The status of the original 32 descriptors is always reflected in the 64
|
||||
* bits of UVH_LB_BAU_SB_ACTIVATION_STATUS_0.
|
||||
* The bit provided by the activation_status_2 register is irrelevant to
|
||||
* the status if it is only being tested for busy or not busy.
|
||||
*/
|
||||
int normal_busy(struct bau_control *bcp)
|
||||
{
|
||||
int cpu = bcp->uvhub_cpu;
|
||||
int mmr_offset;
|
||||
int right_shift;
|
||||
|
||||
mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_0;
|
||||
right_shift = cpu * UV_ACT_STATUS_SIZE;
|
||||
return (((((read_lmmr(mmr_offset) >> right_shift) &
|
||||
UV_ACT_STATUS_MASK)) << 1) == UV2H_DESC_BUSY);
|
||||
}
|
||||
|
||||
/*
|
||||
* Entered when a bau descriptor has gone into a permanent busy wait because
|
||||
* of a hardware bug.
|
||||
* Workaround the bug.
|
||||
*/
|
||||
int handle_uv2_busy(struct bau_control *bcp)
|
||||
{
|
||||
int busy_one = bcp->using_desc;
|
||||
int normal = bcp->uvhub_cpu;
|
||||
int selected = -1;
|
||||
int i;
|
||||
unsigned long descriptor_status;
|
||||
unsigned long status;
|
||||
int mmr_offset;
|
||||
struct bau_desc *bau_desc_old;
|
||||
struct bau_desc *bau_desc_new;
|
||||
struct bau_control *hmaster = bcp->uvhub_master;
|
||||
struct ptc_stats *stat = bcp->statp;
|
||||
cycles_t ttm;
|
||||
|
||||
stat->s_uv2_wars++;
|
||||
spin_lock(&hmaster->uvhub_lock);
|
||||
/* try for the original first */
|
||||
if (busy_one != normal) {
|
||||
if (!normal_busy(bcp))
|
||||
selected = normal;
|
||||
}
|
||||
if (selected < 0) {
|
||||
/* can't use the normal, select an alternate */
|
||||
mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_1;
|
||||
descriptor_status = read_lmmr(mmr_offset);
|
||||
|
||||
/* scan available descriptors 32-63 */
|
||||
for (i = 0; i < UV_CPUS_PER_AS; i++) {
|
||||
if ((hmaster->inuse_map & (1 << i)) == 0) {
|
||||
status = ((descriptor_status >>
|
||||
(i * UV_ACT_STATUS_SIZE)) &
|
||||
UV_ACT_STATUS_MASK) << 1;
|
||||
if (status != UV2H_DESC_BUSY) {
|
||||
selected = i + UV_CPUS_PER_AS;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (busy_one != normal)
|
||||
/* mark the busy alternate as not in-use */
|
||||
hmaster->inuse_map &= ~(1 << (busy_one - UV_CPUS_PER_AS));
|
||||
|
||||
if (selected >= 0) {
|
||||
/* switch to the selected descriptor */
|
||||
if (selected != normal) {
|
||||
/* set the selected alternate as in-use */
|
||||
hmaster->inuse_map |=
|
||||
(1 << (selected - UV_CPUS_PER_AS));
|
||||
if (selected > stat->s_uv2_wars_hw)
|
||||
stat->s_uv2_wars_hw = selected;
|
||||
}
|
||||
bau_desc_old = bcp->descriptor_base;
|
||||
bau_desc_old += (ITEMS_PER_DESC * busy_one);
|
||||
bcp->using_desc = selected;
|
||||
bau_desc_new = bcp->descriptor_base;
|
||||
bau_desc_new += (ITEMS_PER_DESC * selected);
|
||||
*bau_desc_new = *bau_desc_old;
|
||||
} else {
|
||||
/*
|
||||
* All are busy. Wait for the normal one for this cpu to
|
||||
* free up.
|
||||
*/
|
||||
stat->s_uv2_war_waits++;
|
||||
spin_unlock(&hmaster->uvhub_lock);
|
||||
ttm = get_cycles();
|
||||
do {
|
||||
cpu_relax();
|
||||
} while (normal_busy(bcp));
|
||||
spin_lock(&hmaster->uvhub_lock);
|
||||
/* switch to the original descriptor */
|
||||
bcp->using_desc = normal;
|
||||
bau_desc_old = bcp->descriptor_base;
|
||||
bau_desc_old += (ITEMS_PER_DESC * bcp->using_desc);
|
||||
bcp->using_desc = (ITEMS_PER_DESC * normal);
|
||||
bau_desc_new = bcp->descriptor_base;
|
||||
bau_desc_new += (ITEMS_PER_DESC * normal);
|
||||
*bau_desc_new = *bau_desc_old; /* copy the entire descriptor */
|
||||
}
|
||||
spin_unlock(&hmaster->uvhub_lock);
|
||||
return FLUSH_RETRY_BUSYBUG;
|
||||
}
|
||||
|
||||
static int uv2_wait_completion(struct bau_desc *bau_desc,
|
||||
unsigned long mmr_offset, int right_shift,
|
||||
struct bau_control *bcp, long try)
|
||||
{
|
||||
unsigned long descriptor_stat;
|
||||
cycles_t ttm;
|
||||
int cpu = bcp->uvhub_cpu;
|
||||
int desc = bcp->using_desc;
|
||||
long busy_reps = 0;
|
||||
struct ptc_stats *stat = bcp->statp;
|
||||
|
||||
descriptor_stat = uv2_read_status(mmr_offset, right_shift, cpu);
|
||||
descriptor_stat = uv2_read_status(mmr_offset, right_shift, desc);
|
||||
|
||||
/* spin on the status MMR, waiting for it to go idle */
|
||||
while (descriptor_stat != UV2H_DESC_IDLE) {
|
||||
@ -542,12 +655,23 @@ static int uv2_wait_completion(struct bau_desc *bau_desc,
|
||||
bcp->conseccompletes = 0;
|
||||
return FLUSH_RETRY_TIMEOUT;
|
||||
} else {
|
||||
busy_reps++;
|
||||
if (busy_reps > 1000000) {
|
||||
/* not to hammer on the clock */
|
||||
busy_reps = 0;
|
||||
ttm = get_cycles();
|
||||
if ((ttm - bcp->send_message) >
|
||||
(bcp->clocks_per_100_usec)) {
|
||||
return handle_uv2_busy(bcp);
|
||||
}
|
||||
}
|
||||
/*
|
||||
* descriptor_stat is still BUSY
|
||||
*/
|
||||
cpu_relax();
|
||||
}
|
||||
descriptor_stat = uv2_read_status(mmr_offset, right_shift, cpu);
|
||||
descriptor_stat = uv2_read_status(mmr_offset, right_shift,
|
||||
desc);
|
||||
}
|
||||
bcp->conseccompletes++;
|
||||
return FLUSH_COMPLETE;
|
||||
@ -563,17 +687,17 @@ static int wait_completion(struct bau_desc *bau_desc,
|
||||
{
|
||||
int right_shift;
|
||||
unsigned long mmr_offset;
|
||||
int cpu = bcp->uvhub_cpu;
|
||||
int desc = bcp->using_desc;
|
||||
|
||||
if (cpu < UV_CPUS_PER_AS) {
|
||||
if (desc < UV_CPUS_PER_AS) {
|
||||
mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_0;
|
||||
right_shift = cpu * UV_ACT_STATUS_SIZE;
|
||||
right_shift = desc * UV_ACT_STATUS_SIZE;
|
||||
} else {
|
||||
mmr_offset = UVH_LB_BAU_SB_ACTIVATION_STATUS_1;
|
||||
right_shift = ((cpu - UV_CPUS_PER_AS) * UV_ACT_STATUS_SIZE);
|
||||
right_shift = ((desc - UV_CPUS_PER_AS) * UV_ACT_STATUS_SIZE);
|
||||
}
|
||||
|
||||
if (is_uv1_hub())
|
||||
if (bcp->uvhub_version == 1)
|
||||
return uv1_wait_completion(bau_desc, mmr_offset, right_shift,
|
||||
bcp, try);
|
||||
else
|
||||
@ -752,19 +876,22 @@ static void handle_cmplt(int completion_status, struct bau_desc *bau_desc,
|
||||
* Returns 1 if it gives up entirely and the original cpu mask is to be
|
||||
* returned to the kernel.
|
||||
*/
|
||||
int uv_flush_send_and_wait(struct bau_desc *bau_desc,
|
||||
struct cpumask *flush_mask, struct bau_control *bcp)
|
||||
int uv_flush_send_and_wait(struct cpumask *flush_mask, struct bau_control *bcp)
|
||||
{
|
||||
int seq_number = 0;
|
||||
int completion_stat = 0;
|
||||
int uv1 = 0;
|
||||
long try = 0;
|
||||
unsigned long index;
|
||||
cycles_t time1;
|
||||
cycles_t time2;
|
||||
struct ptc_stats *stat = bcp->statp;
|
||||
struct bau_control *hmaster = bcp->uvhub_master;
|
||||
struct uv1_bau_msg_header *uv1_hdr = NULL;
|
||||
struct uv2_bau_msg_header *uv2_hdr = NULL;
|
||||
struct bau_desc *bau_desc;
|
||||
|
||||
if (is_uv1_hub())
|
||||
if (bcp->uvhub_version == 1)
|
||||
uv1_throttle(hmaster, stat);
|
||||
|
||||
while (hmaster->uvhub_quiesce)
|
||||
@ -772,22 +899,39 @@ int uv_flush_send_and_wait(struct bau_desc *bau_desc,
|
||||
|
||||
time1 = get_cycles();
|
||||
do {
|
||||
if (try == 0) {
|
||||
bau_desc->header.msg_type = MSG_REGULAR;
|
||||
bau_desc = bcp->descriptor_base;
|
||||
bau_desc += (ITEMS_PER_DESC * bcp->using_desc);
|
||||
if (bcp->uvhub_version == 1) {
|
||||
uv1 = 1;
|
||||
uv1_hdr = &bau_desc->header.uv1_hdr;
|
||||
} else
|
||||
uv2_hdr = &bau_desc->header.uv2_hdr;
|
||||
if ((try == 0) || (completion_stat == FLUSH_RETRY_BUSYBUG)) {
|
||||
if (uv1)
|
||||
uv1_hdr->msg_type = MSG_REGULAR;
|
||||
else
|
||||
uv2_hdr->msg_type = MSG_REGULAR;
|
||||
seq_number = bcp->message_number++;
|
||||
} else {
|
||||
bau_desc->header.msg_type = MSG_RETRY;
|
||||
if (uv1)
|
||||
uv1_hdr->msg_type = MSG_RETRY;
|
||||
else
|
||||
uv2_hdr->msg_type = MSG_RETRY;
|
||||
stat->s_retry_messages++;
|
||||
}
|
||||
|
||||
bau_desc->header.sequence = seq_number;
|
||||
index = (1UL << AS_PUSH_SHIFT) | bcp->uvhub_cpu;
|
||||
if (uv1)
|
||||
uv1_hdr->sequence = seq_number;
|
||||
else
|
||||
uv2_hdr->sequence = seq_number;
|
||||
index = (1UL << AS_PUSH_SHIFT) | bcp->using_desc;
|
||||
bcp->send_message = get_cycles();
|
||||
|
||||
write_mmr_activation(index);
|
||||
|
||||
try++;
|
||||
completion_stat = wait_completion(bau_desc, bcp, try);
|
||||
/* UV2: wait_completion() may change the bcp->using_desc */
|
||||
|
||||
handle_cmplt(completion_stat, bau_desc, bcp, hmaster, stat);
|
||||
|
||||
@ -798,6 +942,7 @@ int uv_flush_send_and_wait(struct bau_desc *bau_desc,
|
||||
}
|
||||
cpu_relax();
|
||||
} while ((completion_stat == FLUSH_RETRY_PLUGGED) ||
|
||||
(completion_stat == FLUSH_RETRY_BUSYBUG) ||
|
||||
(completion_stat == FLUSH_RETRY_TIMEOUT));
|
||||
|
||||
time2 = get_cycles();
|
||||
@ -812,6 +957,7 @@ int uv_flush_send_and_wait(struct bau_desc *bau_desc,
|
||||
record_send_stats(time1, time2, bcp, stat, completion_stat, try);
|
||||
|
||||
if (completion_stat == FLUSH_GIVEUP)
|
||||
/* FLUSH_GIVEUP will fall back to using IPI's for tlb flush */
|
||||
return 1;
|
||||
return 0;
|
||||
}
|
||||
@ -967,7 +1113,7 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
|
||||
stat->s_ntargself++;
|
||||
|
||||
bau_desc = bcp->descriptor_base;
|
||||
bau_desc += ITEMS_PER_DESC * bcp->uvhub_cpu;
|
||||
bau_desc += (ITEMS_PER_DESC * bcp->using_desc);
|
||||
bau_uvhubs_clear(&bau_desc->distribution, UV_DISTRIBUTION_SIZE);
|
||||
if (set_distrib_bits(flush_mask, bcp, bau_desc, &locals, &remotes))
|
||||
return NULL;
|
||||
@ -980,12 +1126,85 @@ const struct cpumask *uv_flush_tlb_others(const struct cpumask *cpumask,
|
||||
* uv_flush_send_and_wait returns 0 if all cpu's were messaged,
|
||||
* or 1 if it gave up and the original cpumask should be returned.
|
||||
*/
|
||||
if (!uv_flush_send_and_wait(bau_desc, flush_mask, bcp))
|
||||
if (!uv_flush_send_and_wait(flush_mask, bcp))
|
||||
return NULL;
|
||||
else
|
||||
return cpumask;
|
||||
}
|
||||
|
||||
/*
|
||||
* Search the message queue for any 'other' message with the same software
|
||||
* acknowledge resource bit vector.
|
||||
*/
|
||||
struct bau_pq_entry *find_another_by_swack(struct bau_pq_entry *msg,
|
||||
struct bau_control *bcp, unsigned char swack_vec)
|
||||
{
|
||||
struct bau_pq_entry *msg_next = msg + 1;
|
||||
|
||||
if (msg_next > bcp->queue_last)
|
||||
msg_next = bcp->queue_first;
|
||||
while ((msg_next->swack_vec != 0) && (msg_next != msg)) {
|
||||
if (msg_next->swack_vec == swack_vec)
|
||||
return msg_next;
|
||||
msg_next++;
|
||||
if (msg_next > bcp->queue_last)
|
||||
msg_next = bcp->queue_first;
|
||||
}
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/*
|
||||
* UV2 needs to work around a bug in which an arriving message has not
|
||||
* set a bit in the UVH_LB_BAU_INTD_SOFTWARE_ACKNOWLEDGE register.
|
||||
* Such a message must be ignored.
|
||||
*/
|
||||
void process_uv2_message(struct msg_desc *mdp, struct bau_control *bcp)
|
||||
{
|
||||
unsigned long mmr_image;
|
||||
unsigned char swack_vec;
|
||||
struct bau_pq_entry *msg = mdp->msg;
|
||||
struct bau_pq_entry *other_msg;
|
||||
|
||||
mmr_image = read_mmr_sw_ack();
|
||||
swack_vec = msg->swack_vec;
|
||||
|
||||
if ((swack_vec & mmr_image) == 0) {
|
||||
/*
|
||||
* This message was assigned a swack resource, but no
|
||||
* reserved acknowlegment is pending.
|
||||
* The bug has prevented this message from setting the MMR.
|
||||
* And no other message has used the same sw_ack resource.
|
||||
* Do the requested shootdown but do not reply to the msg.
|
||||
* (the 0 means make no acknowledge)
|
||||
*/
|
||||
bau_process_message(mdp, bcp, 0);
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* Some message has set the MMR 'pending' bit; it might have been
|
||||
* another message. Look for that message.
|
||||
*/
|
||||
other_msg = find_another_by_swack(msg, bcp, msg->swack_vec);
|
||||
if (other_msg) {
|
||||
/* There is another. Do not ack the current one. */
|
||||
bau_process_message(mdp, bcp, 0);
|
||||
/*
|
||||
* Let the natural processing of that message acknowledge
|
||||
* it. Don't get the processing of sw_ack's out of order.
|
||||
*/
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* There is no other message using this sw_ack, so it is safe to
|
||||
* acknowledge it.
|
||||
*/
|
||||
bau_process_message(mdp, bcp, 1);
|
||||
|
||||
return;
|
||||
}
|
||||
|
||||
/*
|
||||
* The BAU message interrupt comes here. (registered by set_intr_gate)
|
||||
* See entry_64.S
|
||||
@ -1022,9 +1241,11 @@ void uv_bau_message_interrupt(struct pt_regs *regs)
|
||||
count++;
|
||||
|
||||
msgdesc.msg_slot = msg - msgdesc.queue_first;
|
||||
msgdesc.swack_slot = ffs(msg->swack_vec) - 1;
|
||||
msgdesc.msg = msg;
|
||||
bau_process_message(&msgdesc, bcp);
|
||||
if (bcp->uvhub_version == 2)
|
||||
process_uv2_message(&msgdesc, bcp);
|
||||
else
|
||||
bau_process_message(&msgdesc, bcp, 1);
|
||||
|
||||
msg++;
|
||||
if (msg > msgdesc.queue_last)
|
||||
@ -1083,7 +1304,7 @@ static void __init enable_timeouts(void)
|
||||
*/
|
||||
mmr_image |= (1L << SOFTACK_MSHIFT);
|
||||
if (is_uv2_hub()) {
|
||||
mmr_image |= (1L << UV2_LEG_SHFT);
|
||||
mmr_image &= ~(1L << UV2_LEG_SHFT);
|
||||
mmr_image |= (1L << UV2_EXT_SHFT);
|
||||
}
|
||||
write_mmr_misc_control(pnode, mmr_image);
|
||||
@ -1142,7 +1363,7 @@ static int ptc_seq_show(struct seq_file *file, void *data)
|
||||
seq_printf(file,
|
||||
"all one mult none retry canc nocan reset rcan ");
|
||||
seq_printf(file,
|
||||
"disable enable\n");
|
||||
"disable enable wars warshw warwaits\n");
|
||||
}
|
||||
if (cpu < num_possible_cpus() && cpu_online(cpu)) {
|
||||
stat = &per_cpu(ptcstats, cpu);
|
||||
@ -1173,8 +1394,10 @@ static int ptc_seq_show(struct seq_file *file, void *data)
|
||||
stat->d_nomsg, stat->d_retries, stat->d_canceled,
|
||||
stat->d_nocanceled, stat->d_resets,
|
||||
stat->d_rcanceled);
|
||||
seq_printf(file, "%ld %ld\n",
|
||||
stat->s_bau_disabled, stat->s_bau_reenabled);
|
||||
seq_printf(file, "%ld %ld %ld %ld %ld\n",
|
||||
stat->s_bau_disabled, stat->s_bau_reenabled,
|
||||
stat->s_uv2_wars, stat->s_uv2_wars_hw,
|
||||
stat->s_uv2_war_waits);
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@ -1432,12 +1655,15 @@ static void activation_descriptor_init(int node, int pnode, int base_pnode)
|
||||
{
|
||||
int i;
|
||||
int cpu;
|
||||
int uv1 = 0;
|
||||
unsigned long gpa;
|
||||
unsigned long m;
|
||||
unsigned long n;
|
||||
size_t dsize;
|
||||
struct bau_desc *bau_desc;
|
||||
struct bau_desc *bd2;
|
||||
struct uv1_bau_msg_header *uv1_hdr;
|
||||
struct uv2_bau_msg_header *uv2_hdr;
|
||||
struct bau_control *bcp;
|
||||
|
||||
/*
|
||||
@ -1451,6 +1677,8 @@ static void activation_descriptor_init(int node, int pnode, int base_pnode)
|
||||
gpa = uv_gpa(bau_desc);
|
||||
n = uv_gpa_to_gnode(gpa);
|
||||
m = uv_gpa_to_offset(gpa);
|
||||
if (is_uv1_hub())
|
||||
uv1 = 1;
|
||||
|
||||
/* the 14-bit pnode */
|
||||
write_mmr_descriptor_base(pnode, (n << UV_DESC_PSHIFT | m));
|
||||
@ -1461,21 +1689,33 @@ static void activation_descriptor_init(int node, int pnode, int base_pnode)
|
||||
*/
|
||||
for (i = 0, bd2 = bau_desc; i < (ADP_SZ * ITEMS_PER_DESC); i++, bd2++) {
|
||||
memset(bd2, 0, sizeof(struct bau_desc));
|
||||
bd2->header.swack_flag = 1;
|
||||
/*
|
||||
* The base_dest_nasid set in the message header is the nasid
|
||||
* of the first uvhub in the partition. The bit map will
|
||||
* indicate destination pnode numbers relative to that base.
|
||||
* They may not be consecutive if nasid striding is being used.
|
||||
*/
|
||||
bd2->header.base_dest_nasid = UV_PNODE_TO_NASID(base_pnode);
|
||||
bd2->header.dest_subnodeid = UV_LB_SUBNODEID;
|
||||
bd2->header.command = UV_NET_ENDPOINT_INTD;
|
||||
bd2->header.int_both = 1;
|
||||
/*
|
||||
* all others need to be set to zero:
|
||||
* fairness chaining multilevel count replied_to
|
||||
*/
|
||||
if (uv1) {
|
||||
uv1_hdr = &bd2->header.uv1_hdr;
|
||||
uv1_hdr->swack_flag = 1;
|
||||
/*
|
||||
* The base_dest_nasid set in the message header
|
||||
* is the nasid of the first uvhub in the partition.
|
||||
* The bit map will indicate destination pnode numbers
|
||||
* relative to that base. They may not be consecutive
|
||||
* if nasid striding is being used.
|
||||
*/
|
||||
uv1_hdr->base_dest_nasid =
|
||||
UV_PNODE_TO_NASID(base_pnode);
|
||||
uv1_hdr->dest_subnodeid = UV_LB_SUBNODEID;
|
||||
uv1_hdr->command = UV_NET_ENDPOINT_INTD;
|
||||
uv1_hdr->int_both = 1;
|
||||
/*
|
||||
* all others need to be set to zero:
|
||||
* fairness chaining multilevel count replied_to
|
||||
*/
|
||||
} else {
|
||||
uv2_hdr = &bd2->header.uv2_hdr;
|
||||
uv2_hdr->swack_flag = 1;
|
||||
uv2_hdr->base_dest_nasid =
|
||||
UV_PNODE_TO_NASID(base_pnode);
|
||||
uv2_hdr->dest_subnodeid = UV_LB_SUBNODEID;
|
||||
uv2_hdr->command = UV_NET_ENDPOINT_INTD;
|
||||
}
|
||||
}
|
||||
for_each_present_cpu(cpu) {
|
||||
if (pnode != uv_blade_to_pnode(uv_cpu_to_blade_id(cpu)))
|
||||
@ -1531,6 +1771,7 @@ static void pq_init(int node, int pnode)
|
||||
write_mmr_payload_first(pnode, pn_first);
|
||||
write_mmr_payload_tail(pnode, first);
|
||||
write_mmr_payload_last(pnode, last);
|
||||
write_gmmr_sw_ack(pnode, 0xffffUL);
|
||||
|
||||
/* in effect, all msg_type's are set to MSG_NOOP */
|
||||
memset(pqp, 0, sizeof(struct bau_pq_entry) * DEST_Q_SIZE);
|
||||
@ -1584,14 +1825,14 @@ static int calculate_destination_timeout(void)
|
||||
ts_ns = base * mult1 * mult2;
|
||||
ret = ts_ns / 1000;
|
||||
} else {
|
||||
/* 4 bits 0/1 for 10/80us, 3 bits of multiplier */
|
||||
mmr_image = uv_read_local_mmr(UVH_AGING_PRESCALE_SEL);
|
||||
/* 4 bits 0/1 for 10/80us base, 3 bits of multiplier */
|
||||
mmr_image = uv_read_local_mmr(UVH_LB_BAU_MISC_CONTROL);
|
||||
mmr_image = (mmr_image & UV_SA_MASK) >> UV_SA_SHFT;
|
||||
if (mmr_image & (1L << UV2_ACK_UNITS_SHFT))
|
||||
mult1 = 80;
|
||||
base = 80;
|
||||
else
|
||||
mult1 = 10;
|
||||
base = mmr_image & UV2_ACK_MASK;
|
||||
base = 10;
|
||||
mult1 = mmr_image & UV2_ACK_MASK;
|
||||
ret = mult1 * base;
|
||||
}
|
||||
return ret;
|
||||
@ -1618,6 +1859,9 @@ static void __init init_per_cpu_tunables(void)
|
||||
bcp->cong_response_us = congested_respns_us;
|
||||
bcp->cong_reps = congested_reps;
|
||||
bcp->cong_period = congested_period;
|
||||
bcp->clocks_per_100_usec = usec_2_cycles(100);
|
||||
spin_lock_init(&bcp->queue_lock);
|
||||
spin_lock_init(&bcp->uvhub_lock);
|
||||
}
|
||||
}
|
||||
|
||||
@ -1728,8 +1972,17 @@ static int scan_sock(struct socket_desc *sdp, struct uvhub_desc *bdp,
|
||||
bcp->cpus_in_socket = sdp->num_cpus;
|
||||
bcp->socket_master = *smasterp;
|
||||
bcp->uvhub = bdp->uvhub;
|
||||
if (is_uv1_hub())
|
||||
bcp->uvhub_version = 1;
|
||||
else if (is_uv2_hub())
|
||||
bcp->uvhub_version = 2;
|
||||
else {
|
||||
printk(KERN_EMERG "uvhub version not 1 or 2\n");
|
||||
return 1;
|
||||
}
|
||||
bcp->uvhub_master = *hmasterp;
|
||||
bcp->uvhub_cpu = uv_cpu_hub_info(cpu)->blade_processor_id;
|
||||
bcp->using_desc = bcp->uvhub_cpu;
|
||||
if (bcp->uvhub_cpu >= MAX_CPUS_PER_UVHUB) {
|
||||
printk(KERN_EMERG "%d cpus per uvhub invalid\n",
|
||||
bcp->uvhub_cpu);
|
||||
@ -1845,6 +2098,8 @@ static int __init uv_bau_init(void)
|
||||
uv_base_pnode = uv_blade_to_pnode(uvhub);
|
||||
}
|
||||
|
||||
enable_timeouts();
|
||||
|
||||
if (init_per_cpu(nuvhubs, uv_base_pnode)) {
|
||||
nobau = 1;
|
||||
return 0;
|
||||
@ -1855,7 +2110,6 @@ static int __init uv_bau_init(void)
|
||||
if (uv_blade_nr_possible_cpus(uvhub))
|
||||
init_uvhub(uvhub, vector, uv_base_pnode);
|
||||
|
||||
enable_timeouts();
|
||||
alloc_intr_gate(vector, uv_bau_message_intr1);
|
||||
|
||||
for_each_possible_blade(uvhub) {
|
||||
@ -1867,7 +2121,8 @@ static int __init uv_bau_init(void)
|
||||
val = 1L << 63;
|
||||
write_gmmr_activation(pnode, val);
|
||||
mmr = 1; /* should be 1 to broadcast to both sockets */
|
||||
write_mmr_data_broadcast(pnode, mmr);
|
||||
if (!is_uv1_hub())
|
||||
write_mmr_data_broadcast(pnode, mmr);
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
@ -25,7 +25,7 @@ struct uv_irq_2_mmr_pnode{
|
||||
int irq;
|
||||
};
|
||||
|
||||
static spinlock_t uv_irq_lock;
|
||||
static DEFINE_SPINLOCK(uv_irq_lock);
|
||||
static struct rb_root uv_irq_root;
|
||||
|
||||
static int uv_set_irq_affinity(struct irq_data *, const struct cpumask *, bool);
|
||||
|
||||
@ -116,9 +116,26 @@ static inline void spin_time_accum_blocked(u64 start)
|
||||
}
|
||||
#endif /* CONFIG_XEN_DEBUG_FS */
|
||||
|
||||
/*
|
||||
* Size struct xen_spinlock so it's the same as arch_spinlock_t.
|
||||
*/
|
||||
#if NR_CPUS < 256
|
||||
typedef u8 xen_spinners_t;
|
||||
# define inc_spinners(xl) \
|
||||
asm(LOCK_PREFIX " incb %0" : "+m" ((xl)->spinners) : : "memory");
|
||||
# define dec_spinners(xl) \
|
||||
asm(LOCK_PREFIX " decb %0" : "+m" ((xl)->spinners) : : "memory");
|
||||
#else
|
||||
typedef u16 xen_spinners_t;
|
||||
# define inc_spinners(xl) \
|
||||
asm(LOCK_PREFIX " incw %0" : "+m" ((xl)->spinners) : : "memory");
|
||||
# define dec_spinners(xl) \
|
||||
asm(LOCK_PREFIX " decw %0" : "+m" ((xl)->spinners) : : "memory");
|
||||
#endif
|
||||
|
||||
struct xen_spinlock {
|
||||
unsigned char lock; /* 0 -> free; 1 -> locked */
|
||||
unsigned short spinners; /* count of waiting cpus */
|
||||
xen_spinners_t spinners; /* count of waiting cpus */
|
||||
};
|
||||
|
||||
static int xen_spin_is_locked(struct arch_spinlock *lock)
|
||||
@ -164,8 +181,7 @@ static inline struct xen_spinlock *spinning_lock(struct xen_spinlock *xl)
|
||||
|
||||
wmb(); /* set lock of interest before count */
|
||||
|
||||
asm(LOCK_PREFIX " incw %0"
|
||||
: "+m" (xl->spinners) : : "memory");
|
||||
inc_spinners(xl);
|
||||
|
||||
return prev;
|
||||
}
|
||||
@ -176,8 +192,7 @@ static inline struct xen_spinlock *spinning_lock(struct xen_spinlock *xl)
|
||||
*/
|
||||
static inline void unspinning_lock(struct xen_spinlock *xl, struct xen_spinlock *prev)
|
||||
{
|
||||
asm(LOCK_PREFIX " decw %0"
|
||||
: "+m" (xl->spinners) : : "memory");
|
||||
dec_spinners(xl);
|
||||
wmb(); /* decrement count before restoring lock */
|
||||
__this_cpu_write(lock_spinners, prev);
|
||||
}
|
||||
@ -373,6 +388,8 @@ void xen_uninit_lock_cpu(int cpu)
|
||||
|
||||
void __init xen_init_spinlocks(void)
|
||||
{
|
||||
BUILD_BUG_ON(sizeof(struct xen_spinlock) > sizeof(arch_spinlock_t));
|
||||
|
||||
pv_lock_ops.spin_is_locked = xen_spin_is_locked;
|
||||
pv_lock_ops.spin_is_contended = xen_spin_is_contended;
|
||||
pv_lock_ops.spin_lock = xen_spin_lock;
|
||||
|
||||
@ -985,7 +985,8 @@ void bsg_unregister_queue(struct request_queue *q)
|
||||
|
||||
mutex_lock(&bsg_mutex);
|
||||
idr_remove(&bsg_minor_idr, bcd->minor);
|
||||
sysfs_remove_link(&q->kobj, "bsg");
|
||||
if (q->kobj.sd)
|
||||
sysfs_remove_link(&q->kobj, "bsg");
|
||||
device_unregister(bcd->class_dev);
|
||||
bcd->class_dev = NULL;
|
||||
kref_put(&bcd->ref, bsg_kref_release_function);
|
||||
|
||||
@ -24,6 +24,7 @@
|
||||
#include <linux/capability.h>
|
||||
#include <linux/completion.h>
|
||||
#include <linux/cdrom.h>
|
||||
#include <linux/ratelimit.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/times.h>
|
||||
#include <asm/uaccess.h>
|
||||
@ -690,6 +691,57 @@ int scsi_cmd_ioctl(struct request_queue *q, struct gendisk *bd_disk, fmode_t mod
|
||||
}
|
||||
EXPORT_SYMBOL(scsi_cmd_ioctl);
|
||||
|
||||
int scsi_verify_blk_ioctl(struct block_device *bd, unsigned int cmd)
|
||||
{
|
||||
if (bd && bd == bd->bd_contains)
|
||||
return 0;
|
||||
|
||||
/* Actually none of these is particularly useful on a partition,
|
||||
* but they are safe.
|
||||
*/
|
||||
switch (cmd) {
|
||||
case SCSI_IOCTL_GET_IDLUN:
|
||||
case SCSI_IOCTL_GET_BUS_NUMBER:
|
||||
case SCSI_IOCTL_GET_PCI:
|
||||
case SCSI_IOCTL_PROBE_HOST:
|
||||
case SG_GET_VERSION_NUM:
|
||||
case SG_SET_TIMEOUT:
|
||||
case SG_GET_TIMEOUT:
|
||||
case SG_GET_RESERVED_SIZE:
|
||||
case SG_SET_RESERVED_SIZE:
|
||||
case SG_EMULATED_HOST:
|
||||
return 0;
|
||||
case CDROM_GET_CAPABILITY:
|
||||
/* Keep this until we remove the printk below. udev sends it
|
||||
* and we do not want to spam dmesg about it. CD-ROMs do
|
||||
* not have partitions, so we get here only for disks.
|
||||
*/
|
||||
return -ENOTTY;
|
||||
default:
|
||||
break;
|
||||
}
|
||||
|
||||
/* In particular, rule out all resets and host-specific ioctls. */
|
||||
printk_ratelimited(KERN_WARNING
|
||||
"%s: sending ioctl %x to a partition!\n", current->comm, cmd);
|
||||
|
||||
return capable(CAP_SYS_RAWIO) ? 0 : -ENOTTY;
|
||||
}
|
||||
EXPORT_SYMBOL(scsi_verify_blk_ioctl);
|
||||
|
||||
int scsi_cmd_blk_ioctl(struct block_device *bd, fmode_t mode,
|
||||
unsigned int cmd, void __user *arg)
|
||||
{
|
||||
int ret;
|
||||
|
||||
ret = scsi_verify_blk_ioctl(bd, cmd);
|
||||
if (ret < 0)
|
||||
return ret;
|
||||
|
||||
return scsi_cmd_ioctl(bd->bd_disk->queue, bd->bd_disk, mode, cmd, arg);
|
||||
}
|
||||
EXPORT_SYMBOL(scsi_cmd_blk_ioctl);
|
||||
|
||||
static int __init blk_scsi_ioctl_init(void)
|
||||
{
|
||||
blk_set_cmd_filter_defaults(&blk_default_cmd_filter);
|
||||
|
||||
@ -21,8 +21,6 @@
|
||||
#include <linux/percpu.h>
|
||||
#include <asm/byteorder.h>
|
||||
|
||||
static DEFINE_PER_CPU(u64[80], msg_schedule);
|
||||
|
||||
static inline u64 Ch(u64 x, u64 y, u64 z)
|
||||
{
|
||||
return z ^ (x & (y ^ z));
|
||||
@ -33,11 +31,6 @@ static inline u64 Maj(u64 x, u64 y, u64 z)
|
||||
return (x & y) | (z & (x | y));
|
||||
}
|
||||
|
||||
static inline u64 RORu64(u64 x, u64 y)
|
||||
{
|
||||
return (x >> y) | (x << (64 - y));
|
||||
}
|
||||
|
||||
static const u64 sha512_K[80] = {
|
||||
0x428a2f98d728ae22ULL, 0x7137449123ef65cdULL, 0xb5c0fbcfec4d3b2fULL,
|
||||
0xe9b5dba58189dbbcULL, 0x3956c25bf348b538ULL, 0x59f111f1b605d019ULL,
|
||||
@ -68,10 +61,10 @@ static const u64 sha512_K[80] = {
|
||||
0x5fcb6fab3ad6faecULL, 0x6c44198c4a475817ULL,
|
||||
};
|
||||
|
||||
#define e0(x) (RORu64(x,28) ^ RORu64(x,34) ^ RORu64(x,39))
|
||||
#define e1(x) (RORu64(x,14) ^ RORu64(x,18) ^ RORu64(x,41))
|
||||
#define s0(x) (RORu64(x, 1) ^ RORu64(x, 8) ^ (x >> 7))
|
||||
#define s1(x) (RORu64(x,19) ^ RORu64(x,61) ^ (x >> 6))
|
||||
#define e0(x) (ror64(x,28) ^ ror64(x,34) ^ ror64(x,39))
|
||||
#define e1(x) (ror64(x,14) ^ ror64(x,18) ^ ror64(x,41))
|
||||
#define s0(x) (ror64(x, 1) ^ ror64(x, 8) ^ (x >> 7))
|
||||
#define s1(x) (ror64(x,19) ^ ror64(x,61) ^ (x >> 6))
|
||||
|
||||
static inline void LOAD_OP(int I, u64 *W, const u8 *input)
|
||||
{
|
||||
@ -80,7 +73,7 @@ static inline void LOAD_OP(int I, u64 *W, const u8 *input)
|
||||
|
||||
static inline void BLEND_OP(int I, u64 *W)
|
||||
{
|
||||
W[I] = s1(W[I-2]) + W[I-7] + s0(W[I-15]) + W[I-16];
|
||||
W[I & 15] += s1(W[(I-2) & 15]) + W[(I-7) & 15] + s0(W[(I-15) & 15]);
|
||||
}
|
||||
|
||||
static void
|
||||
@ -89,15 +82,7 @@ sha512_transform(u64 *state, const u8 *input)
|
||||
u64 a, b, c, d, e, f, g, h, t1, t2;
|
||||
|
||||
int i;
|
||||
u64 *W = get_cpu_var(msg_schedule);
|
||||
|
||||
/* load the input */
|
||||
for (i = 0; i < 16; i++)
|
||||
LOAD_OP(i, W, input);
|
||||
|
||||
for (i = 16; i < 80; i++) {
|
||||
BLEND_OP(i, W);
|
||||
}
|
||||
u64 W[16];
|
||||
|
||||
/* load the state into our registers */
|
||||
a=state[0]; b=state[1]; c=state[2]; d=state[3];
|
||||
@ -105,21 +90,35 @@ sha512_transform(u64 *state, const u8 *input)
|
||||
|
||||
/* now iterate */
|
||||
for (i=0; i<80; i+=8) {
|
||||
t1 = h + e1(e) + Ch(e,f,g) + sha512_K[i ] + W[i ];
|
||||
if (!(i & 8)) {
|
||||
int j;
|
||||
|
||||
if (i < 16) {
|
||||
/* load the input */
|
||||
for (j = 0; j < 16; j++)
|
||||
LOAD_OP(i + j, W, input);
|
||||
} else {
|
||||
for (j = 0; j < 16; j++) {
|
||||
BLEND_OP(i + j, W);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
t1 = h + e1(e) + Ch(e,f,g) + sha512_K[i ] + W[(i & 15)];
|
||||
t2 = e0(a) + Maj(a,b,c); d+=t1; h=t1+t2;
|
||||
t1 = g + e1(d) + Ch(d,e,f) + sha512_K[i+1] + W[i+1];
|
||||
t1 = g + e1(d) + Ch(d,e,f) + sha512_K[i+1] + W[(i & 15) + 1];
|
||||
t2 = e0(h) + Maj(h,a,b); c+=t1; g=t1+t2;
|
||||
t1 = f + e1(c) + Ch(c,d,e) + sha512_K[i+2] + W[i+2];
|
||||
t1 = f + e1(c) + Ch(c,d,e) + sha512_K[i+2] + W[(i & 15) + 2];
|
||||
t2 = e0(g) + Maj(g,h,a); b+=t1; f=t1+t2;
|
||||
t1 = e + e1(b) + Ch(b,c,d) + sha512_K[i+3] + W[i+3];
|
||||
t1 = e + e1(b) + Ch(b,c,d) + sha512_K[i+3] + W[(i & 15) + 3];
|
||||
t2 = e0(f) + Maj(f,g,h); a+=t1; e=t1+t2;
|
||||
t1 = d + e1(a) + Ch(a,b,c) + sha512_K[i+4] + W[i+4];
|
||||
t1 = d + e1(a) + Ch(a,b,c) + sha512_K[i+4] + W[(i & 15) + 4];
|
||||
t2 = e0(e) + Maj(e,f,g); h+=t1; d=t1+t2;
|
||||
t1 = c + e1(h) + Ch(h,a,b) + sha512_K[i+5] + W[i+5];
|
||||
t1 = c + e1(h) + Ch(h,a,b) + sha512_K[i+5] + W[(i & 15) + 5];
|
||||
t2 = e0(d) + Maj(d,e,f); g+=t1; c=t1+t2;
|
||||
t1 = b + e1(g) + Ch(g,h,a) + sha512_K[i+6] + W[i+6];
|
||||
t1 = b + e1(g) + Ch(g,h,a) + sha512_K[i+6] + W[(i & 15) + 6];
|
||||
t2 = e0(c) + Maj(c,d,e); f+=t1; b=t1+t2;
|
||||
t1 = a + e1(f) + Ch(f,g,h) + sha512_K[i+7] + W[i+7];
|
||||
t1 = a + e1(f) + Ch(f,g,h) + sha512_K[i+7] + W[(i & 15) + 7];
|
||||
t2 = e0(b) + Maj(b,c,d); e+=t1; a=t1+t2;
|
||||
}
|
||||
|
||||
@ -128,8 +127,6 @@ sha512_transform(u64 *state, const u8 *input)
|
||||
|
||||
/* erase our data */
|
||||
a = b = c = d = e = f = g = h = t1 = t2 = 0;
|
||||
memset(W, 0, sizeof(__get_cpu_var(msg_schedule)));
|
||||
put_cpu_var(msg_schedule);
|
||||
}
|
||||
|
||||
static int
|
||||
|
||||
@ -387,5 +387,29 @@ acpi_status acpi_ds_get_region_arguments(union acpi_operand_object *obj_desc)
|
||||
status = acpi_ds_execute_arguments(node, node->parent,
|
||||
extra_desc->extra.aml_length,
|
||||
extra_desc->extra.aml_start);
|
||||
if (ACPI_FAILURE(status)) {
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
/* Validate the region address/length via the host OS */
|
||||
|
||||
status = acpi_os_validate_address(obj_desc->region.space_id,
|
||||
obj_desc->region.address,
|
||||
(acpi_size) obj_desc->region.length,
|
||||
acpi_ut_get_node_name(node));
|
||||
|
||||
if (ACPI_FAILURE(status)) {
|
||||
/*
|
||||
* Invalid address/length. We will emit an error message and mark
|
||||
* the region as invalid, so that it will cause an additional error if
|
||||
* it is ever used. Then return AE_OK.
|
||||
*/
|
||||
ACPI_EXCEPTION((AE_INFO, status,
|
||||
"During address validation of OpRegion [%4.4s]",
|
||||
node->name.ascii));
|
||||
obj_desc->common.flags |= AOPOBJ_INVALID;
|
||||
status = AE_OK;
|
||||
}
|
||||
|
||||
return_ACPI_STATUS(status);
|
||||
}
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user