Compare commits
2338 Commits
vUDK2018
...
system76-c
Author | SHA1 | Date | |
---|---|---|---|
|
f40dc199c2 | ||
|
3f54e8f57a | ||
|
55849a4a46 | ||
|
74f2015276 | ||
|
6dff36c9b2 | ||
|
814c0fa862 | ||
|
a05aa4aff0 | ||
|
30c84e8277 | ||
|
2ba9869baa | ||
|
826b9d30cf | ||
|
b0e7e3919f | ||
|
976842130a | ||
|
52d5d1b2c5 | ||
|
7050fc3a26 | ||
|
0eca9e3c1a | ||
|
19304f2144 | ||
|
b062ed0c86 | ||
|
d9cf95c6a2 | ||
|
75a5161506 | ||
|
d193b18023 | ||
|
061df3962f | ||
|
f6e7c15556 | ||
|
95fb70f34d | ||
|
900debdeec | ||
|
33006e4f4e | ||
|
b8fbf69c16 | ||
|
ba13872223 | ||
|
eb1e7a0284 | ||
|
eba6c7c6ce | ||
|
a5f556c37b | ||
|
e9023ae655 | ||
|
cdd43b2533 | ||
|
d1a6917813 | ||
|
81e096bda1 | ||
|
42f99de779 | ||
|
a03327088a | ||
|
4ba839c5c8 | ||
|
6bd9d60b41 | ||
|
964f80253a | ||
|
47794944e6 | ||
|
8f008298cc | ||
|
783f22ecc3 | ||
|
81a93fb3a9 | ||
|
30dc65997f | ||
|
93f8c4a6d5 | ||
|
51be9d0425 | ||
|
31a4e13c19 | ||
|
9d32ca34d2 | ||
|
0f9b597012 | ||
|
19e12d66fe | ||
|
9332332724 | ||
|
239e19e391 | ||
|
c8a3cdb675 | ||
|
40147bbf14 | ||
|
cf2bde63a1 | ||
|
f6f2ff4904 | ||
|
a26aad44d1 | ||
|
3596140a69 | ||
|
9b7ce3b9a1 | ||
|
147c02d66e | ||
|
768fe7365f | ||
|
0f6978e314 | ||
|
0a8abc3c4d | ||
|
54b26ae48f | ||
|
9d72e4b922 | ||
|
7f094cdf45 | ||
|
b0f8ea3c9c | ||
|
731869826b | ||
|
a49a99ef5e | ||
|
d06545cd3d | ||
|
575764deeb | ||
|
ed1cf61e3e | ||
|
091f5d689f | ||
|
d944c24078 | ||
|
bdd22050f6 | ||
|
0286bfae44 | ||
|
735fae0452 | ||
|
8de2a8523d | ||
|
e4fc0fbacb | ||
|
fceee0d621 | ||
|
d67d692ee2 | ||
|
927fc0e4b5 | ||
|
04515ff368 | ||
|
439e7d2556 | ||
|
0554ac9dd0 | ||
|
0a679652e8 | ||
|
559a07d84e | ||
|
9bba10eb43 | ||
|
a18f784cfd | ||
|
7c4207e955 | ||
|
5a9b3eb8e5 | ||
|
6f42f9a54b | ||
|
ba808d11f6 | ||
|
d3b05936d9 | ||
|
5afabd5ec3 | ||
|
e3fa3d83e7 | ||
|
87b920fe22 | ||
|
4a1500db2b | ||
|
6bd42402f7 | ||
|
1c36f028fa | ||
|
76be882cdc | ||
|
36b0754712 | ||
|
67b8f806d2 | ||
|
5c8bc8be9e | ||
|
d05d5f6c85 | ||
|
3bdc111178 | ||
|
5f0b035f10 | ||
|
370544d116 | ||
|
458539fb75 | ||
|
b7652b7667 | ||
|
f2bc359ced | ||
|
111e6c920d | ||
|
aa8c6e2ad3 | ||
|
b62fe5708b | ||
|
073a76e662 | ||
|
7c3a1efd15 | ||
|
b4c012d873 | ||
|
643556fc48 | ||
|
4c6e6f9f75 | ||
|
778c764050 | ||
|
736c436e53 | ||
|
c8c3c53669 | ||
|
0a538ddab4 | ||
|
48e890457b | ||
|
9bf86b12ce | ||
|
5695877ec8 | ||
|
a9ff32909b | ||
|
9a67ba261f | ||
|
36deafb838 | ||
|
b048a2204d | ||
|
decaac5d0d | ||
|
580f4539df | ||
|
0d68ce514b | ||
|
e07092edca | ||
|
ded3c57623 | ||
|
de3c440e8a | ||
|
765fb87c2b | ||
|
f0574a194c | ||
|
f4c8c1bbf1 | ||
|
56fbaecb15 | ||
|
ee27f6eef3 | ||
|
366a7672cf | ||
|
0176af142e | ||
|
f7f94ffe88 | ||
|
34b1d7eafe | ||
|
0d1fb6cc8a | ||
|
16583ecc12 | ||
|
d495142506 | ||
|
f8943176f0 | ||
|
4ceb9c01f9 | ||
|
a5274cdc87 | ||
|
9601046bf4 | ||
|
bf9e636605 | ||
|
4e37570739 | ||
|
2f818ed0fb | ||
|
b3497bad12 | ||
|
34e733f200 | ||
|
72a1d77694 | ||
|
088a533480 | ||
|
bc39c5cbea | ||
|
ea55e37c36 | ||
|
4495792953 | ||
|
67938bcc9d | ||
|
6e8cad49a0 | ||
|
7702ceb8af | ||
|
9fb5c5c4a3 | ||
|
8efc6d84ca | ||
|
98a9519f1c | ||
|
c0b7379a31 | ||
|
4d393eb876 | ||
|
6e2d15e3c4 | ||
|
76e5f493d2 | ||
|
93afbd1595 | ||
|
64ab2c82e8 | ||
|
b1e5547551 | ||
|
85520ac6a3 | ||
|
51bb05c795 | ||
|
5e27deed43 | ||
|
aa1097921d | ||
|
36a87fec68 | ||
|
a2df8587bf | ||
|
bcf2a9db1f | ||
|
55342094fb | ||
|
175358e15e | ||
|
8b767aae65 | ||
|
32f79df36e | ||
|
ff3c97807a | ||
|
e0ec9a127f | ||
|
a3b6537144 | ||
|
e36b243c71 | ||
|
2f9b248af8 | ||
|
95d04ebca8 | ||
|
82379bf660 | ||
|
364eed8479 | ||
|
66e06a72bf | ||
|
9710639195 | ||
|
a21eb02d0a | ||
|
e979ea74aa | ||
|
03d3e7b2ed | ||
|
ae960002fe | ||
|
864cba9598 | ||
|
591a44c02d | ||
|
9ebef6c0a7 | ||
|
18a700945f | ||
|
5ee1bcae59 | ||
|
eed947be0b | ||
|
37b2516bff | ||
|
9d58430833 | ||
|
4c2f32ed1a | ||
|
767febf86f | ||
|
13d5d0a56e | ||
|
534efca06f | ||
|
277a3958d9 | ||
|
385c0bf55a | ||
|
72e514c907 | ||
|
32f5975770 | ||
|
8b9025345e | ||
|
4ef1135839 | ||
|
1ec194b21c | ||
|
e8f40b770f | ||
|
2098de6279 | ||
|
ed3951ebbd | ||
|
a2481def5d | ||
|
59e323822f | ||
|
a90c7df7ed | ||
|
a2c0496991 | ||
|
6556224e1f | ||
|
8611bf99e0 | ||
|
59222fe90b | ||
|
d8e702693a | ||
|
63f151aadb | ||
|
3cc9af5ce3 | ||
|
d021868ccf | ||
|
330e18555c | ||
|
9442266c70 | ||
|
1358ecb77f | ||
|
29d8a4d4ab | ||
|
7f3b0bad4b | ||
|
b7b803a6d5 | ||
|
a4708009cc | ||
|
49c9953425 | ||
|
115336ccaf | ||
|
de1e1195b3 | ||
|
90c5bc081d | ||
|
4187f79cf0 | ||
|
3d3416e892 | ||
|
81c6f1dfba | ||
|
0bcf71c13c | ||
|
316b3a719f | ||
|
8b1a4320b8 | ||
|
238fe4ded4 | ||
|
6caf954c1b | ||
|
6c15371695 | ||
|
2840bb5104 | ||
|
4b888334d2 | ||
|
f07afa3e26 | ||
|
cc5c08f9d6 | ||
|
5a16ba3ae1 | ||
|
90fa59f685 | ||
|
66127011a5 | ||
|
9cabe9d457 | ||
|
8558838922 | ||
|
bd224a5dad | ||
|
da2c81ee96 | ||
|
246604e3a4 | ||
|
2e77f0e7b5 | ||
|
615c2c766e | ||
|
98449a1678 | ||
|
ade71c52a4 | ||
|
1c4cecc9fd | ||
|
5e45a1fdcf | ||
|
114a75ad86 | ||
|
e9ab1635a2 | ||
|
9bae7811d9 | ||
|
91ff5bba02 | ||
|
c1528b855c | ||
|
8cd4e734cc | ||
|
3eacb4751a | ||
|
b46de50913 | ||
|
e6459b9e6c | ||
|
c60d36b4d1 | ||
|
b66e38b501 | ||
|
0adc6eae94 | ||
|
8a7ff892ca | ||
|
d98fc9adfb | ||
|
f87db25620 | ||
|
1ed6498c4a | ||
|
328409ce8d | ||
|
438ada5aa5 | ||
|
98856a724c | ||
|
e038bde267 | ||
|
62ea70e312 | ||
|
fc5b790b39 | ||
|
d2f1f6423b | ||
|
5f1371270e | ||
|
5ae3184d8c | ||
|
e40f8efb8b | ||
|
6cf3aeaeb1 | ||
|
2eee9d6581 | ||
|
806c28ef50 | ||
|
c95f600e93 | ||
|
fc5217a999 | ||
|
764c21f4aa | ||
|
9ba404d664 | ||
|
e048ce883c | ||
|
2552661848 | ||
|
23d14cae07 | ||
|
93f9898582 | ||
|
498cb29dfd | ||
|
88e8498f8a | ||
|
5af5153ad9 | ||
|
dbeaf58555 | ||
|
c4f4984c69 | ||
|
d3d97b378f | ||
|
5b9639e697 | ||
|
bfc87aa78e | ||
|
fd95015673 | ||
|
c41da21704 | ||
|
e23366d3c3 | ||
|
ce283fd609 | ||
|
269f3b5180 | ||
|
beabfd5800 | ||
|
27b9cb33e7 | ||
|
bfb8c64cbf | ||
|
542b03d0a0 | ||
|
a0f01e8a22 | ||
|
4222e8e7e4 | ||
|
37fba7c276 | ||
|
61a62fc258 | ||
|
c87ac38cf2 | ||
|
c09b254bdc | ||
|
70425456da | ||
|
c96de1dbae | ||
|
2f6693c283 | ||
|
9202304c18 | ||
|
0cd6452503 | ||
|
7779209971 | ||
|
4f792685e4 | ||
|
6681582dcc | ||
|
a6eb94eedb | ||
|
895415ed47 | ||
|
23a62c6990 | ||
|
7a283cb3f0 | ||
|
3da7d99506 | ||
|
f157f97301 | ||
|
b28d406b5a | ||
|
e5001ab7a9 | ||
|
979b7d802c | ||
|
adb2c05012 | ||
|
599bb2be1f | ||
|
1475b83f06 | ||
|
901ae29dfe | ||
|
7db4034f9a | ||
|
31fb333431 | ||
|
e07e3cebc7 | ||
|
1c15179c8f | ||
|
2b0c199465 | ||
|
692e318d9d | ||
|
8022aca8fd | ||
|
63ebde8ef6 | ||
|
bb685071c2 | ||
|
54efcfea81 | ||
|
02ba936dfd | ||
|
5323e918c3 | ||
|
a6bde8a644 | ||
|
d2aefa0adf | ||
|
ea98a8254a | ||
|
ca957eb5cd | ||
|
5a6a268d51 | ||
|
9ffaaac2e5 | ||
|
5a264f28ee | ||
|
9e47e6f908 | ||
|
0019375fbc | ||
|
b1cc6f672f | ||
|
5061efe70d | ||
|
ebed920ffd | ||
|
5d54ab94db | ||
|
8411c9d5c4 | ||
|
5687ae5723 | ||
|
ebb6c7633b | ||
|
27bf6712b4 | ||
|
8c09f30010 | ||
|
0bc7448ad2 | ||
|
c637c60273 | ||
|
51d17bb7b0 | ||
|
951fb2d4e5 | ||
|
2855e9c330 | ||
|
da2d4f76b7 | ||
|
9f2b0594ed | ||
|
a8b5750901 | ||
|
3874108034 | ||
|
6d9b9bbb61 | ||
|
ea1486c281 | ||
|
b08b045ca9 | ||
|
add1310df5 | ||
|
8a2794f6f3 | ||
|
f1a7d73a68 | ||
|
a58a421c36 | ||
|
90c64aada8 | ||
|
7a57490c2e | ||
|
3a244b8db4 | ||
|
33a211d009 | ||
|
041d89bc0f | ||
|
684db6da64 | ||
|
2ec7953d49 | ||
|
68099b52b0 | ||
|
85acb5e8ff | ||
|
32698a8f01 | ||
|
6a926aaed7 | ||
|
6df465b212 | ||
|
3b30351b75 | ||
|
89f75aa04a | ||
|
5c0748f43f | ||
|
b9ae1705ad | ||
|
4df8f5bfa2 | ||
|
4a723d3d7f | ||
|
fed6cf25b8 | ||
|
a6a326770b | ||
|
0dab57708d | ||
|
073891a3e7 | ||
|
32be12235d | ||
|
d28daaddb3 | ||
|
38381e18bf | ||
|
9332439058 | ||
|
b3c71b472d | ||
|
87e9395109 | ||
|
d5aa2078f7 | ||
|
95aea2fac9 | ||
|
ddc6d41d12 | ||
|
1682cc9353 | ||
|
2c65efac57 | ||
|
7cedfa1c81 | ||
|
eb99b52f98 | ||
|
c3d0f526c0 | ||
|
e7ac09b957 | ||
|
a2e61f341d | ||
|
7b500c606a | ||
|
1c3399d73d | ||
|
eae7b476c2 | ||
|
fea5e28658 | ||
|
53c64f4286 | ||
|
5317e9ccaf | ||
|
11941d3b1b | ||
|
f355dd3404 | ||
|
6086569e7e | ||
|
5fb22f5920 | ||
|
ebb12f5142 | ||
|
3a0329bed2 | ||
|
e5d4e7500f | ||
|
7149d40938 | ||
|
c6fedbd791 | ||
|
310ddb638b | ||
|
b7dc8888f3 | ||
|
25d310d9b6 | ||
|
8894c90d74 | ||
|
b2252bab12 | ||
|
6c46cbbd5e | ||
|
0dd6065520 | ||
|
8bcbe587e7 | ||
|
4d2b506631 | ||
|
7fb7259fc0 | ||
|
70c3c2370a | ||
|
4c034bf62c | ||
|
4f8b2f9d72 | ||
|
e59db6a732 | ||
|
76d1c03cbd | ||
|
6d665168b0 | ||
|
47f15da160 | ||
|
ff4d0f851d | ||
|
0fab42ba27 | ||
|
03c36c36a3 | ||
|
aa52648c1e | ||
|
a96133d2d1 | ||
|
0caf903913 | ||
|
e451aaa637 | ||
|
272ecccd79 | ||
|
b1cd4061e3 | ||
|
2215855957 | ||
|
3948c510ed | ||
|
df8be9e50f | ||
|
a5def17714 | ||
|
16bd7c35df | ||
|
f1400101a7 | ||
|
f88113789b | ||
|
425084cd45 | ||
|
04aa423c8d | ||
|
6974c784cb | ||
|
0e982cf03d | ||
|
55e8ff01af | ||
|
1ccc4d895d | ||
|
678f851312 | ||
|
913795f7a2 | ||
|
15298db95c | ||
|
27f38c6d6e | ||
|
b87099f336 | ||
|
ea787b6b55 | ||
|
22c4de1ac8 | ||
|
472eb3b896 | ||
|
1b2e077260 | ||
|
9d7e1e56a7 | ||
|
c9486c8c9d | ||
|
d25c096d27 | ||
|
04c47cd401 | ||
|
8be15c61e8 | ||
|
0e3bfc6f7a | ||
|
60dc40db2a | ||
|
2e300969ae | ||
|
00fcce9153 | ||
|
86e6cf98a8 | ||
|
a09f4c91f7 | ||
|
fe3991d635 | ||
|
4ce4f757d7 | ||
|
5135cc4852 | ||
|
d3678942b4 | ||
|
8371d87412 | ||
|
261eee25de | ||
|
487062c048 | ||
|
6693f359b3 | ||
|
301402fa47 | ||
|
bbce001515 | ||
|
bdf038ccff | ||
|
9343d0a1cd | ||
|
b1df6c2582 | ||
|
7177be0bd8 | ||
|
8122c6bc8b | ||
|
4ee787cc1b | ||
|
b9c055f72b | ||
|
1a3bee2082 | ||
|
2730470f9d | ||
|
dd4f667e70 | ||
|
78af0984b4 | ||
|
fb4bea551e | ||
|
05fe752589 | ||
|
959be180e1 | ||
|
7f8aabef15 | ||
|
50431b9cc7 | ||
|
39bbbc8759 | ||
|
f0737de8d9 | ||
|
5ec5a236d1 | ||
|
a7ab1c315c | ||
|
e8601e972f | ||
|
fab334b278 | ||
|
d20ae95a13 | ||
|
c0b1f749ef | ||
|
c526dcd40f | ||
|
5b02be4d9a | ||
|
e83d841fdc | ||
|
ee65b84e76 | ||
|
cb54cd2463 | ||
|
2ecd829972 | ||
|
8285f42e58 | ||
|
aa9986651b | ||
|
42a7c2871a | ||
|
604cb49868 | ||
|
a9dfe53f56 | ||
|
cc73a7ec00 | ||
|
83c10d2e8c | ||
|
3e11c27f67 | ||
|
32fd20bb24 | ||
|
0e800fde04 | ||
|
f6e68d3cda | ||
|
130e629284 | ||
|
2239ea71b6 | ||
|
b9cee524e6 | ||
|
d75c07bc68 | ||
|
1d7eed4182 | ||
|
ccacc4d273 | ||
|
4063d37c6a | ||
|
631db6b24d | ||
|
8a9678c7a4 | ||
|
dab8d71dc6 | ||
|
06e88b8bfb | ||
|
80d49b5714 | ||
|
1d94f67b24 | ||
|
ed5de31189 | ||
|
61d3f1000e | ||
|
cf320090fa | ||
|
2b55b922e9 | ||
|
737f812b00 | ||
|
29933058fc | ||
|
bb88882b75 | ||
|
6532fdec11 | ||
|
70493a8d54 | ||
|
fbb44beba0 | ||
|
54611eacfe | ||
|
47042f60e4 | ||
|
e8208100c9 | ||
|
4c214f8229 | ||
|
cb6fe7bb8b | ||
|
44c385effd | ||
|
2ad0581b1c | ||
|
74bdd03ead | ||
|
c1a00d0942 | ||
|
af5e952159 | ||
|
24c55f5dcc | ||
|
0bcbdf9c74 | ||
|
897720daef | ||
|
f120d15e6d | ||
|
d619dab698 | ||
|
18e205754d | ||
|
160b082e64 | ||
|
2fff697f1e | ||
|
5c6fdb5e83 | ||
|
f3427f12a4 | ||
|
6c047cfab1 | ||
|
6a147d6dae | ||
|
57ee97c01c | ||
|
f27e800a99 | ||
|
8a94eb9283 | ||
|
53002b7ecf | ||
|
4382394aa9 | ||
|
140d713175 | ||
|
8b344785a3 | ||
|
f49bbeda3e | ||
|
7ce15b89bb | ||
|
a71920ae14 | ||
|
d05b288ae9 | ||
|
3add020579 | ||
|
dfb208511e | ||
|
c4b073632d | ||
|
47f75d2169 | ||
|
b715c37eaa | ||
|
ba1a2d1102 | ||
|
447b08b3d2 | ||
|
69b4046504 | ||
|
b8bfb92b4e | ||
|
bff6584d1f | ||
|
666d05a0ad | ||
|
2939283f2d | ||
|
5267926134 | ||
|
b888c57a05 | ||
|
67998a547e | ||
|
e5cd809087 | ||
|
3cb0a311cb | ||
|
ba6037f833 | ||
|
bc7c34afb1 | ||
|
94d67262d8 | ||
|
3888487499 | ||
|
39b6f6ce1f | ||
|
5090a3dc5e | ||
|
17634d026f | ||
|
ca3e4f8ab8 | ||
|
32eb6739b9 | ||
|
d5b28edd63 | ||
|
0fd04efd01 | ||
|
b602265d55 | ||
|
a364928195 | ||
|
60eb6c6d2e | ||
|
05cfd73f01 | ||
|
997731e796 | ||
|
a8beaf8f90 | ||
|
8c06d18bc1 | ||
|
4cd9d7fc6f | ||
|
064d301fb0 | ||
|
9062ab4787 | ||
|
719fd85c73 | ||
|
4def57d98c | ||
|
6f73a03665 | ||
|
b0a2645162 | ||
|
71cac3f791 | ||
|
6c204ed4f2 | ||
|
4c92c81d61 | ||
|
e6c62ab768 | ||
|
e6eae3b4c7 | ||
|
f199664ce7 | ||
|
ae57950fc8 | ||
|
3eb747c16b | ||
|
1737b7e3b4 | ||
|
cde5a72d36 | ||
|
16d8465756 | ||
|
a95c9cfd18 | ||
|
b06dfd40bb | ||
|
e69d7e99e7 | ||
|
cfd10276ce | ||
|
85e5d3cf6b | ||
|
f316a26013 | ||
|
f92b8ee3b7 | ||
|
9c8e9e76bd | ||
|
52664c5252 | ||
|
29cc93f773 | ||
|
6861b0fe72 | ||
|
7c41b8135d | ||
|
eb2afe08ce | ||
|
e9d21340c6 | ||
|
ecbd055d4e | ||
|
4423f0bc61 | ||
|
4c0d19e5bf | ||
|
73dbd6afab | ||
|
84a52d4d03 | ||
|
4c6fda33c8 | ||
|
ced8685838 | ||
|
cfed8a37ec | ||
|
71127ce883 | ||
|
b62cbfb787 | ||
|
5c9ac43f47 | ||
|
1ad635b283 | ||
|
8e2018f944 | ||
|
51d0100b3c | ||
|
f4eaaf1a6d | ||
|
289cb872ed | ||
|
34c3405cb7 | ||
|
3a34753312 | ||
|
0a0d5296e4 | ||
|
e09b6b5953 | ||
|
fc0e7fd5e8 | ||
|
2af2988f3a | ||
|
4b2dc555d8 | ||
|
40a7b235e4 | ||
|
98257f9820 | ||
|
c4709260f6 | ||
|
c783da6599 | ||
|
4d62189347 | ||
|
7761cee050 | ||
|
7bf1eb6ef8 | ||
|
b48ec0e8ab | ||
|
22cf747fcf | ||
|
de005223b7 | ||
|
8d27b54bae | ||
|
c8ff1df3a2 | ||
|
8baa3fc168 | ||
|
6623f8fe66 | ||
|
6460513aa6 | ||
|
4a76d9b9a3 | ||
|
fa6e2804de | ||
|
ac4578af36 | ||
|
e23d9c3ed8 | ||
|
c3d5d800d7 | ||
|
8a204b2aca | ||
|
865d7f7b01 | ||
|
04722cfa30 | ||
|
e3b9ab433a | ||
|
0e042d0ad7 | ||
|
374168ae65 | ||
|
87a9dd0d15 | ||
|
4cf022f2f1 | ||
|
7c19378762 | ||
|
24bd035c90 | ||
|
b8bcaafb39 | ||
|
12ae56cf28 | ||
|
1e57188216 | ||
|
e01238946c | ||
|
0195dd509f | ||
|
54ee6176ed | ||
|
f89c018f3d | ||
|
e3c96c391c | ||
|
d773459e2f | ||
|
ce8c1d92f5 | ||
|
158b558711 | ||
|
209d095968 | ||
|
a77e5bcac5 | ||
|
f5f4667dae | ||
|
0fece18d6d | ||
|
36faa23c46 | ||
|
7475ac5157 | ||
|
79e4f2a56a | ||
|
a07533fab1 | ||
|
94c0455937 | ||
|
7c7c8190d3 | ||
|
09afd9a42a | ||
|
dcc026217f | ||
|
16b918bbaf | ||
|
8f2613628a | ||
|
497a5fb1d8 | ||
|
0fa0e56ee0 | ||
|
f25cd80e4d | ||
|
f2cc33d849 | ||
|
f965b772fc | ||
|
17da1b9108 | ||
|
cfcca3c2de | ||
|
033949a810 | ||
|
3da7b0639f | ||
|
41fd56be34 | ||
|
8f8196976e | ||
|
56502bf1ad | ||
|
07d8559c6b | ||
|
269c512393 | ||
|
7a465451be | ||
|
5601e90d5c | ||
|
0d9b5c461a | ||
|
3c859dfebb | ||
|
47c04c382e | ||
|
983f5abb9a | ||
|
06da1e310b | ||
|
6861765935 | ||
|
16973234fc | ||
|
ebad1c5e0a | ||
|
0ef7320e27 | ||
|
ef3b352c73 | ||
|
4562975865 | ||
|
1f3da070ac | ||
|
2b2959dd34 | ||
|
b701aae6a8 | ||
|
8343c75024 | ||
|
ad1e45ddb5 | ||
|
fafdb489a7 | ||
|
fcb1af1b69 | ||
|
87010d3d02 | ||
|
abb8e6e97a | ||
|
c1260801fd | ||
|
aa4e0df1f0 | ||
|
0442a9a9f4 | ||
|
6896efdec2 | ||
|
d00759b212 | ||
|
5dbc768f1c | ||
|
e0c93c9b76 | ||
|
14a6beac3b | ||
|
cc69390670 | ||
|
ae195de0a3 | ||
|
4750f754fc | ||
|
d7bcd4c1b9 | ||
|
3028d73e5a | ||
|
f787da363b | ||
|
a2a6f9f61d | ||
|
2394f31c55 | ||
|
6e5676b380 | ||
|
c575d091bb | ||
|
d637282efe | ||
|
5bde6c2019 | ||
|
0ffa23c0f4 | ||
|
880cc3ebef | ||
|
2104e989cf | ||
|
78a6d34fa6 | ||
|
d270c1dea2 | ||
|
349b08d6ad | ||
|
2ed6c872f3 | ||
|
a829f08684 | ||
|
11237cf147 | ||
|
66d3c76b8a | ||
|
442d4dde72 | ||
|
f210a43391 | ||
|
385fd1b846 | ||
|
0629ae291a | ||
|
d82ebaa340 | ||
|
0df5056012 | ||
|
02f7fd158e | ||
|
6cf6fed024 | ||
|
131818ba5a | ||
|
004b811238 | ||
|
90b3f171a7 | ||
|
43fe4c4052 | ||
|
fe6fdfe2bb | ||
|
0258ba6256 | ||
|
830bf22fa5 | ||
|
b23414f654 | ||
|
f843a32877 | ||
|
b9130c866d | ||
|
81502cee20 | ||
|
b0ca5dae78 | ||
|
b8a6617026 | ||
|
03252ae287 | ||
|
67983484a4 | ||
|
9becf2f075 | ||
|
15d8fe1fee | ||
|
1bf5007428 | ||
|
9f5d1f7c31 | ||
|
5b080845a1 | ||
|
29b0bf26aa | ||
|
768b611136 | ||
|
52047be024 | ||
|
bc0d3e2912 | ||
|
7b85a1afa3 | ||
|
4fea08b9c9 | ||
|
9ddd4f7f94 | ||
|
f64fbdde8c | ||
|
f52c3ed019 | ||
|
6f06101ddf | ||
|
cd25509b1f | ||
|
0e967dff06 | ||
|
855698fb69 | ||
|
af24640290 | ||
|
b2282e5369 | ||
|
a9ae5b37bf | ||
|
a6daab1f6c | ||
|
6eab8b4368 | ||
|
b581721063 | ||
|
fcd92f16af | ||
|
293f876618 | ||
|
0ca81c0d37 | ||
|
0fc5e71c68 | ||
|
669b55e6d5 | ||
|
cb5f4f45ce | ||
|
22ec06c8aa | ||
|
fda6abd64f | ||
|
87f9867f55 | ||
|
4fcb0d5458 | ||
|
04c7f9023f | ||
|
df49a85dbc | ||
|
667abfaf8a | ||
|
1aa9314e3a | ||
|
d3049066ca | ||
|
dc65dd5be6 | ||
|
45e076b7a7 | ||
|
10ea1b6853 | ||
|
b3e1e343fe | ||
|
3781f14c31 | ||
|
9e6c4f1527 | ||
|
6ec4d300fe | ||
|
27e42bf61b | ||
|
cefc8d8821 | ||
|
5ac4548cdf | ||
|
e5cbb98256 | ||
|
40d1adb3eb | ||
|
b6e48ec641 | ||
|
91a5b13650 | ||
|
d3bc33731f | ||
|
29890da47d | ||
|
18219ab369 | ||
|
5b292858ba | ||
|
cd3a42640a | ||
|
81038d50c9 | ||
|
c1f032cd3a | ||
|
526dd0245b | ||
|
dd4cae4d82 | ||
|
1d802e234e | ||
|
83964ebc5e | ||
|
7191827f90 | ||
|
df4c129833 | ||
|
6fb8b96d9b | ||
|
4d0f2dce76 | ||
|
0334068343 | ||
|
d7fb5a4632 | ||
|
a6d73269b1 | ||
|
559b5d5283 | ||
|
a4c35479b7 | ||
|
0760f5fe96 | ||
|
f1a921cab2 | ||
|
ebfac291bd | ||
|
b1be077fa4 | ||
|
ee48361cf0 | ||
|
5fc5867e11 | ||
|
4e61b8d06b | ||
|
c6c18d879e | ||
|
4da45e2027 | ||
|
954175e513 | ||
|
1bbb512664 | ||
|
e8619f82ce | ||
|
262b7a311c | ||
|
b0bacc003a | ||
|
403d4bcdec | ||
|
cec7b8fb86 | ||
|
de652b14a7 | ||
|
e49eee4c51 | ||
|
d6f079b600 | ||
|
ff307fba98 | ||
|
f33d5d68ab | ||
|
4619b183f7 | ||
|
2779c222c8 | ||
|
6ed4651cb5 | ||
|
e4005ecb0b | ||
|
8b63877aca | ||
|
3a0c1bf64b | ||
|
26067e30c4 | ||
|
68bef3f0c7 | ||
|
76c09700ed | ||
|
d65b78f101 | ||
|
52437cb763 | ||
|
ac053f6124 | ||
|
69feaa37ae | ||
|
fc0494a654 | ||
|
7343bc8062 | ||
|
e6f958d15d | ||
|
ed8746801e | ||
|
6d9a0a9420 | ||
|
264914a512 | ||
|
39f0156fce | ||
|
3b46dd93dd | ||
|
1bf23e6b7f | ||
|
69e259e5e9 | ||
|
8d7aef3d1e | ||
|
fb57c30b70 | ||
|
8b03c82d36 | ||
|
16299ec84a | ||
|
e70d9b8c3c | ||
|
23d0833417 | ||
|
4436f72220 | ||
|
83e1007838 | ||
|
1010873bec | ||
|
f50db933c5 | ||
|
8d1b281af3 | ||
|
eea668c91a | ||
|
a88c10ab5e | ||
|
11cf25f030 | ||
|
5f66615bb5 | ||
|
ad3af92039 | ||
|
76f368c9fd | ||
|
cef7ecf6cd | ||
|
f413763b6b | ||
|
07eba7069d | ||
|
b5bd3ed648 | ||
|
4a723ed258 | ||
|
8a2e1a9d54 | ||
|
6809627276 | ||
|
b2305dd277 | ||
|
ac6613db46 | ||
|
233ffa90cc | ||
|
cf4e79e466 | ||
|
2da3e96cb7 | ||
|
2a5997f899 | ||
|
98d20e44dc | ||
|
d9c5beb159 | ||
|
05aba7e37b | ||
|
a1583a877b | ||
|
304a27e08f | ||
|
ef529e6ab7 | ||
|
5df16ecb7f | ||
|
0f78fd7349 | ||
|
49a4797e9c | ||
|
0ed73bcdcd | ||
|
5b73e17fb1 | ||
|
bfa7eeb61d | ||
|
005c855dc6 | ||
|
549ae85ce1 | ||
|
1794b98f72 | ||
|
10944bc390 | ||
|
d9c640b928 | ||
|
95dd7a6ecd | ||
|
81e1276adf | ||
|
d4d9116775 | ||
|
5410502f6d | ||
|
a10def9165 | ||
|
d9e206d4bf | ||
|
5da2c9b27a | ||
|
831bb137a8 | ||
|
2aa4fb10a5 | ||
|
da417eb8ed | ||
|
275d4bd439 | ||
|
184558d072 | ||
|
6b46d77243 | ||
|
0f4db639bb | ||
|
70a51d7187 | ||
|
2c868eef73 | ||
|
880086a2b5 | ||
|
e85162acb9 | ||
|
2cde4bbadc | ||
|
b72f487372 | ||
|
9b7242f5de | ||
|
a234383c5b | ||
|
e52838d358 | ||
|
a3fffb4f5e | ||
|
58942277bc | ||
|
f63a3e2867 | ||
|
2a08913443 | ||
|
6936ee0342 | ||
|
d900d7c985 | ||
|
60ee3bd8db | ||
|
4c6d0de7ba | ||
|
2add3cffb0 | ||
|
1100bc5aa0 | ||
|
ac10741648 | ||
|
3d87290487 | ||
|
64429fbd61 | ||
|
b6f6b636b0 | ||
|
e52b39ab8e | ||
|
f3fc5b47ad | ||
|
72a836c00a | ||
|
9f3594782d | ||
|
0ff3b52e06 | ||
|
7de0083812 | ||
|
89a69d4b64 | ||
|
8f3f5794b4 | ||
|
bfa65b61dd | ||
|
15e2022825 | ||
|
543f5ac30f | ||
|
e550f259a9 | ||
|
ae08ea246f | ||
|
77b702bfa4 | ||
|
280f49b811 | ||
|
0c6f94dae5 | ||
|
045bb32364 | ||
|
1c6dd45b9b | ||
|
79b10d4ce4 | ||
|
0a563f3fec | ||
|
c563077a38 | ||
|
895b87e380 | ||
|
c6a14de3ef | ||
|
ecbaa856da | ||
|
99fd30431d | ||
|
70bd2a85e9 | ||
|
a891bd7337 | ||
|
e4e314b1b6 | ||
|
54ae532cd4 | ||
|
9edba51f93 | ||
|
d7634dc0c5 | ||
|
18ef4e713f | ||
|
f7496d7173 | ||
|
39456d00f3 | ||
|
9fb2cbdac4 | ||
|
75b7aa9528 | ||
|
3b3d016b7b | ||
|
966363d5a3 | ||
|
9090c8b533 | ||
|
4d76bbcce6 | ||
|
4adf7074eb | ||
|
9917def329 | ||
|
f88290964f | ||
|
dd3907f221 | ||
|
5895956dd9 | ||
|
cd69c87383 | ||
|
5f46352300 | ||
|
9c227e07dd | ||
|
c0bf47682d | ||
|
93f5a54ff3 | ||
|
51fe5b5140 | ||
|
2a9e1b97c9 | ||
|
aa4240edff | ||
|
e9f4a2a934 | ||
|
fdd3e77a42 | ||
|
09808bd39b | ||
|
e25a76785e | ||
|
d374f2cdf9 | ||
|
f6b0258d25 | ||
|
0cb86979b2 | ||
|
56ca900782 | ||
|
659e7817e3 | ||
|
fbfd4a9ae0 | ||
|
4cecd19a44 | ||
|
dbf9cc87cb | ||
|
8a140ad955 | ||
|
b78c4934f6 | ||
|
8f465372a8 | ||
|
64bbf1dee2 | ||
|
cb9ee5a141 | ||
|
ad52023600 | ||
|
bef1933e72 | ||
|
3ea9a5c763 | ||
|
579ac2064b | ||
|
e9421e0ae4 | ||
|
d3971e1742 | ||
|
07c33e4ec9 | ||
|
8a219767e0 | ||
|
b420d98502 | ||
|
7c12d613ba | ||
|
395f333686 | ||
|
cd7bd491f3 | ||
|
1e2bf55e09 | ||
|
27e9839185 | ||
|
981b7edc0e | ||
|
ecd0f8b12f | ||
|
728f8950d6 | ||
|
3408526e86 | ||
|
a5f525fc48 | ||
|
7367cc6c24 | ||
|
77695f4da3 | ||
|
ba0014b9f8 | ||
|
24bfed691d | ||
|
b3548d32dd | ||
|
5a702acd3d | ||
|
f75a7f568e | ||
|
9095d37b8f | ||
|
d1102dba72 | ||
|
ca79bab7af | ||
|
cae524cdad | ||
|
e37bb20c7b | ||
|
1c2f052de2 | ||
|
0a6f48249a | ||
|
e38f26a2f7 | ||
|
2c0dfe63fc | ||
|
630f67ddfe | ||
|
2b5c643ae8 | ||
|
975478f6bb | ||
|
3c920616bb | ||
|
86379ac48b | ||
|
0d1f5b2b5d | ||
|
2617a73c36 | ||
|
ccaa7754a2 | ||
|
df29fd130a | ||
|
aaa4c651bf | ||
|
92beb1e4c7 | ||
|
27c4ceb41c | ||
|
890d8ede68 | ||
|
87d2afd07c | ||
|
72443dd250 | ||
|
5b0671c1e5 | ||
|
00eb12a2c7 | ||
|
72750e3bf9 | ||
|
acebdf14c9 | ||
|
631976706d | ||
|
714eedc5b9 | ||
|
d1fbfd7cd3 | ||
|
e57350403e | ||
|
e1dea56be3 | ||
|
67e9ab84ef | ||
|
f45dd2dd4f | ||
|
6b4d58a10c | ||
|
a08cbb95d6 | ||
|
2c5b667e64 | ||
|
137fb13deb | ||
|
56f7741e27 | ||
|
4e8ee0a08e | ||
|
14923c1a6b | ||
|
363c3fe253 | ||
|
e0fb2d3e5d | ||
|
f15cb995bb | ||
|
796ef9da06 | ||
|
73ca09d2f1 | ||
|
b8b6943393 | ||
|
508acb5f6c | ||
|
cc0d998b8b | ||
|
2aedaaef8a | ||
|
3b03b5e990 | ||
|
889cf68c3c | ||
|
09ef8e9258 | ||
|
58cf30f71f | ||
|
c91fb6b4fc | ||
|
8e586296c1 | ||
|
6e275c613e | ||
|
713aea3486 | ||
|
c2d6e2bc12 | ||
|
2e1083038d | ||
|
24fee0528c | ||
|
1e0db7b119 | ||
|
855abe0204 | ||
|
d106cf71ea | ||
|
2a1408d1d7 | ||
|
bf252e29a5 | ||
|
aeb6f57625 | ||
|
25517f7ce3 | ||
|
4e738cd408 | ||
|
73ae70db0f | ||
|
87a4624472 | ||
|
02ec23abeb | ||
|
1f739a851c | ||
|
6d56ace57b | ||
|
a50aa9dd88 | ||
|
e4bc73d727 | ||
|
11d0cd23dd | ||
|
dde2dd64f0 | ||
|
cae8231612 | ||
|
1342bd4486 | ||
|
e077a93dc6 | ||
|
488aab257f | ||
|
112c6c2237 | ||
|
0c805f4f8f | ||
|
d0f946f30d | ||
|
8e96580999 | ||
|
b2e043b689 | ||
|
1d79b72ee6 | ||
|
c64688f36a | ||
|
04cb578d33 | ||
|
1d25ff51af | ||
|
2c123c14cd | ||
|
e03a460f06 | ||
|
b1aff264bf | ||
|
cbba5ca104 | ||
|
c30084fbac | ||
|
0f4387e5c8 | ||
|
47dad47583 | ||
|
caf744956d | ||
|
c14b58614f | ||
|
46e4b3940e | ||
|
5a56c04939 | ||
|
d25cf17cea | ||
|
37d533da76 | ||
|
c25d390552 | ||
|
051bf6e0af | ||
|
2e3daaf688 | ||
|
3d7c6cfbab | ||
|
0b37c75e69 | ||
|
4134f2bddc | ||
|
5163d89398 | ||
|
a683ceca80 | ||
|
9dca2105ad | ||
|
271d8cd7df | ||
|
f75c747828 | ||
|
a6eaba4d7f | ||
|
64285f1526 | ||
|
a05a8a5aa1 | ||
|
eb59431346 | ||
|
5747610657 | ||
|
f3100a1a2f | ||
|
06766c0e19 | ||
|
f87a1e4158 | ||
|
8d3c4b552f | ||
|
d78675d195 | ||
|
3f02180031 | ||
|
d69e8a7b79 | ||
|
236601136f | ||
|
ec51c05936 | ||
|
ccbd8d84a6 | ||
|
6d614649ab | ||
|
13688930ae | ||
|
b20085454e | ||
|
ec50f7535b | ||
|
cb004eb0ad | ||
|
179c2f97f9 | ||
|
238d9b5c64 | ||
|
8653ea2088 | ||
|
91c31ff04a | ||
|
1b6e7633ca | ||
|
7e074d15e7 | ||
|
76022b02e8 | ||
|
fe507283af | ||
|
31f70606c6 | ||
|
6c2d935d1d | ||
|
6c252691c3 | ||
|
f6406f94dc | ||
|
0b6457efab | ||
|
38c977c148 | ||
|
c4061d18ef | ||
|
65e984cd8a | ||
|
d79d7b5860 | ||
|
a40e0b7aa9 | ||
|
97399f2d6f | ||
|
0a0566d5ed | ||
|
2d0c6692ee | ||
|
d272449d9e | ||
|
6c7ac681f4 | ||
|
99758ffd11 | ||
|
5274d681fe | ||
|
20eb921bfd | ||
|
9d0447ac5b | ||
|
550de36633 | ||
|
72b0a9bed9 | ||
|
825d138f83 | ||
|
d923365417 | ||
|
2b5f0daa6c | ||
|
60cb4d1b04 | ||
|
36dd3c781e | ||
|
5a57246eab | ||
|
ba94c38f08 | ||
|
c9734786da | ||
|
20274d2389 | ||
|
e95a0dfb46 | ||
|
efa88d51da | ||
|
03ac238b1f | ||
|
7dc7c7435e | ||
|
5685a243b6 | ||
|
3815101ff8 | ||
|
65cefddcde | ||
|
e9b2cf7bf0 | ||
|
02b9a8343f | ||
|
6a744d40d0 | ||
|
392a31467f | ||
|
4b8552d794 | ||
|
bc623a1125 | ||
|
cbf00651ed | ||
|
77ca824c65 | ||
|
1d4f84f9f4 | ||
|
180ac200da | ||
|
cb96e7d4f7 | ||
|
d2aafe1e41 | ||
|
8d65d3b25e | ||
|
b9777bb42e | ||
|
909ac65af1 | ||
|
fe280ecbee | ||
|
75135cc698 | ||
|
a253d217ee | ||
|
5a444dfd7c | ||
|
74f59e9275 | ||
|
1ea08a3dcd | ||
|
e243dfd12b | ||
|
5022732fed | ||
|
1e35fcc9ee | ||
|
7ebad830d6 | ||
|
c4add6b6e9 | ||
|
333f32ec23 | ||
|
70dbd16361 | ||
|
b22d093101 | ||
|
b6d5def2fa | ||
|
5b9626e8eb | ||
|
ced8f52fc6 | ||
|
4b8067392d | ||
|
4d9e527498 | ||
|
3f34e36d04 | ||
|
63c76537c6 | ||
|
5a1d521dee | ||
|
f803c03cc2 | ||
|
989f7a2cf0 | ||
|
d741d14193 | ||
|
c61db18e5d | ||
|
c731b54505 | ||
|
6b285ca366 | ||
|
1dc287c3a3 | ||
|
13e3f8c033 | ||
|
e91797885a | ||
|
0edb7ec5ce | ||
|
b22a62be5c | ||
|
7cd8a57599 | ||
|
ee3198e672 | ||
|
d9476a7ef1 | ||
|
2e3032b4aa | ||
|
053cd183c9 | ||
|
5d9af6a55a | ||
|
40d32e7942 | ||
|
a3068f06e6 | ||
|
45df1841e1 | ||
|
e9b4a4625c | ||
|
e223efc60c | ||
|
a4c35dedd9 | ||
|
8252e6bf2d | ||
|
4d601fc6b1 | ||
|
b2aeaf573e | ||
|
cf3062901d | ||
|
c5c7e68a91 | ||
|
0ed0372a6b | ||
|
ef4f218b3d | ||
|
d5d2b6bd24 | ||
|
d0a0c52c22 | ||
|
31ff1c443e | ||
|
6c2d8cb238 | ||
|
1360bcb84e | ||
|
cb7e6aa77a | ||
|
1549328f5f | ||
|
d3054be59e | ||
|
a2e721704b | ||
|
8b88b1634f | ||
|
032a7c9fe2 | ||
|
64bb8d4d51 | ||
|
61f5b77dd5 | ||
|
92a4eebb37 | ||
|
0caa769dbb | ||
|
def89ed025 | ||
|
5565a8c4d2 | ||
|
88252a90d1 | ||
|
8ac64c5b12 | ||
|
817e36690a | ||
|
13d9e0511e | ||
|
3b743b3b15 | ||
|
124d672ee6 | ||
|
cdd04623d7 | ||
|
5373d8a0f9 | ||
|
aaa5a23c95 | ||
|
c23ef28c20 | ||
|
c541989741 | ||
|
bffcfca88f | ||
|
dea5ef9dc4 | ||
|
18011927b1 | ||
|
b7b51025b9 | ||
|
a7360838d7 | ||
|
bff747501b | ||
|
ebafede928 | ||
|
3ff82ee5fc | ||
|
546603d39d | ||
|
b59ac35e7a | ||
|
efa5343a23 | ||
|
54b7f3cfc1 | ||
|
124b18cfb3 | ||
|
e00cd95590 | ||
|
a82385958e | ||
|
19f21ed916 | ||
|
a079c5550d | ||
|
c93356ada9 | ||
|
1beb268a68 | ||
|
91fa33eeca | ||
|
be409b6756 | ||
|
eece4292ac | ||
|
0c60e60b18 | ||
|
ee1ca53df6 | ||
|
88c6c1b64c | ||
|
8bb63e377b | ||
|
50874612be | ||
|
a802b26906 | ||
|
1df5fb2d83 | ||
|
8fe18cba76 | ||
|
f9dff90289 | ||
|
78e759910c | ||
|
dd7760470f | ||
|
e31fe995b8 | ||
|
4085777757 | ||
|
34a24786ca | ||
|
34c006cd47 | ||
|
6553c61724 | ||
|
992fbe3519 | ||
|
dc2c30ef92 | ||
|
1d5fde83d0 | ||
|
dca689d579 | ||
|
6fcd911c32 | ||
|
fe0a9af881 | ||
|
9759febdb8 | ||
|
b813843cca | ||
|
6b1f2cf41a | ||
|
3e4faa268e | ||
|
ef42ef7e6d | ||
|
5853e2e450 | ||
|
1eb72acddd | ||
|
2a9aac46a6 | ||
|
6686d9a125 | ||
|
c8dca871df | ||
|
1779cf40c0 | ||
|
58fe27722d | ||
|
67d3e63c2c | ||
|
3545488dd6 | ||
|
3e5c6c07b1 | ||
|
d3180516f3 | ||
|
f8c85cb7ec | ||
|
4f2494cf53 | ||
|
38a00bae86 | ||
|
b99f81268a | ||
|
36bbbf4f73 | ||
|
90347ab325 | ||
|
268aad6744 | ||
|
fe787dfb0f | ||
|
262c88461b | ||
|
c18ef81e79 | ||
|
b5daabdcd8 | ||
|
d1ee57e581 | ||
|
3da4193bb6 | ||
|
4257dfaa61 | ||
|
b1b69d2606 | ||
|
e10c79145e | ||
|
e366336525 | ||
|
ee4dc24f57 | ||
|
8b5c80e029 | ||
|
656d2539be | ||
|
b491aa95ab | ||
|
4e50eba1b6 | ||
|
66d04638e5 | ||
|
d4ccf26491 | ||
|
0f3cd8a92b | ||
|
70e3e99f2e | ||
|
411a373ed6 | ||
|
3378782691 | ||
|
25598f8bdb | ||
|
9eb87141ec | ||
|
55c84777ee | ||
|
5a693b89a1 | ||
|
d498274fcd | ||
|
5f446994a2 | ||
|
b96c7cf8ca | ||
|
2551014719 | ||
|
104bbee55e | ||
|
9e508f3acc | ||
|
e1a76b4702 | ||
|
9fb9cbfb65 | ||
|
80bfbd3e83 | ||
|
227dbb1190 | ||
|
cdc9b0c296 | ||
|
c3dc9d29d1 | ||
|
888d7f196d | ||
|
fe1abb4beb | ||
|
a6c910e358 | ||
|
820a98a463 | ||
|
128d435f5e | ||
|
72fbe88d72 | ||
|
1563349a96 | ||
|
066c71544e | ||
|
1530ceda05 | ||
|
4d3b9389e7 | ||
|
7ac4250e87 | ||
|
2aa9a9f03e | ||
|
55f67014d7 | ||
|
37db86ae23 | ||
|
5e0e476a95 | ||
|
d4ee449d1d | ||
|
665bfd41ac | ||
|
b85b20fba4 | ||
|
a701ea0fe1 | ||
|
e7df35b2bc | ||
|
2167c7f7a5 | ||
|
a347b08973 | ||
|
96015d5fc5 | ||
|
5eadb54e26 | ||
|
ecfd37ba1b | ||
|
b1c81b6ec3 | ||
|
44eb974081 | ||
|
344d057a2b | ||
|
ba9c8a8ccb | ||
|
54ec85dd29 | ||
|
5fef2c7069 | ||
|
a5cd613cdb | ||
|
36db7492e1 | ||
|
ebe8ef866b | ||
|
bf453d581e | ||
|
8f4833bb30 | ||
|
221c4f626f | ||
|
96337c6dbb | ||
|
6281a2ed3b | ||
|
0f87c53d0d | ||
|
7ab26d5180 | ||
|
bacfd6ed8c | ||
|
04f6b66b5e | ||
|
534397e538 | ||
|
153f5c7a93 | ||
|
d69d9227d0 | ||
|
a146c532c7 | ||
|
9a8d7aa7f7 | ||
|
6ecab5ad07 | ||
|
8b0e67821b | ||
|
6301d2e24a | ||
|
13d909f89a | ||
|
e96995a134 | ||
|
f6562949e4 | ||
|
f9fa014ee0 | ||
|
c33081c912 | ||
|
f7b31aa540 | ||
|
eca980c0c8 | ||
|
1bfcf64f39 | ||
|
b9a6d9d7ca | ||
|
98120f5fe2 | ||
|
674e2014ce | ||
|
d0ef841c8e | ||
|
e1ed31e65e | ||
|
29189291e5 | ||
|
339fe8dd6a | ||
|
6be947438f | ||
|
ac55e47818 | ||
|
d98cce8e63 | ||
|
6b26dd7165 | ||
|
b74b419a01 | ||
|
a993dc03ab | ||
|
eb2c0b2c80 | ||
|
ce3082a6e7 | ||
|
64797018df | ||
|
b91b8ee4c9 | ||
|
175a4b5db3 | ||
|
95cc496216 | ||
|
e037e88cd8 | ||
|
f8c0a004a5 | ||
|
ff5635e9ac | ||
|
e6c2468a9e | ||
|
bfc8f5667a | ||
|
1f26f5fdb9 | ||
|
7da06eeede | ||
|
ffe720c53e | ||
|
c8802c3dcc | ||
|
ab0ff0b0a6 | ||
|
a0767bae29 | ||
|
1f1c671284 | ||
|
6e6d767edf | ||
|
0d8ff45567 | ||
|
9006a2c6a3 | ||
|
386eb9d793 | ||
|
140b2b11a0 | ||
|
5af2a627d1 | ||
|
5060928b12 | ||
|
0c9f2cb10b | ||
|
d22c995a48 | ||
|
9686a4678d | ||
|
5830d2c399 | ||
|
456c4ccab2 | ||
|
f0053e837a | ||
|
351b49c1a7 | ||
|
6b0841c166 | ||
|
00c5eede48 | ||
|
3c5ce64f23 | ||
|
c455687fd0 | ||
|
fc504fdea7 | ||
|
5a1bfda4bd | ||
|
38a5df04ef | ||
|
8596c14090 | ||
|
de4f7f52f2 | ||
|
aae02dccf5 | ||
|
5942b32e79 | ||
|
c4172f8005 | ||
|
5bcf1d5671 | ||
|
231fdbb210 | ||
|
cfbe3c3500 | ||
|
147a656b34 | ||
|
4f9e71e1f7 | ||
|
5b91bf82c6 | ||
|
9c7d0d4992 | ||
|
c95e6d0917 | ||
|
c5d917158d | ||
|
9b4a20321e | ||
|
3d7ebd6434 | ||
|
0b560b980c | ||
|
5fbb0f9908 | ||
|
0a014fba41 | ||
|
0944818a19 | ||
|
4231a8193e | ||
|
05a32984ab | ||
|
b1956b5d42 | ||
|
cc0321f22a | ||
|
e52aed0d85 | ||
|
38504ad3e3 | ||
|
663b9e061e | ||
|
56326323e6 | ||
|
018f7b827f | ||
|
b1a9e404d4 | ||
|
709c9fd56b | ||
|
0760ed06a1 | ||
|
9e7790a352 | ||
|
256e2d885b | ||
|
cd67d66484 | ||
|
0f17c9fef1 | ||
|
4d603daa3a | ||
|
27f44846ac | ||
|
af7bc37a00 | ||
|
98a88a76dd | ||
|
40dc8c8bfd | ||
|
12f3447c21 | ||
|
aedd1559cc | ||
|
c27c0003c1 | ||
|
b90c335fbb | ||
|
0fd13678a6 | ||
|
78a6782158 | ||
|
6f3487a79b | ||
|
1ba4a4df39 | ||
|
699a2c30cb | ||
|
d1b777440b | ||
|
1d574dfc15 | ||
|
b24e99f7c4 | ||
|
dbc85eb993 | ||
|
e1fb441624 | ||
|
d9885abf80 | ||
|
824b6e3b5f | ||
|
dd190645eb | ||
|
65e0e10d23 | ||
|
f7e9858102 | ||
|
0a4f2d4869 | ||
|
b005802a1c | ||
|
58204afac3 | ||
|
bf9b044e67 | ||
|
845f7cfef2 | ||
|
2f1b849dc8 | ||
|
07bd82d42b | ||
|
cb3350ec62 | ||
|
0469ed6941 | ||
|
b12b2c74a3 | ||
|
28892d768b | ||
|
dd577319e8 | ||
|
ca2c8725c4 | ||
|
2eb370ffdb | ||
|
4d83616f9d | ||
|
549c59b30c | ||
|
afb04ba198 | ||
|
c8ae65ac52 | ||
|
2b85beae0b | ||
|
df67a480eb | ||
|
29d521b9fa | ||
|
b7bfcd1a7e | ||
|
bce776a5b6 | ||
|
a7bbe9d20b | ||
|
e46440360e | ||
|
ec66159475 | ||
|
8d8c487fb9 | ||
|
5aef7ba3ce | ||
|
c41100f05f | ||
|
da351bdbe2 | ||
|
9033652979 | ||
|
909762d078 | ||
|
3f903173fa | ||
|
065a7d406c | ||
|
ae38c9765a | ||
|
c1e732344a | ||
|
47f7040ddb | ||
|
3e8bab960e | ||
|
1f901a89f0 | ||
|
ae4cc2b084 | ||
|
7ccc9c954c | ||
|
316b43dee5 | ||
|
34d808add3 | ||
|
90456c3c06 | ||
|
aa0857304e | ||
|
e3df050e51 | ||
|
849c684b86 | ||
|
fbe1328a51 | ||
|
a34a886962 | ||
|
5942ea61de | ||
|
fe1b9e8e08 | ||
|
1806451073 | ||
|
34711bf198 | ||
|
d0976b9acc | ||
|
a2f32ef6ff | ||
|
36f2f049a8 | ||
|
883787a2c6 | ||
|
7fef06af4e | ||
|
a24de121cf | ||
|
792ace0ac3 | ||
|
89b1612fcf | ||
|
f5a343f5ef | ||
|
8afbd22eea | ||
|
a35ecb70b1 | ||
|
64047cb68c | ||
|
a5baa7b914 | ||
|
e1b3759079 | ||
|
9aeebd913e | ||
|
53a6b65604 | ||
|
ff469eae2c | ||
|
2e886a2e03 | ||
|
33aaf8d71f | ||
|
9461604e14 | ||
|
b1d95b19e5 | ||
|
5902cfa945 | ||
|
dc080d3b61 | ||
|
c03860d052 | ||
|
74d0a339b8 | ||
|
5bb1866e53 | ||
|
e33305ea6c | ||
|
6a9e59a1bc | ||
|
ac9b530e6b | ||
|
b3fa393f47 | ||
|
75787f6580 | ||
|
f0c562761f | ||
|
3ecca00330 | ||
|
1f279e7a53 | ||
|
373b1d0ee3 | ||
|
abea3bca82 | ||
|
ff1d0fbfba | ||
|
245c643cc8 | ||
|
51bd1f7699 | ||
|
90f0918846 | ||
|
5851b8253a | ||
|
dcb85e31fc | ||
|
12957e56d2 | ||
|
dd12683e1f | ||
|
58793b8838 | ||
|
81feb6d305 | ||
|
9384e1c011 | ||
|
ea30f8e813 | ||
|
551639a8cb | ||
|
4ec76c062d | ||
|
efb7210ff6 | ||
|
12155d5bdc | ||
|
d5a60558c5 | ||
|
faa6f20b53 | ||
|
dc19edf5a0 | ||
|
a43f0373ec | ||
|
b2959e9f1a | ||
|
1e9f966126 | ||
|
5306c0892f | ||
|
cc92ae2acf | ||
|
50e7c32d23 | ||
|
8186fb67e1 | ||
|
d9498e013b | ||
|
c298baa17a | ||
|
8bd85428c2 | ||
|
3f20f9cf4f | ||
|
4120bb498f | ||
|
a3d7ae2ed8 | ||
|
e29f9f1409 | ||
|
2d94e8f72a | ||
|
1dd46be315 | ||
|
8fe388d993 | ||
|
332de9a3b0 | ||
|
235aa246a4 | ||
|
c63bcc2e4b | ||
|
c02a2f2559 | ||
|
ecf25cb5c2 | ||
|
3bbff22cc5 | ||
|
2762bbe9a7 | ||
|
c22f2d01de | ||
|
81b7163580 | ||
|
589ae5a034 | ||
|
74ccebcdad | ||
|
f7ea618dec | ||
|
b0bc0b5206 | ||
|
a8f971318d | ||
|
edc2941a68 | ||
|
1c6ee78f36 | ||
|
b15e00c823 | ||
|
b0c6d928cb | ||
|
c7bdcc2ac2 | ||
|
9c4ed79c94 | ||
|
d154a4dfae | ||
|
841d8698dd | ||
|
c8e342e00b | ||
|
e8d2a98052 | ||
|
87a1f65e80 | ||
|
224f87932d | ||
|
6cea3c1b51 | ||
|
7548947d04 | ||
|
1affa1c09a | ||
|
e4a1d5a7c4 | ||
|
d5a002aba0 | ||
|
0c0a50d6b3 | ||
|
4672a48928 | ||
|
6cf1880fb5 | ||
|
5487d002fa | ||
|
c2c4199bc2 | ||
|
ab9e11da66 | ||
|
7878f706e7 | ||
|
b31501c90a | ||
|
705ed563de | ||
|
8565b5829c | ||
|
0f228f19fb | ||
|
6d2d2e6e5b | ||
|
73ee3abab1 | ||
|
a998027ba8 | ||
|
1101ffbf84 | ||
|
957024c1bc | ||
|
112e584ba0 | ||
|
d62cb7bb0c | ||
|
6accc5fad4 | ||
|
6bd4af305d | ||
|
bc2288f59b | ||
|
8b13bca9b8 | ||
|
3d1872b780 | ||
|
e01d92d43f | ||
|
f7d05bddd7 | ||
|
777f4aa083 | ||
|
4cc2b63bd8 | ||
|
7db1458f75 | ||
|
a10acf0e20 | ||
|
133451f344 | ||
|
72208a9a90 | ||
|
61c1742ba1 | ||
|
ee37e96479 | ||
|
5e3719aeae | ||
|
339cb0af96 | ||
|
abe63fa7dc | ||
|
5e2e5647b9 | ||
|
5ef3b66fec | ||
|
86defc2c25 | ||
|
61a044c6c1 | ||
|
cd66bd7316 | ||
|
c6073a0ead | ||
|
c16d4e35d1 | ||
|
e1e0428615 | ||
|
4a9b250bca | ||
|
ea992760ff | ||
|
b1bfdd6597 | ||
|
6d576e7ac4 | ||
|
bd13ecf355 | ||
|
68e60a388d | ||
|
1532e5d5ed | ||
|
cde8c56809 | ||
|
154dcd6c58 | ||
|
5b5028e67b | ||
|
d4dd22c7bc | ||
|
4bd6bf317e | ||
|
66f2329446 | ||
|
9de3067013 | ||
|
9222154ae7 | ||
|
1d212a83df | ||
|
20203d3f98 | ||
|
b77e1a240e | ||
|
10dfa028f0 | ||
|
06e2409667 | ||
|
cd626ef0fb | ||
|
e149055310 | ||
|
19d76ae608 | ||
|
1bc5d2b3c7 | ||
|
27db236ac2 | ||
|
c1d6749b0e | ||
|
d0196be1e3 | ||
|
e6c80aea71 | ||
|
5b29e438eb | ||
|
1bae3e0ed1 | ||
|
8f558d8aca | ||
|
aebe5a36b6 | ||
|
24326f381f | ||
|
1667eec699 | ||
|
f832bb3466 | ||
|
b854e2bf75 | ||
|
0537f332c9 | ||
|
0e2a5749d8 | ||
|
1fa7fdf6ea | ||
|
8805bd904a | ||
|
a39e722670 | ||
|
52b68f7d45 | ||
|
c9f02a96d8 | ||
|
a7119c8152 | ||
|
79f84eb676 | ||
|
db79f8019d | ||
|
f33d39949b | ||
|
951c6e63f8 | ||
|
5ac0a5450b | ||
|
6ee9c68912 | ||
|
4faf13222e | ||
|
3db2823f1e | ||
|
541a3f5882 | ||
|
cd49821608 | ||
|
23b53ede35 | ||
|
a16f7f4794 | ||
|
2157bc9c8b | ||
|
90f7f19ae7 | ||
|
7777360637 | ||
|
b7c7ec8c17 | ||
|
44d2e8d7ca | ||
|
e7f0a829c9 | ||
|
f3b314331c | ||
|
79820e32ec | ||
|
0a57a9782b | ||
|
06140766c1 | ||
|
a68749f39a | ||
|
d429d00f97 | ||
|
de707b0866 | ||
|
25184ec33c | ||
|
cdbf45ad85 | ||
|
dc9b2a5740 | ||
|
97e1ff1b91 | ||
|
ea927d2f3f | ||
|
f0c69b614c | ||
|
f71503c37c | ||
|
29c5075787 | ||
|
0939fda93c | ||
|
006c2647dc | ||
|
78647b9228 | ||
|
02a908fc6d | ||
|
1c06bd485e | ||
|
2e5fb984ed | ||
|
f068aa038d | ||
|
a4e754fcc9 | ||
|
63c677e20f | ||
|
3c3277f21e | ||
|
3e44e9f534 | ||
|
0feca62c7a | ||
|
f440f7e3ca | ||
|
3be421e987 | ||
|
8bd72d7c05 | ||
|
ebfca258f5 | ||
|
7f029e1b31 | ||
|
8bdb022115 | ||
|
aae5def8bb | ||
|
a9b7e035ba | ||
|
8bbb56b485 | ||
|
d624deb7ab | ||
|
8aaa8f7bc0 | ||
|
a87e79d9d6 | ||
|
ffcec664ca | ||
|
75505d1611 | ||
|
8c33cc0ec9 | ||
|
41bfaffd13 | ||
|
54c7728a04 | ||
|
44e6186eea | ||
|
6461344c31 | ||
|
ee33344c59 | ||
|
7cb0313359 | ||
|
5eecb45af0 | ||
|
99576ee3fd | ||
|
7ff68b5edc | ||
|
e34914db19 | ||
|
7a141b1306 | ||
|
bad0b5e871 | ||
|
f3f80a57e1 | ||
|
f110b7734b | ||
|
5563281fa2 | ||
|
0a54cd4431 | ||
|
ae957a59f7 | ||
|
ca3817dc17 | ||
|
b8d06293ca | ||
|
46433d44a9 | ||
|
3a039a567a | ||
|
9f0d7651b3 | ||
|
93fe14c2f7 | ||
|
7f0301e39a | ||
|
48ed4769fc | ||
|
44b5d55d8f | ||
|
2460ec2a8f | ||
|
3a24b397a3 | ||
|
080851aec1 | ||
|
7fc21c29e8 | ||
|
5347372116 | ||
|
53be772103 | ||
|
1ec2e7d0e8 | ||
|
4123d6da70 | ||
|
54024039f8 | ||
|
568556cf36 | ||
|
4184aabda2 | ||
|
7aaa7e67c4 | ||
|
3499b150d1 | ||
|
40070a186a | ||
|
6ef394ffe2 | ||
|
c9faac275b | ||
|
a35918caae | ||
|
6791175f05 | ||
|
4745a1efe5 | ||
|
ce2818e418 | ||
|
582e4e449d | ||
|
4109d0d754 | ||
|
2d70c90d2e | ||
|
6b86f6f336 | ||
|
ce2697abeb | ||
|
052c98ce24 | ||
|
97511979b4 | ||
|
e12ceb40ce | ||
|
ce3cd892c8 | ||
|
4bf95a9f36 | ||
|
99a6529e1e | ||
|
8f86d67d46 | ||
|
7072a185d0 | ||
|
dacf87e885 | ||
|
f412ecc3f4 | ||
|
dc7363f848 | ||
|
7506fe43a1 | ||
|
1efda6414f | ||
|
ad6040ec9b | ||
|
9efe8d6040 | ||
|
2052cb675f | ||
|
c0d221a348 | ||
|
3dbf922901 | ||
|
de8373fa07 | ||
|
f4043414da | ||
|
a2acb04ca6 | ||
|
70d0a7549e | ||
|
28fd7b090d | ||
|
0c8b880223 | ||
|
115eae650b | ||
|
718a937ed9 | ||
|
9e62c23017 | ||
|
2040e6c556 | ||
|
2001f84e8c | ||
|
9609d24b19 | ||
|
9169f67690 | ||
|
73fef64f14 | ||
|
890d9ee554 | ||
|
7823611cda | ||
|
a012bf6e3e | ||
|
77204d608b | ||
|
e1511113de | ||
|
8aa4db4b80 | ||
|
c60d751b73 | ||
|
940dbd071e | ||
|
20b58eb850 | ||
|
ed0e52fc9a | ||
|
4f735fc8cd | ||
|
0a4c903c5a | ||
|
79195517f8 | ||
|
e58427e396 | ||
|
30939ff2bc | ||
|
751053d6f1 | ||
|
987363c9ce | ||
|
4344a788c4 | ||
|
8ad5f10a2b | ||
|
f9bba77495 | ||
|
17ac6b23dc | ||
|
f1f8ce6de7 | ||
|
1662676d58 | ||
|
8ee7ad9095 | ||
|
449083a3f8 | ||
|
c4e75574a0 | ||
|
61a7b0ec63 | ||
|
e537d87817 | ||
|
72dd8a53fc | ||
|
03823aa3c6 | ||
|
09c3c69cfd | ||
|
f72df1385e | ||
|
01bbf1f739 | ||
|
34a4ddda4d | ||
|
4887443e4f | ||
|
56658c22a6 | ||
|
7162fdb037 | ||
|
e0db09cd1c | ||
|
d16e777ac5 | ||
|
1eac82c878 | ||
|
fd501a7984 | ||
|
84391f5795 | ||
|
c0d9813cec | ||
|
3fad4a9527 | ||
|
ccd05ddd50 | ||
|
a02a5f3dbf | ||
|
0e6b86731e | ||
|
bee0f2f167 | ||
|
8a641d2b73 | ||
|
2ad34f65af | ||
|
693877f8e5 | ||
|
a6a0a59756 | ||
|
9b17c6511d | ||
|
1263ecf2ff | ||
|
821807bcef | ||
|
896ae6fc24 | ||
|
c9e6803cf4 | ||
|
c095341cc4 | ||
|
20ddbc133f | ||
|
2de87e461d | ||
|
83ba30c5a3 | ||
|
a5a0f73dd2 | ||
|
93efab6d9a | ||
|
6f49996ced | ||
|
81add864f4 | ||
|
5db9414cc1 | ||
|
75771aebd3 | ||
|
8d4d55b15b | ||
|
e75ee97224 | ||
|
994df20926 | ||
|
d5988a8ac9 | ||
|
86737681af | ||
|
e434be3c9c | ||
|
19ef86eec6 | ||
|
35f613d96c | ||
|
b23fc39cd3 | ||
|
c7be0dd5b9 | ||
|
864701886f | ||
|
877251b421 | ||
|
5552ac4231 | ||
|
c4122dcaad | ||
|
630cb8507b | ||
|
d65f2cea36 | ||
|
41a9c3fd11 | ||
|
199de89677 | ||
|
69dfa8d87a | ||
|
06c1f423e1 | ||
|
bafa76ef5b | ||
|
7230212a43 | ||
|
68599525d8 | ||
|
1db271df76 | ||
|
74f3318cc0 | ||
|
d7a09cb86a | ||
|
11cf02f6d0 | ||
|
e827d21da1 | ||
|
9904222db0 | ||
|
8e011d83bb | ||
|
841d86fe40 | ||
|
6a10344080 | ||
|
e6bf3cfd50 | ||
|
7ee089f604 | ||
|
6945837e4c | ||
|
4faf534046 | ||
|
66833b2a87 | ||
|
c3492bd9bb | ||
|
bac7f02365 | ||
|
748cd9a680 | ||
|
9d5aab0554 | ||
|
42e8bc7d16 | ||
|
2632981783 | ||
|
bc6a8b78aa | ||
|
8b2eb7b3f6 | ||
|
5986cf382e | ||
|
c8e36b75b5 | ||
|
767ddbe874 | ||
|
e6b10112b3 | ||
|
5e2c0ecd0b | ||
|
e74cea4c7b | ||
|
32ae05811d | ||
|
cd9349ac53 | ||
|
b921c62943 | ||
|
0b545abb5f | ||
|
30142a32ac | ||
|
faf0475b13 | ||
|
6250a1206e | ||
|
3d2bb75495 | ||
|
ab187ae25a | ||
|
a662afb5b0 | ||
|
a676a24656 | ||
|
6735645d9c | ||
|
0dbb0f1a5c | ||
|
425d25699b | ||
|
d40695ad82 | ||
|
5367f17db4 | ||
|
bc6a7a27ce | ||
|
f21547ff64 | ||
|
8ab0bd2397 | ||
|
6a3094c996 | ||
|
94c0129d24 | ||
|
d4d87596c1 | ||
|
fbe2c4b9be | ||
|
fceafda518 | ||
|
f32bfe6d06 | ||
|
4f10654e04 | ||
|
1dbd423fbb | ||
|
c45f4c5e75 | ||
|
0c1ffb9504 | ||
|
1d4c17a6ef | ||
|
9c6961d598 | ||
|
b2725f57c7 | ||
|
9eaa902a52 | ||
|
9dd8b1908e | ||
|
e8097a74b7 | ||
|
6478baf891 | ||
|
4a64cbda86 | ||
|
e21e355e2c | ||
|
1c7a65eba7 | ||
|
2db0ccc2d7 | ||
|
62382925c9 | ||
|
2583352f24 | ||
|
db408fa3c1 | ||
|
24a105a7d8 | ||
|
0e58b55a46 | ||
|
5ae0723355 | ||
|
043944c550 | ||
|
2b2087478c | ||
|
0a1bd0a35d | ||
|
c74805f1e7 | ||
|
01bd1c98fa | ||
|
b721aa749b | ||
|
84513df419 | ||
|
1e1d16971d | ||
|
29af38b0f8 | ||
|
137ed15511 | ||
|
cf9ff46b08 | ||
|
d02a848e32 | ||
|
2067d9f8bf | ||
|
57d1afc889 | ||
|
228e4f4706 | ||
|
e73fbac5d7 | ||
|
66329d53bd | ||
|
46cced287e | ||
|
1f7e7e70d2 | ||
|
3710ec21d5 | ||
|
fe90d0d2ad | ||
|
6e601a4109 | ||
|
018432f0ce | ||
|
e0e26f9c1f | ||
|
20737c2fe6 | ||
|
ceec363801 | ||
|
0f33366483 | ||
|
24ed9cfd23 | ||
|
2c4a45b361 | ||
|
0e8a782922 | ||
|
579510336e | ||
|
479a3b6053 | ||
|
427b2f41a6 | ||
|
2117989c26 | ||
|
2d94c38ba5 | ||
|
c7c5a6c4f7 | ||
|
ada385843b | ||
|
3143144ba5 | ||
|
cee85c48e9 | ||
|
ffb4c72d7b | ||
|
5a6c5af64a | ||
|
218d55a050 | ||
|
b6ad4675b6 | ||
|
a37c60b660 | ||
|
d32159853d | ||
|
1e4725e569 | ||
|
36c19ee6c7 | ||
|
39b0867d83 | ||
|
523152618d | ||
|
f2655dcf28 | ||
|
643e8e4bd4 | ||
|
779ddcdf96 | ||
|
a2ea6894e6 | ||
|
5f354f6a4a | ||
|
6d88babba3 | ||
|
038720e899 | ||
|
cbbccf3cf3 | ||
|
2e94e41297 | ||
|
09c80b07b4 | ||
|
4cc824283c | ||
|
a3623244b9 | ||
|
a099239015 | ||
|
0bc94c748b | ||
|
3a71670618 | ||
|
dcd39e09ff | ||
|
c5fcec8c3f | ||
|
cf4a8fa455 | ||
|
2a2f01b9a0 | ||
|
bee14e9ebc | ||
|
9d1c98e699 | ||
|
2fad330f6b | ||
|
9f4f29cbee | ||
|
6a4eed9bad | ||
|
e4fb8f1d31 | ||
|
9a6b445bc2 | ||
|
beacbc7492 | ||
|
0ba795d21a | ||
|
ff260aa7ab | ||
|
5397bd425e | ||
|
4e97974c1e | ||
|
a5b84d3480 | ||
|
8b13e18143 | ||
|
b23276135a | ||
|
701e8cc29a | ||
|
cd16355bbf | ||
|
3d110afbca | ||
|
bb207f6cda | ||
|
7dbc50bd24 |
3
.gitmodules
vendored
Normal file
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "CryptoPkg/Library/OpensslLib/openssl"]
|
||||
path = CryptoPkg/Library/OpensslLib/openssl
|
||||
url = https://github.com/openssl/openssl
|
@@ -7,7 +7,7 @@
|
||||
# for important information about configuring this package for your
|
||||
# environment.
|
||||
#
|
||||
# Copyright (c) 2010 - 2014, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -40,8 +40,6 @@
|
||||
gEfiMdePkgTokenSpaceGuid.PcdDebugPropertyMask|$(DEBUG_PROPERTY_MASK)
|
||||
gEfiMdePkgTokenSpaceGuid.PcdDebugPrintErrorLevel|$(DEBUG_PRINT_ERROR_LEVEL)
|
||||
|
||||
[PcdsFixedAtBuild.IPF]
|
||||
|
||||
[LibraryClasses]
|
||||
#
|
||||
# Entry Point Libraries
|
||||
|
@@ -9,7 +9,7 @@
|
||||
# NOTE: Improvements gratefully received. Please mention the version.
|
||||
# "http://www.cwi.nl/~steven/enquire.html"
|
||||
#
|
||||
# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -29,7 +29,7 @@
|
||||
ENTRY_POINT = ShellCEntryLib
|
||||
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF
|
||||
# VALID_ARCHITECTURES = IA32 X64
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# A simple, basic, EDK II native, "hello" application.
|
||||
#
|
||||
# Copyright (c) 2010, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -21,7 +21,7 @@
|
||||
ENTRY_POINT = ShellCEntryLib
|
||||
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF
|
||||
# VALID_ARCHITECTURES = IA32 X64
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -3,7 +3,7 @@
|
||||
# from the standard input, and writing results to the standard output.
|
||||
#
|
||||
# Copyright (C) 2014, Red Hat, Inc.
|
||||
# Copyright (c) 2010 - 2011, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2010 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
#
|
||||
# This program and the accompanying materials are licensed and made available
|
||||
# under the terms and conditions of the BSD License which accompanies this
|
||||
@@ -24,7 +24,7 @@
|
||||
ENTRY_POINT = ShellCEntryLib
|
||||
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF
|
||||
# VALID_ARCHITECTURES = IA32 X64
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
File diff suppressed because it is too large
Load Diff
@@ -2,7 +2,7 @@
|
||||
# PythonCore.inf
|
||||
#
|
||||
# Copyright (c) 2015, Daryl McDaniel. All rights reserved.<BR>
|
||||
# Copyright (c) 2011-2012, Intel Corporation. All rights reserved.<BR>
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
DEFINE PYTHON_VERSION = 2.7.2
|
||||
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF
|
||||
# VALID_ARCHITECTURES = IA32 X64
|
||||
#
|
||||
|
||||
[Packages]
|
||||
@@ -252,4 +252,3 @@
|
||||
MSFT:*_*_X64_CC_FLAGS = /Oi- /wd4018 /wd4054 /wd4055 /wd4101 /wd4131 /wd4152 /wd4204 /wd4210 /wd4244 /wd4267 /wd4305 /wd4310 /wd4389 /wd4701 /wd4702 /wd4706 /I$(WORKSPACE)\AppPkg\Applications\Python\X64 /I$(WORKSPACE)\AppPkg\Applications\Python\Efi /I$(WORKSPACE)\AppPkg\Applications\Python\Python-$(PYTHON_VERSION)\Include /DHAVE_MEMMOVE /DUSE_PYEXPAT_CAPI /DXML_STATIC
|
||||
GCC:*_*_IA32_CC_FLAGS = -fno-builtin -Wno-format -I$(WORKSPACE)/AppPkg/Applications/Python/Ia32 -I$(WORKSPACE)/AppPkg/Applications/Python/Python-$(PYTHON_VERSION)/Include -DHAVE_MEMMOVE -DUSE_PYEXPAT_CAPI -DXML_STATIC
|
||||
GCC:*_*_X64_CC_FLAGS = -Wno-format -I$(WORKSPACE)/AppPkg/Applications/Python/X64 -I$(WORKSPACE)/AppPkg/Applications/Python/Python-$(PYTHON_VERSION)/Include -DHAVE_MEMMOVE -DUSE_PYEXPAT_CAPI -DXML_STATIC
|
||||
GCC:*_*_IPF_SYMRENAME_FLAGS = --redefine-syms=$(WORKSPACE)/StdLib/GccSymRename.txt
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# DataSink Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# DataSource Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# GetAddrInfo Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# GetHostByAddr Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# GetHostByDns Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# GetHostByName Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# GetNameInfo Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# GetNetByAddr Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# GetNetByName Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# GetServByName Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# GetServByPort Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# OobRx Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# OobTx Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# RawIp4 Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# RawIp4Tx Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# Receive Datagram Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# SetHostName Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# SetHostName Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# TFTP Server Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -1,7 +1,7 @@
|
||||
## @file
|
||||
# Web Server Application
|
||||
#
|
||||
# Copyright (c) 2011-2012, Intel Corporation
|
||||
# Copyright (c) 2011 - 2018, Intel Corporation. All rights reserved.<BR>
|
||||
# All rights reserved. This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
@@ -24,7 +24,7 @@
|
||||
#
|
||||
# The following information is for reference only and not required by the build tools.
|
||||
#
|
||||
# VALID_ARCHITECTURES = IA32 X64 IPF EBC
|
||||
# VALID_ARCHITECTURES = IA32 X64 EBC
|
||||
#
|
||||
|
||||
[Sources]
|
||||
|
@@ -2,7 +2,7 @@
|
||||
# ARM processor package.
|
||||
#
|
||||
# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
|
||||
# Copyright (c) 2011 - 2017, ARM Limited. All rights reserved.
|
||||
# Copyright (c) 2011 - 2018, ARM Limited. All rights reserved.
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
@@ -39,7 +39,10 @@
|
||||
DefaultExceptionHandlerLib|Include/Library/DefaultExceptionHandlerLib.h
|
||||
ArmDisassemblerLib|Include/Library/ArmDisassemblerLib.h
|
||||
ArmGicArchLib|Include/Library/ArmGicArchLib.h
|
||||
ArmMtlLib|ArmPlatformPkg/Include/Library/ArmMtlLib.h
|
||||
ArmSvcLib|Include/Library/ArmSvcLib.h
|
||||
OpteeLib|Include/Library/OpteeLib.h
|
||||
StandaloneMmMmuLib|Include/Library/StandaloneMmMmuLib.h
|
||||
|
||||
[Guids.common]
|
||||
gArmTokenSpaceGuid = { 0xBB11ECFE, 0x820F, 0x4968, { 0xBB, 0xA6, 0xF7, 0x6A, 0xFE, 0x30, 0x25, 0x96 } }
|
||||
@@ -48,6 +51,20 @@
|
||||
# Include/Guid/ArmMpCoreInfo.h
|
||||
gArmMpCoreInfoGuid = { 0xa4ee0728, 0xe5d7, 0x4ac5, {0xb2, 0x1e, 0x65, 0x8e, 0xd8, 0x57, 0xe8, 0x34} }
|
||||
|
||||
[Protocols.common]
|
||||
## Arm System Control and Management Interface(SCMI) Base protocol
|
||||
## ArmPkg/Include/Protocol/ArmScmiBaseProtocol.h
|
||||
gArmScmiBaseProtocolGuid = { 0xd7e5abe9, 0x33ab, 0x418e, { 0x9f, 0x91, 0x72, 0xda, 0xe2, 0xba, 0x8e, 0x2f } }
|
||||
|
||||
## Arm System Control and Management Interface(SCMI) Clock management protocol
|
||||
## ArmPkg/Include/Protocol/ArmScmiClockProtocol.h
|
||||
gArmScmiClockProtocolGuid = { 0x91ce67a8, 0xe0aa, 0x4012, { 0xb9, 0x9f, 0xb6, 0xfc, 0xf3, 0x4, 0x8e, 0xaa } }
|
||||
gArmScmiClock2ProtocolGuid = { 0xb8d8caf2, 0x9e94, 0x462c, { 0xa8, 0x34, 0x6c, 0x99, 0xfc, 0x05, 0xef, 0xcf } }
|
||||
|
||||
## Arm System Control and Management Interface(SCMI) Clock management protocol
|
||||
## ArmPkg/Include/Protocol/ArmScmiPerformanceProtocol.h
|
||||
gArmScmiPerformanceProtocolGuid = { 0x9b8ba84, 0x3dd3, 0x49a6, { 0xa0, 0x5a, 0x31, 0x34, 0xa5, 0xf0, 0x7b, 0xad } }
|
||||
|
||||
[Ppis]
|
||||
## Include/Ppi/ArmMpCoreInfo.h
|
||||
gArmMpCoreInfoPpiGuid = { 0x6847cc74, 0xe9ec, 0x4f8f, {0xa2, 0x9d, 0xab, 0x44, 0xe7, 0x54, 0xa8, 0xfc} }
|
||||
@@ -64,13 +81,13 @@
|
||||
# it has been configured by the CPU DXE
|
||||
gArmTokenSpaceGuid.PcdDebuggerExceptionSupport|FALSE|BOOLEAN|0x00000032
|
||||
|
||||
# Define if the spin-table mechanism is used by the secondary cores when booting
|
||||
# Linux (instead of PSCI)
|
||||
gArmTokenSpaceGuid.PcdArmLinuxSpinTable|FALSE|BOOLEAN|0x00000033
|
||||
|
||||
# Define if the GICv3 controller should use the GICv2 legacy
|
||||
gArmTokenSpaceGuid.PcdArmGicV3WithV2Legacy|FALSE|BOOLEAN|0x00000042
|
||||
|
||||
# Whether to implement warm reboot for capsule update using a jump back to the
|
||||
# PEI entry point with caches and interrupts disabled.
|
||||
gArmTokenSpaceGuid.PcdArmReenterPeiForCapsuleWarmReboot|FALSE|BOOLEAN|0x0000001F
|
||||
|
||||
[PcdsFeatureFlag.ARM]
|
||||
# Whether to map normal memory as non-shareable. FALSE is the safe choice, but
|
||||
# TRUE may be appropriate to fix performance problems if you don't care about
|
||||
@@ -153,16 +170,6 @@
|
||||
# By default we do not do a transition to non-secure mode
|
||||
gArmTokenSpaceGuid.PcdArmNonSecModeTransition|0x0|UINT32|0x0000003E
|
||||
|
||||
# The Linux ATAGs are expected to be under 0x4000 (16KB) from the beginning of the System Memory
|
||||
gArmTokenSpaceGuid.PcdArmLinuxAtagMaxOffset|0x4000|UINT32|0x00000020
|
||||
|
||||
# If the fixed FDT address is not available, then it should be loaded below the kernel.
|
||||
# The recommendation from the Linux kernel is to have the FDT below 16KB.
|
||||
# (see the kernel doc: Documentation/arm/Booting)
|
||||
gArmTokenSpaceGuid.PcdArmLinuxFdtMaxOffset|0x4000|UINT32|0x00000023
|
||||
# The FDT blob must be loaded at a 64bit aligned address.
|
||||
gArmTokenSpaceGuid.PcdArmLinuxFdtAlignment|0x8|UINT32|0x00000026
|
||||
|
||||
# Non Secure Access Control Register
|
||||
# - BIT15 : NSASEDIS - Disable Non-secure Advanced SIMD functionality
|
||||
# - BIT14 : NSD32DIS - Disable Non-secure use of D16-D31
|
||||
@@ -201,12 +208,6 @@
|
||||
# Other modes include using SP0 or switching to Aarch32, but these are
|
||||
# not currently supported.
|
||||
gArmTokenSpaceGuid.PcdArmNonSecModeTransition|0x3c9|UINT32|0x0000003E
|
||||
# If the fixed FDT address is not available, then it should be loaded above the kernel.
|
||||
# The recommendation from the AArch64 Linux kernel is to have the FDT below 512MB.
|
||||
# (see the kernel doc: Documentation/arm64/booting.txt)
|
||||
gArmTokenSpaceGuid.PcdArmLinuxFdtMaxOffset|0x20000000|UINT32|0x00000023
|
||||
# The FDT blob must be loaded at a 2MB aligned address.
|
||||
gArmTokenSpaceGuid.PcdArmLinuxFdtAlignment|0x00200000|UINT32|0x00000026
|
||||
|
||||
|
||||
#
|
||||
@@ -221,6 +222,9 @@
|
||||
gArmTokenSpaceGuid.PcdSystemMemoryBase|0|UINT64|0x00000029
|
||||
gArmTokenSpaceGuid.PcdSystemMemorySize|0|UINT64|0x0000002A
|
||||
|
||||
gArmTokenSpaceGuid.PcdMmBufferBase|0|UINT64|0x00000045
|
||||
gArmTokenSpaceGuid.PcdMmBufferSize|0|UINT64|0x00000046
|
||||
|
||||
[PcdsFixedAtBuild.common, PcdsDynamic.common]
|
||||
#
|
||||
# ARM Architectural Timer
|
||||
|
@@ -2,7 +2,7 @@
|
||||
# ARM processor package.
|
||||
#
|
||||
# Copyright (c) 2009 - 2010, Apple Inc. All rights reserved.<BR>
|
||||
# Copyright (c) 2011 - 2015, ARM Ltd. All rights reserved.<BR>
|
||||
# Copyright (c) 2011 - 2018, ARM Ltd. All rights reserved.<BR>
|
||||
# Copyright (c) 2016, Linaro Ltd. All rights reserved.<BR>
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
@@ -27,13 +27,10 @@
|
||||
DSC_SPECIFICATION = 0x00010005
|
||||
OUTPUT_DIRECTORY = Build/Arm
|
||||
SUPPORTED_ARCHITECTURES = ARM|AARCH64
|
||||
BUILD_TARGETS = DEBUG|RELEASE
|
||||
BUILD_TARGETS = DEBUG|RELEASE|NOOPT
|
||||
SKUID_IDENTIFIER = DEFAULT
|
||||
|
||||
[BuildOptions]
|
||||
XCODE:*_*_ARM_PLATFORM_FLAGS == -arch armv7
|
||||
GCC:*_*_ARM_PLATFORM_FLAGS == -march=armv7-a -mfpu=neon
|
||||
|
||||
RELEASE_*_*_CC_FLAGS = -DMDEPKG_NDEBUG
|
||||
*_*_*_CC_FLAGS = -DDISABLE_NEW_DEPRECATED_INTERFACES
|
||||
|
||||
@@ -71,6 +68,7 @@
|
||||
ArmGenericTimerCounterLib|ArmPkg/Library/ArmGenericTimerPhyCounterLib/ArmGenericTimerPhyCounterLib.inf
|
||||
ArmSmcLib|ArmPkg/Library/ArmSmcLib/ArmSmcLib.inf
|
||||
ArmDisassemblerLib|ArmPkg/Library/ArmDisassemblerLib/ArmDisassemblerLib.inf
|
||||
OpteeLib|ArmPkg/Library/OpteeLib/OpteeLib.inf
|
||||
|
||||
UefiApplicationEntryPoint|MdePkg/Library/UefiApplicationEntryPoint/UefiApplicationEntryPoint.inf
|
||||
PerformanceLib|MdePkg/Library/BasePerformanceLibNull/BasePerformanceLibNull.inf
|
||||
@@ -87,6 +85,8 @@
|
||||
ArmLib|ArmPkg/Library/ArmLib/ArmBaseLib.inf
|
||||
ArmMmuLib|ArmPkg/Library/ArmMmuLib/ArmMmuBaseLib.inf
|
||||
|
||||
ArmMtlLib|ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.inf
|
||||
|
||||
[LibraryClasses.common.PEIM]
|
||||
HobLib|MdePkg/Library/PeiHobLib/PeiHobLib.inf
|
||||
PeimEntryPoint|MdePkg/Library/PeimEntryPoint/PeimEntryPoint.inf
|
||||
@@ -129,6 +129,7 @@
|
||||
ArmPkg/Library/ArmSmcLibNull/ArmSmcLibNull.inf
|
||||
ArmPkg/Library/ArmHvcLib/ArmHvcLib.inf
|
||||
ArmPkg/Library/ArmSvcLib/ArmSvcLib.inf
|
||||
ArmPkg/Library/OpteeLib/OpteeLib.inf
|
||||
|
||||
ArmPkg/Filesystem/SemihostFs/SemihostFs.inf
|
||||
|
||||
@@ -144,5 +145,8 @@
|
||||
ArmPkg/Library/PeiServicesTablePointerLib/PeiServicesTablePointerLib.inf
|
||||
ArmPkg/Library/PlatformBootManagerLib/PlatformBootManagerLib.inf
|
||||
|
||||
ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
|
||||
|
||||
[Components.AARCH64]
|
||||
ArmPkg/Library/ArmMmuLib/ArmMmuPeiLib.inf
|
||||
ArmPkg/Library/StandaloneMmMmuLib/ArmMmuStandaloneMmLib.inf
|
||||
|
@@ -121,6 +121,44 @@ RegisterInterruptSource (
|
||||
}
|
||||
}
|
||||
|
||||
STATIC VOID *mCpuArchProtocolNotifyEventRegistration;
|
||||
|
||||
STATIC
|
||||
VOID
|
||||
EFIAPI
|
||||
CpuArchEventProtocolNotify (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
EFI_CPU_ARCH_PROTOCOL *Cpu;
|
||||
EFI_STATUS Status;
|
||||
|
||||
// Get the CPU protocol that this driver requires.
|
||||
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&Cpu);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return;
|
||||
}
|
||||
|
||||
// Unregister the default exception handler.
|
||||
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n",
|
||||
__FUNCTION__, Status));
|
||||
return;
|
||||
}
|
||||
|
||||
// Register to receive interrupts
|
||||
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ,
|
||||
Context);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "%a: Cpu->RegisterInterruptHandler() - %r\n",
|
||||
__FUNCTION__, Status));
|
||||
}
|
||||
|
||||
gBS->CloseEvent (Event);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
InstallAndRegisterInterruptService (
|
||||
IN EFI_HARDWARE_INTERRUPT_PROTOCOL *InterruptProtocol,
|
||||
@@ -130,7 +168,6 @@ InstallAndRegisterInterruptService (
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
EFI_CPU_ARCH_PROTOCOL *Cpu;
|
||||
CONST UINTN RihArraySize =
|
||||
(sizeof(HARDWARE_INTERRUPT_HANDLER) * mGicNumInterrupts);
|
||||
|
||||
@@ -152,27 +189,15 @@ InstallAndRegisterInterruptService (
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Get the CPU protocol that this driver requires.
|
||||
Status = gBS->LocateProtocol (&gEfiCpuArchProtocolGuid, NULL, (VOID **)&Cpu);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Unregister the default exception handler.
|
||||
Status = Cpu->RegisterInterruptHandler (Cpu, ARM_ARCH_EXCEPTION_IRQ, NULL);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Register to receive interrupts
|
||||
Status = Cpu->RegisterInterruptHandler (
|
||||
Cpu,
|
||||
ARM_ARCH_EXCEPTION_IRQ,
|
||||
InterruptHandler
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
//
|
||||
// Install the interrupt handler as soon as the CPU arch protocol appears.
|
||||
//
|
||||
EfiCreateProtocolNotifyEvent (
|
||||
&gEfiCpuArchProtocolGuid,
|
||||
TPL_CALLBACK,
|
||||
CpuArchEventProtocolNotify,
|
||||
InterruptHandler,
|
||||
&mCpuArchProtocolNotifyEventRegistration);
|
||||
|
||||
// Register for an ExitBootServicesEvent
|
||||
Status = gBS->CreateEvent (
|
||||
|
@@ -21,6 +21,7 @@ WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/UefiLib.h>
|
||||
|
||||
#include <Protocol/Cpu.h>
|
||||
#include <Protocol/HardwareInterrupt.h>
|
||||
|
@@ -45,11 +45,12 @@
|
||||
UefiDriverEntryPoint
|
||||
IoLib
|
||||
PcdLib
|
||||
UefiLib
|
||||
|
||||
[Protocols]
|
||||
gHardwareInterruptProtocolGuid
|
||||
gHardwareInterrupt2ProtocolGuid
|
||||
gEfiCpuArchProtocolGuid
|
||||
gHardwareInterruptProtocolGuid ## PRODUCES
|
||||
gHardwareInterrupt2ProtocolGuid ## PRODUCES
|
||||
gEfiCpuArchProtocolGuid ## CONSUMES ## NOTIFY
|
||||
|
||||
[Pcd.common]
|
||||
gArmTokenSpaceGuid.PcdGicDistributorBase
|
||||
@@ -58,4 +59,4 @@
|
||||
gArmTokenSpaceGuid.PcdArmGicV3WithV2Legacy
|
||||
|
||||
[Depex]
|
||||
gEfiCpuArchProtocolGuid
|
||||
TRUE
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2017, ARM Limited. All rights reserved.
|
||||
* Copyright (c) 2011-2018, ARM Limited. All rights reserved.
|
||||
*
|
||||
* This program and the accompanying materials
|
||||
* are licensed and made available under the terms and conditions of the BSD License
|
||||
@@ -19,6 +19,16 @@
|
||||
#include <Library/IoLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
|
||||
// In GICv3, there are 2 x 64KB frames:
|
||||
// Redistributor control frame + SGI Control & Generation frame
|
||||
#define GIC_V3_REDISTRIBUTOR_GRANULARITY (ARM_GICR_CTLR_FRAME_SIZE \
|
||||
+ ARM_GICR_SGI_PPI_FRAME_SIZE)
|
||||
|
||||
// In GICv4, there are 2 additional 64KB frames:
|
||||
// VLPI frame + Reserved page frame
|
||||
#define GIC_V4_REDISTRIBUTOR_GRANULARITY (GIC_V3_REDISTRIBUTOR_GRANULARITY \
|
||||
+ ARM_GICR_SGI_VLPI_FRAME_SIZE \
|
||||
+ ARM_GICR_SGI_RESERVED_FRAME_SIZE)
|
||||
|
||||
#define ISENABLER_ADDRESS(base,offset) ((base) + \
|
||||
ARM_GICR_CTLR_FRAME_SIZE + ARM_GICR_ISENABLER + (4 * offset))
|
||||
@@ -54,12 +64,11 @@ GicGetCpuRedistributorBase (
|
||||
IN ARM_GIC_ARCH_REVISION Revision
|
||||
)
|
||||
{
|
||||
UINTN Index;
|
||||
UINTN MpId;
|
||||
UINTN CpuAffinity;
|
||||
UINTN Affinity;
|
||||
UINTN GicRedistributorGranularity;
|
||||
UINTN GicCpuRedistributorBase;
|
||||
UINT64 TypeRegister;
|
||||
|
||||
MpId = ArmReadMpidr ();
|
||||
// Define CPU affinity as:
|
||||
@@ -68,27 +77,30 @@ GicGetCpuRedistributorBase (
|
||||
CpuAffinity = (MpId & (ARM_CORE_AFF0 | ARM_CORE_AFF1 | ARM_CORE_AFF2)) |
|
||||
((MpId & ARM_CORE_AFF3) >> 8);
|
||||
|
||||
if (Revision == ARM_GIC_ARCH_REVISION_3) {
|
||||
// 2 x 64KB frame:
|
||||
// Redistributor control frame + SGI Control & Generation frame
|
||||
GicRedistributorGranularity = ARM_GICR_CTLR_FRAME_SIZE
|
||||
+ ARM_GICR_SGI_PPI_FRAME_SIZE;
|
||||
} else {
|
||||
if (Revision < ARM_GIC_ARCH_REVISION_3) {
|
||||
ASSERT_EFI_ERROR (EFI_UNSUPPORTED);
|
||||
return 0;
|
||||
}
|
||||
|
||||
GicCpuRedistributorBase = GicRedistributorBase;
|
||||
|
||||
for (Index = 0; Index < PcdGet32 (PcdCoreCount); Index++) {
|
||||
Affinity = MmioRead64 (GicCpuRedistributorBase + ARM_GICR_TYPER) >> 32;
|
||||
do {
|
||||
TypeRegister = MmioRead64 (GicCpuRedistributorBase + ARM_GICR_TYPER);
|
||||
Affinity = ARM_GICR_TYPER_GET_AFFINITY (TypeRegister);
|
||||
if (Affinity == CpuAffinity) {
|
||||
return GicCpuRedistributorBase;
|
||||
}
|
||||
|
||||
// Move to the next GIC Redistributor frame
|
||||
GicCpuRedistributorBase += GicRedistributorGranularity;
|
||||
}
|
||||
// Move to the next GIC Redistributor frame.
|
||||
// The GIC specification does not forbid a mixture of redistributors
|
||||
// with or without support for virtual LPIs, so we test Virtual LPIs
|
||||
// Support (VLPIS) bit for each frame to decide the granularity.
|
||||
// Note: The assumption here is that the redistributors are adjacent
|
||||
// for all CPUs. However this may not be the case for NUMA systems.
|
||||
GicCpuRedistributorBase += (((ARM_GICR_TYPER_VLPIS & TypeRegister) != 0)
|
||||
? GIC_V4_REDISTRIBUTOR_GRANULARITY
|
||||
: GIC_V3_REDISTRIBUTOR_GRANULARITY);
|
||||
} while ((TypeRegister & ARM_GICR_TYPER_LAST) == 0);
|
||||
|
||||
// The Redistributor has not been found for the current CPU
|
||||
ASSERT_EFI_ERROR (EFI_NOT_FOUND);
|
||||
|
@@ -1,5 +1,5 @@
|
||||
#/* @file
|
||||
# Copyright (c) 2011-2015, ARM Limited. All rights reserved.
|
||||
# Copyright (c) 2011-2018, ARM Limited. All rights reserved.
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
@@ -44,8 +44,5 @@
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
MdePkg/MdePkg.dec
|
||||
|
||||
[Pcd]
|
||||
gArmPlatformTokenSpaceGuid.PcdCoreCount
|
||||
|
||||
[FeaturePcd]
|
||||
gArmTokenSpaceGuid.PcdArmGicV3WithV2Legacy
|
||||
|
@@ -66,7 +66,7 @@ ASM_FUNC(ArmGicV3EndOfInterrupt)
|
||||
// VOID
|
||||
// );
|
||||
ASM_FUNC(ArmGicV3AcknowledgeInterrupt)
|
||||
mrc p15, 0, r0, c12, c8, 0 //ICC_IAR1
|
||||
mrc p15, 0, r0, c12, c12, 0 //ICC_IAR1
|
||||
bx lr
|
||||
|
||||
//VOID
|
||||
|
@@ -66,7 +66,7 @@
|
||||
// VOID
|
||||
// );
|
||||
RVCT_ASM_EXPORT ArmGicV3AcknowledgeInterrupt
|
||||
mrc p15, 0, r0, c12, c8, 0 //ICC_IAR1
|
||||
mrc p15, 0, r0, c12, c12, 0 //ICC_IAR1
|
||||
bx lr
|
||||
|
||||
//VOID
|
||||
|
@@ -469,7 +469,7 @@ GicV3DxeInitialize (
|
||||
for (Index = 0; Index < (mGicNumInterrupts - 32); Index++) {
|
||||
MmioWrite32 (
|
||||
mGicDistributorBase + ARM_GICD_IROUTER + (Index * 8),
|
||||
CpuTarget | ARM_GICD_IROUTER_IRM
|
||||
CpuTarget
|
||||
);
|
||||
}
|
||||
}
|
||||
|
46
ArmPkg/Drivers/ArmScmiDxe/ArmScmiBaseProtocolPrivate.h
Normal file
46
ArmPkg/Drivers/ArmScmiDxe/ArmScmiBaseProtocolPrivate.h
Normal file
@@ -0,0 +1,46 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#ifndef ARM_SCMI_BASE_PROTOCOL_PRIVATE_H_
|
||||
#define ARM_SCMI_BASE_PROTOCOL_PRIVATE_H_
|
||||
|
||||
// Return values of BASE_DISCOVER_LIST_PROTOCOLS command.
|
||||
typedef struct {
|
||||
UINT32 NumProtocols;
|
||||
|
||||
// Array of four protocols in each element
|
||||
// Total elements = 1 + (NumProtocols-1)/4
|
||||
|
||||
// NOTE: Since EDK2 does not allow flexible array member [] we declare
|
||||
// here array of 1 element length. However below is used as a variable
|
||||
// length array.
|
||||
UINT8 Protocols[1];
|
||||
} BASE_DISCOVER_LIST;
|
||||
|
||||
/** Initialize Base protocol and install protocol on a given handle.
|
||||
|
||||
@param[in] Handle Handle to install Base protocol.
|
||||
|
||||
@retval EFI_SUCCESS Base protocol interface installed
|
||||
successfully.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiBaseProtocolInit (
|
||||
IN OUT EFI_HANDLE* Handle
|
||||
);
|
||||
|
||||
#endif /* ARM_SCMI_BASE_PROTOCOL_PRIVATE_H_ */
|
91
ArmPkg/Drivers/ArmScmiDxe/ArmScmiClockProtocolPrivate.h
Normal file
91
ArmPkg/Drivers/ArmScmiDxe/ArmScmiClockProtocolPrivate.h
Normal file
@@ -0,0 +1,91 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#ifndef ARM_SCMI_CLOCK_PROTOCOL_PRIVATE_H_
|
||||
#define ARM_SCMI_CLOCK_PROTOCOL_PRIVATE_H_
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
// Clock rate in two 32bit words.
|
||||
typedef struct {
|
||||
UINT32 Low;
|
||||
UINT32 High;
|
||||
} CLOCK_RATE_DWORD;
|
||||
|
||||
// Format of the returned rate array. Linear or Non-linear,.RatesFlag Bit[12]
|
||||
#define RATE_FORMAT_SHIFT 12
|
||||
#define RATE_FORMAT_MASK 0x0001
|
||||
#define RATE_FORMAT(RatesFlags) ((RatesFlags >> RATE_FORMAT_SHIFT) \
|
||||
& RATE_FORMAT_MASK)
|
||||
|
||||
// Number of remaining rates after a call to the SCP, RatesFlag Bits[31:16]
|
||||
#define NUM_REMAIN_RATES_SHIFT 16
|
||||
#define NUM_REMAIN_RATES(RatesFlags) ((RatesFlags >> NUM_REMAIN_RATES_SHIFT))
|
||||
|
||||
// Number of rates that are returned by a call.to the SCP, RatesFlag Bits[11:0]
|
||||
#define NUM_RATES_MASK 0x0FFF
|
||||
#define NUM_RATES(RatesFlags) (RatesFlags & NUM_RATES_MASK)
|
||||
|
||||
// Return values for the CLOCK_DESCRIBER_RATE command.
|
||||
typedef struct {
|
||||
UINT32 NumRatesFlags;
|
||||
|
||||
// NOTE: Since EDK2 does not allow flexible array member [] we declare
|
||||
// here array of 1 element length. However below is used as a variable
|
||||
// length array.
|
||||
CLOCK_RATE_DWORD Rates[1];
|
||||
} CLOCK_DESCRIBE_RATES;
|
||||
|
||||
#define CLOCK_SET_DEFAULT_FLAGS 0
|
||||
|
||||
// Message parameters for CLOCK_RATE_SET command.
|
||||
typedef struct {
|
||||
UINT32 Flags;
|
||||
UINT32 ClockId;
|
||||
CLOCK_RATE_DWORD Rate;
|
||||
} CLOCK_RATE_SET_ATTRIBUTES;
|
||||
|
||||
|
||||
// Message parameters for CLOCK_CONFIG_SET command.
|
||||
typedef struct {
|
||||
UINT32 ClockId;
|
||||
UINT32 Attributes;
|
||||
} CLOCK_CONFIG_SET_ATTRIBUTES;
|
||||
|
||||
// if ClockAttr Bit[0] is set then clock device is enabled.
|
||||
#define CLOCK_ENABLE_MASK 0x1
|
||||
#define CLOCK_ENABLED(ClockAttr) ((ClockAttr & CLOCK_ENABLE_MASK) == 1)
|
||||
|
||||
typedef struct {
|
||||
UINT32 Attributes;
|
||||
UINT8 ClockName[SCMI_MAX_STR_LEN];
|
||||
} CLOCK_ATTRIBUTES;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
/** Initialize clock management protocol and install protocol on a given handle.
|
||||
|
||||
@param[in] Handle Handle to install clock management protocol.
|
||||
|
||||
@retval EFI_SUCCESS Clock protocol interface installed successfully.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiClockProtocolInit (
|
||||
IN EFI_HANDLE *Handle
|
||||
);
|
||||
|
||||
#endif /* ARM_SCMI_CLOCK_PROTOCOL_PRIVATE_H_ */
|
54
ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
Normal file
54
ArmPkg/Drivers/ArmScmiDxe/ArmScmiDxe.inf
Normal file
@@ -0,0 +1,54 @@
|
||||
#/** @file
|
||||
#
|
||||
# Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
# System Control and Management Interface V1.0
|
||||
# http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
# DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
#**/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010019
|
||||
BASE_NAME = ArmScmiDxe
|
||||
FILE_GUID = 9585984C-F027-45E9-AFDF-ADAA6DFAAAC7
|
||||
MODULE_TYPE = DXE_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
ENTRY_POINT = ArmScmiDxeEntryPoint
|
||||
|
||||
[Sources.common]
|
||||
Scmi.c
|
||||
ScmiBaseProtocol.c
|
||||
ScmiClockProtocol.c
|
||||
ScmiDxe.c
|
||||
ScmiPerformanceProtocol.c
|
||||
|
||||
[Packages]
|
||||
ArmPkg/ArmPkg.dec
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
MdePkg/MdePkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
ArmLib
|
||||
ArmMtlLib
|
||||
DebugLib
|
||||
IoLib
|
||||
UefiBootServicesTableLib
|
||||
UefiDriverEntryPoint
|
||||
|
||||
[Protocols]
|
||||
gArmScmiBaseProtocolGuid
|
||||
gArmScmiClockProtocolGuid
|
||||
gArmScmiClock2ProtocolGuid
|
||||
gArmScmiPerformanceProtocolGuid
|
||||
|
||||
[Depex]
|
||||
TRUE
|
||||
|
@@ -0,0 +1,55 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#ifndef ARM_SCMI_PERFORMANCE_PROTOCOL_PRIVATE_H_
|
||||
#define ARM_SCMI_PERFORMANCE_PROTOCOL_PRIVATE_H_
|
||||
|
||||
#include <Protocol/ArmScmiPerformanceProtocol.h>
|
||||
|
||||
// Number of performance levels returned by a call to the SCP, Lvls Bits[11:0]
|
||||
#define NUM_PERF_LEVELS_MASK 0x0FFF
|
||||
#define NUM_PERF_LEVELS(Lvls) (Lvls & NUM_PERF_LEVELS_MASK)
|
||||
|
||||
// Number of performance levels remaining after a call to the SCP, Lvls Bits[31:16]
|
||||
#define NUM_REMAIN_PERF_LEVELS_SHIFT 16
|
||||
#define NUM_REMAIN_PERF_LEVELS(Lvls) (Lvls >> NUM_REMAIN_PERF_LEVELS_SHIFT)
|
||||
|
||||
/** Return values for SCMI_MESSAGE_ID_PERFORMANCE_DESCRIBE_LEVELS command.
|
||||
SCMI Spec <20> 4.5.2.5
|
||||
**/
|
||||
typedef struct {
|
||||
UINT32 NumLevels;
|
||||
|
||||
// NOTE: Since EDK2 does not allow flexible array member [] we declare
|
||||
// here array of 1 element length. However below is used as a variable
|
||||
// length array.
|
||||
SCMI_PERFORMANCE_LEVEL PerfLevel[1]; // Offset to array of performance levels
|
||||
} PERF_DESCRIBE_LEVELS;
|
||||
|
||||
/** Initialize performance management protocol and install on a given Handle.
|
||||
|
||||
@param[in] Handle Handle to install performance management
|
||||
protocol.
|
||||
|
||||
@retval EFI_SUCCESS Performance protocol installed successfully.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiPerformanceProtocolInit (
|
||||
IN EFI_HANDLE* Handle
|
||||
);
|
||||
|
||||
#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_PRIVATE_H_ */
|
257
ArmPkg/Drivers/ArmScmiDxe/Scmi.c
Normal file
257
ArmPkg/Drivers/ArmScmiDxe/Scmi.c
Normal file
@@ -0,0 +1,257 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#include <Library/ArmMtlLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
|
||||
#include "ScmiPrivate.h"
|
||||
|
||||
// Arbitrary timeout value 20ms.
|
||||
#define RESPONSE_TIMEOUT 20000
|
||||
|
||||
/** Return a pointer to the message payload.
|
||||
|
||||
@param[out] Payload Holds pointer to the message payload.
|
||||
|
||||
@retval EFI_SUCCESS Payload holds a valid message payload pointer.
|
||||
@retval EFI_TIMEOUT Time out error if MTL channel is busy.
|
||||
@retval EFI_UNSUPPORTED If MTL channel is unsupported.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiCommandGetPayload (
|
||||
OUT UINT32** Payload
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
MTL_CHANNEL *Channel;
|
||||
|
||||
// Get handle to the Channel.
|
||||
Status = MtlGetChannel (MTL_CHANNEL_TYPE_LOW, &Channel);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Payload will not be populated until channel is free.
|
||||
Status = MtlWaitUntilChannelFree (Channel, RESPONSE_TIMEOUT);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Get the address of the payload.
|
||||
*Payload = MtlGetChannelPayload (Channel);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Execute a SCMI command and receive a response.
|
||||
|
||||
This function uses a MTL channel to transfer message to SCP
|
||||
and waits for a response.
|
||||
|
||||
@param[in] Command Pointer to the SCMI command (Protocol ID
|
||||
and Message ID)
|
||||
|
||||
@param[in,out] PayloadLength SCMI command message length.
|
||||
|
||||
@param[out] OPTIONAL ReturnValues Pointer to SCMI response.
|
||||
|
||||
@retval OUT EFI_SUCCESS Command sent and message received successfully.
|
||||
@retval OUT EFI_UNSUPPORTED Channel not supported.
|
||||
@retval OUT EFI_TIMEOUT Timeout on the channel.
|
||||
@retval OUT EFI_DEVICE_ERROR Channel not ready.
|
||||
@retval OUT EFI_DEVICE_ERROR Message Header corrupted.
|
||||
@retval OUT EFI_DEVICE_ERROR SCMI error.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiCommandExecute (
|
||||
IN SCMI_COMMAND *Command,
|
||||
IN OUT UINT32 *PayloadLength,
|
||||
OUT UINT32 **ReturnValues OPTIONAL
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SCMI_MESSAGE_RESPONSE *Response;
|
||||
UINT32 MessageHeader;
|
||||
UINT32 ResponseHeader;
|
||||
MTL_CHANNEL *Channel;
|
||||
|
||||
ASSERT (PayloadLength != NULL);
|
||||
|
||||
Status = MtlGetChannel (MTL_CHANNEL_TYPE_LOW, &Channel);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Fill in message header.
|
||||
MessageHeader = SCMI_MESSAGE_HEADER (
|
||||
Command->MessageId,
|
||||
SCMI_MESSAGE_TYPE_COMMAND,
|
||||
Command->ProtocolId
|
||||
);
|
||||
|
||||
// Send payload using MTL channel.
|
||||
Status = MtlSendMessage (
|
||||
Channel,
|
||||
MessageHeader,
|
||||
*PayloadLength
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Wait for the response on the channel.
|
||||
Status = MtlReceiveMessage (Channel, &ResponseHeader, PayloadLength);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
// SCMI must return MessageHeader unmodified.
|
||||
if (MessageHeader != ResponseHeader) {
|
||||
ASSERT (FALSE);
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
Response = (SCMI_MESSAGE_RESPONSE*)MtlGetChannelPayload (Channel);
|
||||
|
||||
if (Response->Status != SCMI_SUCCESS) {
|
||||
DEBUG ((DEBUG_ERROR, "SCMI error: ProtocolId = 0x%x, MessageId = 0x%x, error = %d\n",
|
||||
Command->ProtocolId,
|
||||
Command->MessageId,
|
||||
Response->Status
|
||||
));
|
||||
|
||||
ASSERT (FALSE);
|
||||
return EFI_DEVICE_ERROR;
|
||||
}
|
||||
|
||||
if (ReturnValues != NULL) {
|
||||
*ReturnValues = Response->ReturnValues;
|
||||
}
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Internal common function useful for common protocol discovery messages.
|
||||
|
||||
@param[in] ProtocolId Protocol Id of the the protocol.
|
||||
@param[in] MesaageId Message Id of the message.
|
||||
|
||||
@param[out] ReturnValues SCMI response return values.
|
||||
|
||||
@retval EFI_SUCCESS Success with valid return values.
|
||||
@retval EFI_DEVICE_ERROR SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
ScmiProtocolDiscoveryCommon (
|
||||
IN SCMI_PROTOCOL_ID ProtocolId,
|
||||
IN SCMI_MESSAGE_ID MessageId,
|
||||
OUT UINT32 **ReturnValues
|
||||
)
|
||||
{
|
||||
SCMI_COMMAND Command;
|
||||
UINT32 PayloadLength = 0;
|
||||
|
||||
Command.ProtocolId = ProtocolId;
|
||||
Command.MessageId = MessageId;
|
||||
|
||||
return ScmiCommandExecute (
|
||||
&Command,
|
||||
&PayloadLength,
|
||||
ReturnValues
|
||||
);
|
||||
}
|
||||
|
||||
/** Return protocol version from SCP for a given protocol ID.
|
||||
|
||||
@param[in] Protocol ID Protocol ID.
|
||||
@param[out] Version Pointer to version of the protocol.
|
||||
|
||||
@retval EFI_SUCCESS Version holds a valid version received
|
||||
from the SCP.
|
||||
@retval EFI_DEVICE_ERROR SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiGetProtocolVersion (
|
||||
IN SCMI_PROTOCOL_ID ProtocolId,
|
||||
OUT UINT32 *Version
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 *ProtocolVersion;
|
||||
|
||||
Status = ScmiProtocolDiscoveryCommon (
|
||||
ProtocolId,
|
||||
SCMI_MESSAGE_ID_PROTOCOL_VERSION,
|
||||
(UINT32**)&ProtocolVersion
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
*Version = *ProtocolVersion;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Return protocol attributes from SCP for a given protocol ID.
|
||||
|
||||
@param[in] Protocol ID Protocol ID.
|
||||
@param[out] ReturnValues Pointer to attributes of the protocol.
|
||||
|
||||
@retval EFI_SUCCESS ReturnValues points to protocol attributes.
|
||||
@retval EFI_DEVICE_ERROR SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiGetProtocolAttributes (
|
||||
IN SCMI_PROTOCOL_ID ProtocolId,
|
||||
OUT UINT32 **ReturnValues
|
||||
)
|
||||
{
|
||||
return ScmiProtocolDiscoveryCommon (
|
||||
ProtocolId,
|
||||
SCMI_MESSAGE_ID_PROTOCOL_ATTRIBUTES,
|
||||
ReturnValues
|
||||
);
|
||||
}
|
||||
|
||||
/** Return protocol message attributes from SCP for a given protocol ID.
|
||||
|
||||
@param[in] Protocol ID Protocol ID.
|
||||
@param[out] Attributes Pointer to attributes of the protocol.
|
||||
|
||||
@retval EFI_SUCCESS ReturnValues points to protocol message attributes.
|
||||
@retval EFI_DEVICE_ERROR SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiGetProtocolMessageAttributes (
|
||||
IN SCMI_PROTOCOL_ID ProtocolId,
|
||||
OUT UINT32 **ReturnValues
|
||||
)
|
||||
{
|
||||
return ScmiProtocolDiscoveryCommon (
|
||||
ProtocolId,
|
||||
SCMI_MESSAGE_ID_PROTOCOL_MESSAGE_ATTRIBUTES,
|
||||
ReturnValues
|
||||
);
|
||||
}
|
318
ArmPkg/Drivers/ArmScmiDxe/ScmiBaseProtocol.c
Normal file
318
ArmPkg/Drivers/ArmScmiDxe/ScmiBaseProtocol.c
Normal file
@@ -0,0 +1,318 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Protocol/ArmScmiBaseProtocol.h>
|
||||
|
||||
#include "ArmScmiBaseProtocolPrivate.h"
|
||||
#include "ScmiPrivate.h"
|
||||
|
||||
/** Return version of the Base protocol supported by SCP firmware.
|
||||
|
||||
@param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.
|
||||
|
||||
@param[out] Version Version of the supported SCMI Base protocol.
|
||||
|
||||
@retval EFI_SUCCESS The version of the protocol is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
BaseGetVersion (
|
||||
IN SCMI_BASE_PROTOCOL *This,
|
||||
OUT UINT32 *Version
|
||||
)
|
||||
{
|
||||
return ScmiGetProtocolVersion (SCMI_PROTOCOL_ID_BASE, Version);
|
||||
}
|
||||
|
||||
/** Return total number of SCMI protocols supported by the SCP firmware.
|
||||
|
||||
@param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.
|
||||
|
||||
@param[out] TotalProtocols Total number of SCMI protocols supported.
|
||||
|
||||
@retval EFI_SUCCESS Total number of protocols supported are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns a SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
BaseGetTotalProtocols (
|
||||
IN SCMI_BASE_PROTOCOL *This,
|
||||
OUT UINT32 *TotalProtocols
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 *ReturnValues;
|
||||
|
||||
Status = ScmiGetProtocolAttributes (SCMI_PROTOCOL_ID_BASE, &ReturnValues);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
*TotalProtocols = SCMI_TOTAL_PROTOCOLS (ReturnValues[0]);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Common function which returns vendor details.
|
||||
|
||||
@param[in] MessageId SCMI_MESSAGE_ID_BASE_DISCOVER_VENDOR
|
||||
OR
|
||||
SCMI_MESSAGE_ID_BASE_DISCOVER_SUB_VENDOR
|
||||
|
||||
@param[out] VendorIdentifier ASCII name of the vendor/subvendor.
|
||||
|
||||
@retval EFI_SUCCESS VendorIdentifier is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
BaseDiscoverVendorDetails (
|
||||
IN SCMI_MESSAGE_ID_BASE MessageId,
|
||||
OUT UINT8 VendorIdentifier[SCMI_MAX_STR_LEN]
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 *ReturnValues;
|
||||
SCMI_COMMAND Cmd;
|
||||
UINT32 PayloadLength;
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_BASE;
|
||||
Cmd.MessageId = MessageId;
|
||||
|
||||
PayloadLength = 0;
|
||||
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
&ReturnValues
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
AsciiStrCpyS (
|
||||
(CHAR8*)VendorIdentifier,
|
||||
SCMI_MAX_STR_LEN,
|
||||
(CONST CHAR8*)ReturnValues
|
||||
);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Return vendor name.
|
||||
|
||||
@param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.
|
||||
|
||||
@param[out] VendorIdentifier Null terminated ASCII string of up to
|
||||
16 bytes with a vendor name.
|
||||
|
||||
@retval EFI_SUCCESS VendorIdentifier is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns a SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
BaseDiscoverVendor (
|
||||
IN SCMI_BASE_PROTOCOL *This,
|
||||
OUT UINT8 VendorIdentifier[SCMI_MAX_STR_LEN]
|
||||
)
|
||||
{
|
||||
return BaseDiscoverVendorDetails (
|
||||
SCMI_MESSAGE_ID_BASE_DISCOVER_VENDOR,
|
||||
VendorIdentifier
|
||||
);
|
||||
}
|
||||
|
||||
/** Return sub vendor name.
|
||||
|
||||
@param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.
|
||||
|
||||
@param[out] VendorIdentifier Null terminated ASCII string of up to
|
||||
16 bytes with a sub vendor name.
|
||||
|
||||
@retval EFI_SUCCESS VendorIdentifier is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns a SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
EFI_STATUS
|
||||
BaseDiscoverSubVendor (
|
||||
IN SCMI_BASE_PROTOCOL *This,
|
||||
OUT UINT8 VendorIdentifier[SCMI_MAX_STR_LEN]
|
||||
)
|
||||
{
|
||||
return BaseDiscoverVendorDetails (
|
||||
SCMI_MESSAGE_ID_BASE_DISCOVER_SUB_VENDOR,
|
||||
VendorIdentifier
|
||||
);
|
||||
}
|
||||
|
||||
/** Return implementation version.
|
||||
|
||||
@param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.
|
||||
|
||||
@param[out] ImplementationVersion Vendor specific implementation version.
|
||||
|
||||
@retval EFI_SUCCESS Implementation version is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns a SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
BaseDiscoverImplVersion (
|
||||
IN SCMI_BASE_PROTOCOL *This,
|
||||
OUT UINT32 *ImplementationVersion
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 *ReturnValues;
|
||||
SCMI_COMMAND Cmd;
|
||||
UINT32 PayloadLength;
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_BASE;
|
||||
Cmd.MessageId = SCMI_MESSAGE_ID_BASE_DISCOVER_IMPLEMENTATION_VERSION;
|
||||
|
||||
PayloadLength = 0;
|
||||
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
&ReturnValues
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
*ImplementationVersion = ReturnValues[0];
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Return list of protocols.
|
||||
|
||||
@param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.
|
||||
|
||||
@param[out] ProtocolListSize Size of the ProtocolList.
|
||||
|
||||
@param[out] ProtocolList Protocol list.
|
||||
|
||||
@retval EFI_SUCCESS List of protocols is returned.
|
||||
@retval EFI_BUFFER_TOO_SMALL ProtocolListSize is too small for the result.
|
||||
It has been updated to the size needed.
|
||||
@retval EFI_DEVICE_ERROR SCP returns a SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
BaseDiscoverListProtocols (
|
||||
IN SCMI_BASE_PROTOCOL *This,
|
||||
IN OUT UINT32 *ProtocolListSize,
|
||||
OUT UINT8 *ProtocolList
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 TotalProtocols;
|
||||
UINT32 *MessageParams;
|
||||
BASE_DISCOVER_LIST *DiscoverList;
|
||||
UINT32 Skip;
|
||||
UINT32 Index;
|
||||
SCMI_COMMAND Cmd;
|
||||
UINT32 PayloadLength;
|
||||
UINT32 RequiredSize;
|
||||
|
||||
Status = BaseGetTotalProtocols (This, &TotalProtocols);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = ScmiCommandGetPayload (&MessageParams);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
RequiredSize = sizeof (UINT8) * TotalProtocols;
|
||||
if (*ProtocolListSize < RequiredSize) {
|
||||
*ProtocolListSize = RequiredSize;
|
||||
return EFI_BUFFER_TOO_SMALL;
|
||||
}
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_BASE;
|
||||
Cmd.MessageId = SCMI_MESSAGE_ID_BASE_DISCOVER_LIST_PROTOCOLS;
|
||||
|
||||
Skip = 0;
|
||||
|
||||
while (Skip < TotalProtocols) {
|
||||
|
||||
*MessageParams = Skip;
|
||||
|
||||
// Note PayloadLength is a IN/OUT parameter.
|
||||
PayloadLength = sizeof (Skip);
|
||||
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
(UINT32**)&DiscoverList
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
for (Index = 0; Index < DiscoverList->NumProtocols; Index++) {
|
||||
ProtocolList[Skip++] = DiscoverList->Protocols[Index];
|
||||
}
|
||||
}
|
||||
|
||||
*ProtocolListSize = RequiredSize;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
// Instance of the SCMI Base protocol.
|
||||
STATIC CONST SCMI_BASE_PROTOCOL BaseProtocol = {
|
||||
BaseGetVersion,
|
||||
BaseGetTotalProtocols,
|
||||
BaseDiscoverVendor,
|
||||
BaseDiscoverSubVendor,
|
||||
BaseDiscoverImplVersion,
|
||||
BaseDiscoverListProtocols
|
||||
};
|
||||
|
||||
/** Initialize Base protocol and install protocol on a given handle.
|
||||
|
||||
@param[in] Handle Handle to install Base protocol.
|
||||
|
||||
@retval EFI_SUCCESS Base protocol interface installed
|
||||
successfully.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiBaseProtocolInit (
|
||||
IN OUT EFI_HANDLE* Handle
|
||||
)
|
||||
{
|
||||
return gBS->InstallMultipleProtocolInterfaces (
|
||||
Handle,
|
||||
&gArmScmiBaseProtocolGuid,
|
||||
&BaseProtocol,
|
||||
NULL
|
||||
);
|
||||
}
|
480
ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
Normal file
480
ArmPkg/Drivers/ArmScmiDxe/ScmiClockProtocol.c
Normal file
@@ -0,0 +1,480 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Protocol/ArmScmiClockProtocol.h>
|
||||
#include <Protocol/ArmScmiClock2Protocol.h>
|
||||
|
||||
#include "ArmScmiClockProtocolPrivate.h"
|
||||
#include "ScmiPrivate.h"
|
||||
|
||||
/** Convert to 64 bit value from two 32 bit words.
|
||||
|
||||
@param[in] Low Lower 32 bits.
|
||||
@param[in] High Higher 32 bits.
|
||||
|
||||
@retval UINT64 64 bit value.
|
||||
**/
|
||||
STATIC
|
||||
UINT64
|
||||
ConvertTo64Bit (
|
||||
IN UINT32 Low,
|
||||
IN UINT32 High
|
||||
)
|
||||
{
|
||||
return (Low | ((UINT64)High << 32));
|
||||
}
|
||||
|
||||
/** Return version of the clock management protocol supported by SCP firmware.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||
|
||||
@param[out] Version Version of the supported SCMI Clock management protocol.
|
||||
|
||||
@retval EFI_SUCCESS The version is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
ClockGetVersion (
|
||||
IN SCMI_CLOCK_PROTOCOL *This,
|
||||
OUT UINT32 *Version
|
||||
)
|
||||
{
|
||||
return ScmiGetProtocolVersion (SCMI_PROTOCOL_ID_CLOCK, Version);
|
||||
}
|
||||
|
||||
/** Return total number of clock devices supported by the clock management
|
||||
protocol.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||
|
||||
@param[out] TotalClocks Total number of clocks supported.
|
||||
|
||||
@retval EFI_SUCCESS Total number of clocks supported is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
ClockGetTotalClocks (
|
||||
IN SCMI_CLOCK_PROTOCOL *This,
|
||||
OUT UINT32 *TotalClocks
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 *ReturnValues;
|
||||
|
||||
Status = ScmiGetProtocolAttributes (SCMI_PROTOCOL_ID_CLOCK, &ReturnValues);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
*TotalClocks = SCMI_CLOCK_PROTOCOL_TOTAL_CLKS (ReturnValues[0]);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Return attributes of a clock device.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
|
||||
@param[out] Enabled If TRUE, the clock device is enabled.
|
||||
@param[out] ClockAsciiName A NULL terminated ASCII string with the clock
|
||||
name, of up to 16 bytes.
|
||||
|
||||
@retval EFI_SUCCESS Clock device attributes are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
ClockGetClockAttributes (
|
||||
IN SCMI_CLOCK_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
OUT BOOLEAN *Enabled,
|
||||
OUT CHAR8 *ClockAsciiName
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
UINT32 *MessageParams;
|
||||
CLOCK_ATTRIBUTES *ClockAttributes;
|
||||
SCMI_COMMAND Cmd;
|
||||
UINT32 PayloadLength;
|
||||
|
||||
Status = ScmiCommandGetPayload (&MessageParams);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
*MessageParams = ClockId;
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_CLOCK;
|
||||
Cmd.MessageId = SCMI_MESSAGE_ID_CLOCK_ATTRIBUTES;
|
||||
|
||||
PayloadLength = sizeof (ClockId);
|
||||
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
(UINT32**)&ClockAttributes
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
// TRUE if bit 0 of ClockAttributes->Attributes is set.
|
||||
*Enabled = CLOCK_ENABLED (ClockAttributes->Attributes);
|
||||
|
||||
AsciiStrCpyS (
|
||||
ClockAsciiName,
|
||||
SCMI_MAX_STR_LEN,
|
||||
(CONST CHAR8*)ClockAttributes->ClockName
|
||||
);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Return list of rates supported by a given clock device.
|
||||
|
||||
@param[in] This A pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
|
||||
@param[out] Format SCMI_CLOCK_RATE_FORMAT_DISCRETE: Clock device
|
||||
supports range of clock rates which are non-linear.
|
||||
|
||||
SCMI_CLOCK_RATE_FORMAT_LINEAR: Clock device supports
|
||||
range of linear clock rates from Min to Max in steps.
|
||||
|
||||
@param[out] TotalRates Total number of rates.
|
||||
|
||||
@param[in,out] RateArraySize Size of the RateArray.
|
||||
|
||||
@param[out] RateArray List of clock rates.
|
||||
|
||||
@retval EFI_SUCCESS List of clock rates is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval EFI_BUFFER_TOO_SMALL RateArraySize is too small for the result.
|
||||
It has been updated to the size needed.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
ClockDescribeRates (
|
||||
IN SCMI_CLOCK_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
OUT SCMI_CLOCK_RATE_FORMAT *Format,
|
||||
OUT UINT32 *TotalRates,
|
||||
IN OUT UINT32 *RateArraySize,
|
||||
OUT SCMI_CLOCK_RATE *RateArray
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
UINT32 PayloadLength;
|
||||
SCMI_COMMAND Cmd;
|
||||
UINT32 *MessageParams;
|
||||
CLOCK_DESCRIBE_RATES *DescribeRates;
|
||||
CLOCK_RATE_DWORD *Rate;
|
||||
|
||||
UINT32 RequiredArraySize = 0;
|
||||
UINT32 RateIndex = 0;
|
||||
UINT32 RateNo;
|
||||
UINT32 RateOffset;
|
||||
|
||||
*TotalRates = 0;
|
||||
|
||||
Status = ScmiCommandGetPayload (&MessageParams);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_CLOCK;
|
||||
Cmd.MessageId = SCMI_MESSAGE_ID_CLOCK_DESCRIBE_RATES;
|
||||
|
||||
*MessageParams++ = ClockId;
|
||||
|
||||
do {
|
||||
|
||||
*MessageParams = RateIndex;
|
||||
|
||||
// Set Payload length, note PayloadLength is a IN/OUT parameter.
|
||||
PayloadLength = sizeof (ClockId) + sizeof (RateIndex);
|
||||
|
||||
// Execute and wait for response on a SCMI channel.
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
(UINT32**)&DescribeRates
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (*TotalRates == 0) {
|
||||
// In the first iteration we will get number of returned rates and number
|
||||
// of remaining rates. With this information calculate required size
|
||||
// for rate array. If provided RateArraySize is less, return an
|
||||
// error.
|
||||
|
||||
*Format = RATE_FORMAT (DescribeRates->NumRatesFlags);
|
||||
|
||||
*TotalRates = NUM_RATES (DescribeRates->NumRatesFlags)
|
||||
+ NUM_REMAIN_RATES (DescribeRates->NumRatesFlags);
|
||||
|
||||
if (*Format == SCMI_CLOCK_RATE_FORMAT_DISCRETE) {
|
||||
RequiredArraySize = (*TotalRates) * sizeof (UINT64);
|
||||
} else {
|
||||
// We need to return triplet of 64 bit value for each rate
|
||||
RequiredArraySize = (*TotalRates) * 3 * sizeof (UINT64);
|
||||
}
|
||||
|
||||
if (RequiredArraySize > (*RateArraySize)) {
|
||||
*RateArraySize = RequiredArraySize;
|
||||
return EFI_BUFFER_TOO_SMALL;
|
||||
}
|
||||
}
|
||||
|
||||
RateOffset = 0;
|
||||
|
||||
if (*Format == SCMI_CLOCK_RATE_FORMAT_DISCRETE) {
|
||||
for (RateNo = 0; RateNo < NUM_RATES (DescribeRates->NumRatesFlags); RateNo++) {
|
||||
Rate = &DescribeRates->Rates[RateOffset++];
|
||||
// Non-linear discrete rates.
|
||||
RateArray[RateIndex++].Rate = ConvertTo64Bit (Rate->Low, Rate->High);
|
||||
}
|
||||
} else {
|
||||
for (RateNo = 0; RateNo < NUM_RATES (DescribeRates->NumRatesFlags); RateNo++) {
|
||||
// Linear clock rates from minimum to maximum in steps
|
||||
// Minimum clock rate.
|
||||
Rate = &DescribeRates->Rates[RateOffset++];
|
||||
RateArray[RateIndex].Min = ConvertTo64Bit (Rate->Low, Rate->High);
|
||||
|
||||
Rate = &DescribeRates->Rates[RateOffset++];
|
||||
// Maximum clock rate.
|
||||
RateArray[RateIndex].Max = ConvertTo64Bit (Rate->Low, Rate->High);
|
||||
|
||||
Rate = &DescribeRates->Rates[RateOffset++];
|
||||
// Step.
|
||||
RateArray[RateIndex++].Step = ConvertTo64Bit (Rate->Low, Rate->High);
|
||||
}
|
||||
}
|
||||
} while (NUM_REMAIN_RATES (DescribeRates->NumRatesFlags) != 0);
|
||||
|
||||
// Update RateArraySize with RequiredArraySize.
|
||||
*RateArraySize = RequiredArraySize;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Get clock rate.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
|
||||
@param[out] Rate Clock rate.
|
||||
|
||||
@retval EFI_SUCCESS Clock rate is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
ClockRateGet (
|
||||
IN SCMI_CLOCK_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
OUT UINT64 *Rate
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
UINT32 *MessageParams;
|
||||
CLOCK_RATE_DWORD *ClockRate;
|
||||
SCMI_COMMAND Cmd;
|
||||
|
||||
UINT32 PayloadLength;
|
||||
|
||||
Status = ScmiCommandGetPayload (&MessageParams);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Fill arguments for clock protocol command.
|
||||
*MessageParams = ClockId;
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_CLOCK;
|
||||
Cmd.MessageId = SCMI_MESSAGE_ID_CLOCK_RATE_GET;
|
||||
|
||||
PayloadLength = sizeof (ClockId);
|
||||
|
||||
// Execute and wait for response on a SCMI channel.
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
(UINT32**)&ClockRate
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
*Rate = ConvertTo64Bit (ClockRate->Low, ClockRate->High);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Set clock rate.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
@param[in] Rate Clock rate.
|
||||
|
||||
@retval EFI_SUCCESS Clock rate set success.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
ClockRateSet (
|
||||
IN SCMI_CLOCK_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
IN UINT64 Rate
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
CLOCK_RATE_SET_ATTRIBUTES *ClockRateSetAttributes;
|
||||
SCMI_COMMAND Cmd;
|
||||
UINT32 PayloadLength;
|
||||
|
||||
Status = ScmiCommandGetPayload ((UINT32**)&ClockRateSetAttributes);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Fill arguments for clock protocol command.
|
||||
ClockRateSetAttributes->ClockId = ClockId;
|
||||
ClockRateSetAttributes->Flags = CLOCK_SET_DEFAULT_FLAGS;
|
||||
ClockRateSetAttributes->Rate.Low = (UINT32)Rate;
|
||||
ClockRateSetAttributes->Rate.High = (UINT32)(Rate >> 32);
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_CLOCK;
|
||||
Cmd.MessageId = SCMI_MESSAGE_ID_CLOCK_RATE_SET;
|
||||
|
||||
PayloadLength = sizeof (CLOCK_RATE_SET_ATTRIBUTES);
|
||||
|
||||
// Execute and wait for response on a SCMI channel.
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
NULL
|
||||
);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/** Enable/Disable specified clock.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
@param[in] Enable TRUE to enable, FALSE to disable.
|
||||
|
||||
@retval EFI_SUCCESS Clock enable/disable successful.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
ClockEnable (
|
||||
IN SCMI_CLOCK2_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
IN BOOLEAN Enable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
CLOCK_CONFIG_SET_ATTRIBUTES *ClockConfigSetAttributes;
|
||||
SCMI_COMMAND Cmd;
|
||||
UINT32 PayloadLength;
|
||||
|
||||
Status = ScmiCommandGetPayload ((UINT32**)&ClockConfigSetAttributes);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Fill arguments for clock protocol command.
|
||||
ClockConfigSetAttributes->ClockId = ClockId;
|
||||
ClockConfigSetAttributes->Attributes = Enable ? BIT0 : 0;
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_CLOCK;
|
||||
Cmd.MessageId = SCMI_MESSAGE_ID_CLOCK_CONFIG_SET;
|
||||
|
||||
PayloadLength = sizeof (CLOCK_CONFIG_SET_ATTRIBUTES);
|
||||
|
||||
// Execute and wait for response on a SCMI channel.
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
NULL
|
||||
);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Instance of the SCMI clock management protocol.
|
||||
STATIC CONST SCMI_CLOCK_PROTOCOL ScmiClockProtocol = {
|
||||
ClockGetVersion,
|
||||
ClockGetTotalClocks,
|
||||
ClockGetClockAttributes,
|
||||
ClockDescribeRates,
|
||||
ClockRateGet,
|
||||
ClockRateSet
|
||||
};
|
||||
|
||||
// Instance of the SCMI clock management protocol.
|
||||
STATIC CONST SCMI_CLOCK2_PROTOCOL ScmiClock2Protocol = {
|
||||
(SCMI_CLOCK2_GET_VERSION)ClockGetVersion,
|
||||
(SCMI_CLOCK2_GET_TOTAL_CLOCKS)ClockGetTotalClocks,
|
||||
(SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES)ClockGetClockAttributes,
|
||||
(SCMI_CLOCK2_DESCRIBE_RATES)ClockDescribeRates,
|
||||
(SCMI_CLOCK2_RATE_GET)ClockRateGet,
|
||||
(SCMI_CLOCK2_RATE_SET)ClockRateSet,
|
||||
SCMI_CLOCK2_PROTOCOL_VERSION,
|
||||
ClockEnable
|
||||
};
|
||||
|
||||
/** Initialize clock management protocol and install protocol on a given handle.
|
||||
|
||||
@param[in] Handle Handle to install clock management protocol.
|
||||
|
||||
@retval EFI_SUCCESS Clock protocol interface installed successfully.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiClockProtocolInit (
|
||||
IN EFI_HANDLE* Handle
|
||||
)
|
||||
{
|
||||
return gBS->InstallMultipleProtocolInterfaces (
|
||||
Handle,
|
||||
&gArmScmiClockProtocolGuid,
|
||||
&ScmiClockProtocol,
|
||||
&gArmScmiClock2ProtocolGuid,
|
||||
&ScmiClock2Protocol,
|
||||
NULL
|
||||
);
|
||||
}
|
153
ArmPkg/Drivers/ArmScmiDxe/ScmiDxe.c
Normal file
153
ArmPkg/Drivers/ArmScmiDxe/ScmiDxe.c
Normal file
@@ -0,0 +1,153 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#include <Base.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/MemoryAllocationLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Protocol/ArmScmiBaseProtocol.h>
|
||||
#include <Protocol/ArmScmiClockProtocol.h>
|
||||
#include <Protocol/ArmScmiPerformanceProtocol.h>
|
||||
|
||||
#include "ArmScmiBaseProtocolPrivate.h"
|
||||
#include "ArmScmiClockProtocolPrivate.h"
|
||||
#include "ArmScmiPerformanceProtocolPrivate.h"
|
||||
#include "ScmiDxe.h"
|
||||
#include "ScmiPrivate.h"
|
||||
|
||||
STATIC CONST SCMI_PROTOCOL_ENTRY Protocols[] = {
|
||||
{ SCMI_PROTOCOL_ID_BASE, ScmiBaseProtocolInit },
|
||||
{ SCMI_PROTOCOL_ID_PERFORMANCE, ScmiPerformanceProtocolInit },
|
||||
{ SCMI_PROTOCOL_ID_CLOCK, ScmiClockProtocolInit }
|
||||
};
|
||||
|
||||
/** ARM SCMI driver entry point function.
|
||||
|
||||
This function installs the SCMI Base protocol and a list of other
|
||||
protocols is queried using the Base protocol. If protocol is supported,
|
||||
driver will call each protocol init function to install the protocol on
|
||||
the ImageHandle.
|
||||
|
||||
@param[in] ImageHandle Handle to this EFI Image which will be used to
|
||||
install Base, Clock and Performance protocols.
|
||||
@param[in] SystemTable A pointer to boot time system table.
|
||||
|
||||
@retval EFI_SUCCESS Driver initalized successfully.
|
||||
@retval EFI_UNSUPPORTED If SCMI base protocol version is not supported.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
ArmScmiDxeEntryPoint (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
SCMI_BASE_PROTOCOL *BaseProtocol;
|
||||
UINT32 Version;
|
||||
UINT32 Index;
|
||||
UINT32 NumProtocols;
|
||||
UINT32 ProtocolIndex;
|
||||
UINT8 *SupportedList;
|
||||
UINT32 SupportedListSize;
|
||||
|
||||
// Every SCMI implementation must implement the base protocol.
|
||||
ASSERT (Protocols[0].Id == SCMI_PROTOCOL_ID_BASE);
|
||||
|
||||
Status = ScmiBaseProtocolInit (&ImageHandle);
|
||||
if (EFI_ERROR (Status)) {
|
||||
ASSERT (FALSE);
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = gBS->LocateProtocol (
|
||||
&gArmScmiBaseProtocolGuid,
|
||||
NULL,
|
||||
(VOID**)&BaseProtocol
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
ASSERT (FALSE);
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Get SCMI Base protocol version.
|
||||
Status = BaseProtocol->GetVersion (BaseProtocol, &Version);
|
||||
if (EFI_ERROR (Status)) {
|
||||
ASSERT (FALSE);
|
||||
return Status;
|
||||
}
|
||||
|
||||
if (Version != BASE_PROTOCOL_VERSION) {
|
||||
ASSERT (FALSE);
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
// Apart from Base protocol, SCMI may implement various other protocols,
|
||||
// query total protocols implemented by the SCP firmware.
|
||||
NumProtocols = 0;
|
||||
Status = BaseProtocol->GetTotalProtocols (BaseProtocol, &NumProtocols);
|
||||
if (EFI_ERROR (Status)) {
|
||||
ASSERT (FALSE);
|
||||
return Status;
|
||||
}
|
||||
|
||||
ASSERT (NumProtocols != 0);
|
||||
|
||||
SupportedListSize = (NumProtocols * sizeof (*SupportedList));
|
||||
|
||||
Status = gBS->AllocatePool (
|
||||
EfiBootServicesData,
|
||||
SupportedListSize,
|
||||
(VOID**)&SupportedList
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
ASSERT (FALSE);
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Get the list of protocols supported by SCP firmware on the platform.
|
||||
Status = BaseProtocol->DiscoverListProtocols (
|
||||
BaseProtocol,
|
||||
&SupportedListSize,
|
||||
SupportedList
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
gBS->FreePool (SupportedList);
|
||||
ASSERT (FALSE);
|
||||
return Status;
|
||||
}
|
||||
|
||||
// Install supported protocol on ImageHandle.
|
||||
for (ProtocolIndex = 1; ProtocolIndex < ARRAY_SIZE (Protocols);
|
||||
ProtocolIndex++) {
|
||||
for (Index = 0; Index < NumProtocols; Index++) {
|
||||
if (Protocols[ProtocolIndex].Id == SupportedList[Index]) {
|
||||
Status = Protocols[ProtocolIndex].InitFn (&ImageHandle);
|
||||
if (EFI_ERROR (Status)) {
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
return Status;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
gBS->FreePool (SupportedList);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
42
ArmPkg/Drivers/ArmScmiDxe/ScmiDxe.h
Normal file
42
ArmPkg/Drivers/ArmScmiDxe/ScmiDxe.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
#ifndef SCMI_DXE_H_
|
||||
#define SCMI_DXE_H_
|
||||
|
||||
#include "ScmiPrivate.h"
|
||||
|
||||
#define MAX_VENDOR_LEN SCMI_MAX_STR_LEN
|
||||
|
||||
/** Pointer to protocol initialization function.
|
||||
|
||||
@param[in] Handle A pointer to the EFI_HANDLE on which the protocol
|
||||
interface is to be installed.
|
||||
|
||||
@retval EFI_SUCCESS Protocol interface installed successfully.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_PROTOCOL_INIT_FXN)(
|
||||
IN EFI_HANDLE *Handle
|
||||
);
|
||||
|
||||
typedef struct {
|
||||
SCMI_PROTOCOL_ID Id; // Protocol Id.
|
||||
SCMI_PROTOCOL_INIT_FXN InitFn; // Protocol init function.
|
||||
} SCMI_PROTOCOL_ENTRY;
|
||||
|
||||
#endif /* SCMI_DXE_H_ */
|
457
ArmPkg/Drivers/ArmScmiDxe/ScmiPerformanceProtocol.c
Normal file
457
ArmPkg/Drivers/ArmScmiDxe/ScmiPerformanceProtocol.c
Normal file
@@ -0,0 +1,457 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Protocol/ArmScmiPerformanceProtocol.h>
|
||||
|
||||
#include "ArmScmiPerformanceProtocolPrivate.h"
|
||||
#include "ScmiPrivate.h"
|
||||
|
||||
/** Return version of the performance management protocol supported by SCP.
|
||||
firmware.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
|
||||
@param[out] Version Version of the supported SCMI performance management
|
||||
protocol.
|
||||
|
||||
@retval EFI_SUCCESS The version is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
PerformanceGetVersion (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
OUT UINT32 *Version
|
||||
)
|
||||
{
|
||||
return ScmiGetProtocolVersion (SCMI_PROTOCOL_ID_PERFORMANCE, Version);
|
||||
}
|
||||
|
||||
/** Return protocol attributes of the performance management protocol.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
|
||||
@param[out] Attributes Protocol attributes.
|
||||
|
||||
@retval EFI_SUCCESS Protocol attributes are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
PerformanceGetAttributes (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
OUT SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES *Attributes
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32* ReturnValues;
|
||||
|
||||
Status = ScmiGetProtocolAttributes (
|
||||
SCMI_PROTOCOL_ID_PERFORMANCE,
|
||||
&ReturnValues
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
CopyMem (
|
||||
Attributes,
|
||||
ReturnValues,
|
||||
sizeof (SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES)
|
||||
);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Return performance domain attributes.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
@param[in] DomainId Identifier for the performance domain.
|
||||
|
||||
@param[out] Attributes Performance domain attributes.
|
||||
|
||||
@retval EFI_SUCCESS Domain attributes are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
PerformanceDomainAttributes (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
IN UINT32 DomainId,
|
||||
OUT SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES *DomainAttributes
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 *MessageParams;
|
||||
UINT32 *ReturnValues;
|
||||
UINT32 PayloadLength;
|
||||
SCMI_COMMAND Cmd;
|
||||
|
||||
Status = ScmiCommandGetPayload (&MessageParams);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
*MessageParams = DomainId;
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_PERFORMANCE;
|
||||
Cmd.MessageId = SCMI_MESSAGE_ID_PERFORMANCE_DOMAIN_ATTRIBUTES;
|
||||
|
||||
PayloadLength = sizeof (DomainId);
|
||||
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
&ReturnValues
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
CopyMem (
|
||||
DomainAttributes,
|
||||
ReturnValues,
|
||||
sizeof (SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES)
|
||||
);
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Return list of performance domain levels of a given domain.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
@param[in] DomainId Identifier for the performance domain.
|
||||
|
||||
@param[out] NumLevels Total number of levels a domain can support.
|
||||
|
||||
@param[in,out] LevelArraySize Size of the performance level array.
|
||||
|
||||
@param[out] LevelArray Array of the performance levels.
|
||||
|
||||
@retval EFI_SUCCESS Domain levels are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval EFI_BUFFER_TOO_SMALL LevelArraySize is too small for the result.
|
||||
It has been updated to the size needed.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
PerformanceDescribeLevels (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
IN UINT32 DomainId,
|
||||
OUT UINT32 *NumLevels,
|
||||
IN OUT UINT32 *LevelArraySize,
|
||||
OUT SCMI_PERFORMANCE_LEVEL *LevelArray
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 PayloadLength;
|
||||
SCMI_COMMAND Cmd;
|
||||
UINT32* MessageParams;
|
||||
UINT32 LevelIndex;
|
||||
UINT32 RequiredSize;
|
||||
UINT32 LevelNo;
|
||||
UINT32 ReturnNumLevels;
|
||||
UINT32 ReturnRemainNumLevels;
|
||||
|
||||
PERF_DESCRIBE_LEVELS *Levels;
|
||||
|
||||
Status = ScmiCommandGetPayload (&MessageParams);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
LevelIndex = 0;
|
||||
RequiredSize = 0;
|
||||
|
||||
*MessageParams++ = DomainId;
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_PERFORMANCE;
|
||||
Cmd.MessageId = SCMI_MESSAGE_ID_PERFORMANCE_DESCRIBE_LEVELS;
|
||||
|
||||
do {
|
||||
|
||||
*MessageParams = LevelIndex;
|
||||
|
||||
// Note, PayloadLength is an IN/OUT parameter.
|
||||
PayloadLength = sizeof (DomainId) + sizeof (LevelIndex);
|
||||
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
(UINT32**)&Levels
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
ReturnNumLevels = NUM_PERF_LEVELS (Levels->NumLevels);
|
||||
ReturnRemainNumLevels = NUM_REMAIN_PERF_LEVELS (Levels->NumLevels);
|
||||
|
||||
if (RequiredSize == 0) {
|
||||
*NumLevels = ReturnNumLevels + ReturnRemainNumLevels;
|
||||
|
||||
RequiredSize = (*NumLevels) * sizeof (SCMI_PERFORMANCE_LEVEL);
|
||||
if (RequiredSize > (*LevelArraySize)) {
|
||||
// Update LevelArraySize with required size.
|
||||
*LevelArraySize = RequiredSize;
|
||||
return EFI_BUFFER_TOO_SMALL;
|
||||
}
|
||||
}
|
||||
|
||||
for (LevelNo = 0; LevelNo < ReturnNumLevels; LevelNo++) {
|
||||
CopyMem (
|
||||
&LevelArray[LevelIndex++],
|
||||
&Levels->PerfLevel[LevelNo],
|
||||
sizeof (SCMI_PERFORMANCE_LEVEL)
|
||||
);
|
||||
}
|
||||
|
||||
} while (ReturnRemainNumLevels != 0);
|
||||
|
||||
*LevelArraySize = RequiredSize;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Set performance limits of a domain.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
@param[in] DomainId Identifier for the performance domain.
|
||||
@param[in] Limit Performance limit to set.
|
||||
|
||||
@retval EFI_SUCCESS Performance limits set successfully.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
EFI_STATUS
|
||||
PerformanceLimitsSet (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
IN UINT32 DomainId,
|
||||
IN SCMI_PERFORMANCE_LIMITS *Limits
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 PayloadLength;
|
||||
SCMI_COMMAND Cmd;
|
||||
UINT32 *MessageParams;
|
||||
|
||||
Status = ScmiCommandGetPayload (&MessageParams);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
*MessageParams++ = DomainId;
|
||||
*MessageParams++ = Limits->RangeMax;
|
||||
*MessageParams = Limits->RangeMin;
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_PERFORMANCE;
|
||||
Cmd.MessageId = SCMI_MESSAGE_ID_PERFORMANCE_LIMITS_SET;
|
||||
|
||||
PayloadLength = sizeof (DomainId) + sizeof (SCMI_PERFORMANCE_LIMITS);
|
||||
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
NULL
|
||||
);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/** Get performance limits of a domain.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
@param[in] DomainId Identifier for the performance domain.
|
||||
|
||||
@param[out] Limit Performance Limits of the domain.
|
||||
|
||||
@retval EFI_SUCCESS Performance limits are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
EFI_STATUS
|
||||
PerformanceLimitsGet (
|
||||
SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
UINT32 DomainId,
|
||||
SCMI_PERFORMANCE_LIMITS *Limits
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 PayloadLength;
|
||||
SCMI_COMMAND Cmd;
|
||||
UINT32 *MessageParams;
|
||||
|
||||
SCMI_PERFORMANCE_LIMITS *ReturnValues;
|
||||
|
||||
Status = ScmiCommandGetPayload (&MessageParams);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
*MessageParams = DomainId;
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_PERFORMANCE;
|
||||
Cmd.MessageId = SCMI_MESSAGE_ID_PERFORMANCE_LIMITS_GET;
|
||||
|
||||
PayloadLength = sizeof (DomainId);
|
||||
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
(UINT32**)&ReturnValues
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Limits->RangeMax = ReturnValues->RangeMax;
|
||||
Limits->RangeMin = ReturnValues->RangeMin;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/** Set performance level of a domain.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
@param[in] DomainId Identifier for the performance domain.
|
||||
@param[in] Level Performance level of the domain.
|
||||
|
||||
@retval EFI_SUCCESS Performance level set successfully.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
EFI_STATUS
|
||||
PerformanceLevelSet (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
IN UINT32 DomainId,
|
||||
IN UINT32 Level
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 PayloadLength;
|
||||
SCMI_COMMAND Cmd;
|
||||
UINT32 *MessageParams;
|
||||
|
||||
Status = ScmiCommandGetPayload (&MessageParams);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
*MessageParams++ = DomainId;
|
||||
*MessageParams = Level;
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_PERFORMANCE;
|
||||
Cmd.MessageId = SCMI_MESSAGE_ID_PERFORMANCE_LEVEL_SET;
|
||||
|
||||
PayloadLength = sizeof (DomainId) + sizeof (Level);
|
||||
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
NULL
|
||||
);
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/** Get performance level of a domain.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
@param[in] DomainId Identifier for the performance domain.
|
||||
|
||||
@param[out] Level Performance level of the domain.
|
||||
|
||||
@retval EFI_SUCCESS Performance level got successfully.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
EFI_STATUS
|
||||
PerformanceLevelGet (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
IN UINT32 DomainId,
|
||||
OUT UINT32 *Level
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 PayloadLength;
|
||||
SCMI_COMMAND Cmd;
|
||||
UINT32 *ReturnValues;
|
||||
UINT32 *MessageParams;
|
||||
|
||||
Status = ScmiCommandGetPayload (&MessageParams);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
*MessageParams = DomainId;
|
||||
|
||||
Cmd.ProtocolId = SCMI_PROTOCOL_ID_PERFORMANCE;
|
||||
Cmd.MessageId = SCMI_MESSAGE_ID_PERFORMANCE_LEVEL_GET;
|
||||
|
||||
PayloadLength = sizeof (DomainId);
|
||||
|
||||
Status = ScmiCommandExecute (
|
||||
&Cmd,
|
||||
&PayloadLength,
|
||||
&ReturnValues
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
*Level = *ReturnValues;
|
||||
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
// Instance of the SCMI performance management protocol.
|
||||
STATIC CONST SCMI_PERFORMANCE_PROTOCOL PerformanceProtocol = {
|
||||
PerformanceGetVersion,
|
||||
PerformanceGetAttributes,
|
||||
PerformanceDomainAttributes,
|
||||
PerformanceDescribeLevels,
|
||||
PerformanceLimitsSet,
|
||||
PerformanceLimitsGet,
|
||||
PerformanceLevelSet,
|
||||
PerformanceLevelGet
|
||||
};
|
||||
|
||||
/** Initialize performance management protocol and install on a given Handle.
|
||||
|
||||
@param[in] Handle Handle to install performance management
|
||||
protocol.
|
||||
|
||||
@retval EFI_SUCCESS Performance protocol installed successfully.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiPerformanceProtocolInit (
|
||||
IN EFI_HANDLE* Handle
|
||||
)
|
||||
{
|
||||
return gBS->InstallMultipleProtocolInterfaces (
|
||||
Handle,
|
||||
&gArmScmiPerformanceProtocolGuid,
|
||||
&PerformanceProtocol,
|
||||
NULL
|
||||
);
|
||||
}
|
174
ArmPkg/Drivers/ArmScmiDxe/ScmiPrivate.h
Normal file
174
ArmPkg/Drivers/ArmScmiDxe/ScmiPrivate.h
Normal file
@@ -0,0 +1,174 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
#ifndef SCMI_PRIVATE_H_
|
||||
#define SCMI_PRIVATE_H_
|
||||
|
||||
// SCMI protocol IDs.
|
||||
typedef enum {
|
||||
SCMI_PROTOCOL_ID_BASE = 0x10,
|
||||
SCMI_PROTOCOL_ID_POWER_DOMAIN = 0x11,
|
||||
SCMI_PROTOCOL_ID_SYSTEM_POWER = 0x12,
|
||||
SCMI_PROTOCOL_ID_PERFORMANCE = 0x13,
|
||||
SCMI_PROTOCOL_ID_CLOCK = 0x14,
|
||||
SCMI_PROTOCOL_ID_SENSOR = 0x15
|
||||
} SCMI_PROTOCOL_ID;
|
||||
|
||||
// SCMI message types.
|
||||
typedef enum {
|
||||
SCMI_MESSAGE_TYPE_COMMAND = 0,
|
||||
SCMI_MESSAGE_TYPE_DELAYED_RESPONSE = 2, // Skipping 1 is deliberate.
|
||||
SCMI_MESSAGE_TYPE_NOTIFICATION = 3
|
||||
} SCMI_MESSAGE_TYPE;
|
||||
|
||||
// SCMI response error codes.
|
||||
typedef enum {
|
||||
SCMI_SUCCESS = 0,
|
||||
SCMI_NOT_SUPPORTED = -1,
|
||||
SCMI_INVALID_PARAMETERS = -2,
|
||||
SCMI_DENIED = -3,
|
||||
SCMI_NOT_FOUND = -4,
|
||||
SCMI_OUT_OF_RANGE = -5,
|
||||
SCMI_BUSY = -6,
|
||||
SCMI_COMMS_ERROR = -7,
|
||||
SCMI_GENERIC_ERROR = -8,
|
||||
SCMI_HARDWARE_ERROR = -9,
|
||||
SCMI_PROTOCOL_ERROR = -10
|
||||
} SCMI_STATUS;
|
||||
|
||||
// SCMI message IDs common to all protocols.
|
||||
typedef enum {
|
||||
SCMI_MESSAGE_ID_PROTOCOL_VERSION = 0x0,
|
||||
SCMI_MESSAGE_ID_PROTOCOL_ATTRIBUTES = 0x1,
|
||||
SCMI_MESSAGE_ID_PROTOCOL_MESSAGE_ATTRIBUTES = 0x2
|
||||
} SCMI_MESSAGE_ID;
|
||||
|
||||
// Not defined in SCMI specification but will help to identify a message.
|
||||
typedef struct {
|
||||
SCMI_PROTOCOL_ID ProtocolId;
|
||||
UINT32 MessageId;
|
||||
} SCMI_COMMAND;
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
// Response to a SCMI command.
|
||||
typedef struct {
|
||||
INT32 Status;
|
||||
UINT32 ReturnValues[];
|
||||
} SCMI_MESSAGE_RESPONSE;
|
||||
|
||||
// Message header. MsgId[7:0], MsgType[9:8], ProtocolId[17:10]
|
||||
#define MESSAGE_TYPE_SHIFT 8
|
||||
#define PROTOCOL_ID_SHIFT 10
|
||||
#define SCMI_MESSAGE_HEADER(MsgId, MsgType, ProtocolId) ( \
|
||||
MsgType << MESSAGE_TYPE_SHIFT | \
|
||||
ProtocolId << PROTOCOL_ID_SHIFT | \
|
||||
MsgId \
|
||||
)
|
||||
// SCMI message header.
|
||||
typedef struct {
|
||||
UINT32 MessageHeader;
|
||||
} SCMI_MESSAGE_HEADER;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
/** Return a pointer to the message payload.
|
||||
|
||||
@param[out] Payload Holds pointer to the message payload.
|
||||
|
||||
@retval EFI_SUCCESS Payload holds a valid message payload pointer.
|
||||
@retval EFI_TIMEOUT Time out error if MTL channel is busy.
|
||||
@retval EFI_UNSUPPORTED If MTL channel is unsupported.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiCommandGetPayload (
|
||||
OUT UINT32** Payload
|
||||
);
|
||||
|
||||
/** Execute a SCMI command and receive a response.
|
||||
|
||||
This function uses a MTL channel to transfer message to SCP
|
||||
and waits for a response.
|
||||
|
||||
@param[in] Command Pointer to the SCMI command (Protocol ID
|
||||
and Message ID)
|
||||
|
||||
@param[in,out] PayloadLength SCMI command message length.
|
||||
|
||||
@param[out] OPTIONAL ReturnValues Pointer to SCMI response.
|
||||
|
||||
@retval OUT EFI_SUCCESS Command sent and message received successfully.
|
||||
@retval OUT EFI_UNSUPPORTED Channel not supported.
|
||||
@retval OUT EFI_TIMEOUT Timeout on the channel.
|
||||
@retval OUT EFI_DEVICE_ERROR Channel not ready.
|
||||
@retval OUT EFI_DEVICE_ERROR Message Header corrupted.
|
||||
@retval OUT EFI_DEVICE_ERROR SCMI error.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiCommandExecute (
|
||||
IN SCMI_COMMAND *Command,
|
||||
IN OUT UINT32 *PayloadLength,
|
||||
OUT UINT32 **ReturnValues OPTIONAL
|
||||
);
|
||||
|
||||
/** Return protocol version from SCP for a given protocol ID.
|
||||
|
||||
@param[in] Protocol ID Protocol ID.
|
||||
@param[out] Version Pointer to version of the protocol.
|
||||
|
||||
@retval EFI_SUCCESS Version holds a valid version received
|
||||
from the SCP.
|
||||
@retval EFI_DEVICE_ERROR SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiGetProtocolVersion (
|
||||
IN SCMI_PROTOCOL_ID ProtocolId,
|
||||
OUT UINT32 *Version
|
||||
);
|
||||
|
||||
/** Return protocol attributes from SCP for a given protocol ID.
|
||||
|
||||
@param[in] Protocol ID Protocol ID.
|
||||
@param[out] ReturnValues Pointer to attributes of the protocol.
|
||||
|
||||
@retval EFI_SUCCESS ReturnValues points to protocol attributes.
|
||||
@retval EFI_DEVICE_ERROR SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiGetProtocolAttributes (
|
||||
IN SCMI_PROTOCOL_ID ProtocolId,
|
||||
OUT UINT32 **ReturnValues
|
||||
);
|
||||
|
||||
/** Return protocol message attributes from SCP for a given protocol ID.
|
||||
|
||||
@param[in] Protocol ID Protocol ID.
|
||||
|
||||
@param[out] Attributes Pointer to attributes of the protocol.
|
||||
|
||||
@retval EFI_SUCCESS ReturnValues points to protocol message attributes.
|
||||
@retval EFI_DEVICE_ERROR SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
EFI_STATUS
|
||||
ScmiGetProtocolMessageAttributes (
|
||||
IN SCMI_PROTOCOL_ID ProtocolId,
|
||||
OUT UINT32 **ReturnValues
|
||||
);
|
||||
|
||||
#endif /* SCMI_PRIVATE_H_ */
|
@@ -457,6 +457,9 @@ GetMemoryRegion (
|
||||
|
||||
// Get the section at the given index
|
||||
SectionDescriptor = FirstLevelTable[TableIndex];
|
||||
if (!SectionDescriptor) {
|
||||
return EFI_NOT_FOUND;
|
||||
}
|
||||
|
||||
// If 'BaseAddress' belongs to the section then round it to the section boundary
|
||||
if (((SectionDescriptor & TT_DESCRIPTOR_SECTION_TYPE_MASK) == TT_DESCRIPTOR_SECTION_TYPE_SECTION) ||
|
||||
|
@@ -35,7 +35,6 @@
|
||||
#include <Guid/DebugImageInfoTable.h>
|
||||
#include <Protocol/Cpu.h>
|
||||
#include <Protocol/DebugSupport.h>
|
||||
#include <Protocol/DebugSupportPeriodicCallback.h>
|
||||
#include <Protocol/LoadedImage.h>
|
||||
|
||||
extern BOOLEAN mIsFlushingGCD;
|
||||
|
@@ -60,7 +60,6 @@
|
||||
|
||||
[Protocols]
|
||||
gEfiCpuArchProtocolGuid
|
||||
gEfiDebugSupportPeriodicCallbackProtocolGuid
|
||||
|
||||
[Guids]
|
||||
gEfiDebugImageInfoTableGuid
|
||||
@@ -72,8 +71,7 @@
|
||||
gArmTokenSpaceGuid.PcdVFPEnabled
|
||||
|
||||
[FeaturePcd.common]
|
||||
gArmTokenSpaceGuid.PcdCpuDxeProduceDebugSupport
|
||||
gArmTokenSpaceGuid.PcdDebuggerExceptionSupport
|
||||
|
||||
[Depex]
|
||||
TRUE
|
||||
gHardwareInterruptProtocolGuid OR gHardwareInterrupt2ProtocolGuid
|
||||
|
@@ -73,7 +73,7 @@ InitializeCpuPeim (
|
||||
ArmEnableBranchPrediction ();
|
||||
|
||||
// Publish the CPU memory and io spaces sizes
|
||||
BuildCpuHob (PcdGet8 (PcdPrePiCpuMemorySize), PcdGet8 (PcdPrePiCpuIoSize));
|
||||
BuildCpuHob (ArmGetPhysicalAddressBits (), PcdGet8 (PcdPrePiCpuIoSize));
|
||||
|
||||
// Only MP Core platform need to produce gArmMpCoreInfoPpiGuid
|
||||
Status = PeiServicesLocatePpi (&gArmMpCoreInfoPpiGuid, 0, NULL, (VOID**)&ArmMpCoreInfoPpi);
|
||||
|
@@ -50,7 +50,6 @@
|
||||
gArmMpCoreInfoGuid
|
||||
|
||||
[FixedPcd]
|
||||
gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize
|
||||
gEmbeddedTokenSpaceGuid.PcdPrePiCpuIoSize
|
||||
|
||||
[Depex]
|
||||
|
@@ -20,7 +20,8 @@
|
||||
// Control Frame:
|
||||
#define GENERIC_WDOG_CONTROL_STATUS_REG ((UINTN)FixedPcdGet64 (PcdGenericWatchdogControlBase) + 0x000)
|
||||
#define GENERIC_WDOG_OFFSET_REG ((UINTN)FixedPcdGet64 (PcdGenericWatchdogControlBase) + 0x008)
|
||||
#define GENERIC_WDOG_COMPARE_VALUE_REG ((UINTN)FixedPcdGet64 (PcdGenericWatchdogControlBase) + 0x010)
|
||||
#define GENERIC_WDOG_COMPARE_VALUE_REG_LOW ((UINTN)FixedPcdGet64 (PcdGenericWatchdogControlBase) + 0x010)
|
||||
#define GENERIC_WDOG_COMPARE_VALUE_REG_HIGH ((UINTN)FixedPcdGet64 (PcdGenericWatchdogControlBase) + 0x014)
|
||||
|
||||
// Values of bit 0 of the Control/Status Register
|
||||
#define GENERIC_WDOG_ENABLED 1
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2013-2017, ARM Limited. All rights reserved.
|
||||
* Copyright (c) 2013-2018, ARM Limited. All rights reserved.
|
||||
*
|
||||
* This program and the accompanying materials
|
||||
* are licensed and made available under the terms and conditions of the BSD
|
||||
@@ -34,50 +34,57 @@
|
||||
#define TIME_UNITS_PER_SECOND 10000000
|
||||
|
||||
// Tick frequency of the generic timer basis of the generic watchdog.
|
||||
UINTN mTimerFrequencyHz = 0;
|
||||
STATIC UINTN mTimerFrequencyHz = 0;
|
||||
|
||||
/* In cases where the compare register was set manually, information about
|
||||
how long the watchdog was asked to wait cannot be retrieved from hardware.
|
||||
It is therefore stored here. 0 means the timer is not running. */
|
||||
UINT64 mNumTimerTicks = 0;
|
||||
STATIC UINT64 mNumTimerTicks = 0;
|
||||
|
||||
EFI_HARDWARE_INTERRUPT2_PROTOCOL *mInterruptProtocol;
|
||||
STATIC EFI_HARDWARE_INTERRUPT2_PROTOCOL *mInterruptProtocol;
|
||||
STATIC EFI_WATCHDOG_TIMER_NOTIFY mWatchdogNotify;
|
||||
|
||||
EFI_STATUS
|
||||
STATIC
|
||||
VOID
|
||||
WatchdogWriteOffsetRegister (
|
||||
UINT32 Value
|
||||
)
|
||||
{
|
||||
return MmioWrite32 (GENERIC_WDOG_OFFSET_REG, Value);
|
||||
MmioWrite32 (GENERIC_WDOG_OFFSET_REG, Value);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
STATIC
|
||||
VOID
|
||||
WatchdogWriteCompareRegister (
|
||||
UINT64 Value
|
||||
)
|
||||
{
|
||||
return MmioWrite64 (GENERIC_WDOG_COMPARE_VALUE_REG, Value);
|
||||
MmioWrite32 (GENERIC_WDOG_COMPARE_VALUE_REG_LOW, Value & MAX_UINT32);
|
||||
MmioWrite32 (GENERIC_WDOG_COMPARE_VALUE_REG_HIGH, (Value >> 32) & MAX_UINT32);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
STATIC
|
||||
VOID
|
||||
WatchdogEnable (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return MmioWrite32 (GENERIC_WDOG_CONTROL_STATUS_REG, GENERIC_WDOG_ENABLED);
|
||||
MmioWrite32 (GENERIC_WDOG_CONTROL_STATUS_REG, GENERIC_WDOG_ENABLED);
|
||||
}
|
||||
|
||||
EFI_STATUS
|
||||
STATIC
|
||||
VOID
|
||||
WatchdogDisable (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
return MmioWrite32 (GENERIC_WDOG_CONTROL_STATUS_REG, GENERIC_WDOG_DISABLED);
|
||||
MmioWrite32 (GENERIC_WDOG_CONTROL_STATUS_REG, GENERIC_WDOG_DISABLED);
|
||||
}
|
||||
|
||||
/** On exiting boot services we must make sure the Watchdog Timer
|
||||
is stopped.
|
||||
**/
|
||||
STATIC
|
||||
VOID
|
||||
EFIAPI
|
||||
WatchdogExitBootServicesEvent (
|
||||
@@ -92,6 +99,7 @@ WatchdogExitBootServicesEvent (
|
||||
/* This function is called when the watchdog's first signal (WS0) goes high.
|
||||
It uses the ResetSystem Runtime Service to reset the board.
|
||||
*/
|
||||
STATIC
|
||||
VOID
|
||||
EFIAPI
|
||||
WatchdogInterruptHandler (
|
||||
@@ -100,17 +108,25 @@ WatchdogInterruptHandler (
|
||||
)
|
||||
{
|
||||
STATIC CONST CHAR16 ResetString[]= L"The generic watchdog timer ran out.";
|
||||
UINT64 TimerPeriod;
|
||||
|
||||
WatchdogDisable ();
|
||||
|
||||
mInterruptProtocol->EndOfInterrupt (mInterruptProtocol, Source);
|
||||
|
||||
gRT->ResetSystem (
|
||||
EfiResetCold,
|
||||
EFI_TIMEOUT,
|
||||
StrSize (ResetString),
|
||||
(VOID *) &ResetString
|
||||
);
|
||||
//
|
||||
// The notify function should be called with the elapsed number of ticks
|
||||
// since the watchdog was armed, which should exceed the timer period.
|
||||
// We don't actually know the elapsed number of ticks, so let's return
|
||||
// the timer period plus 1.
|
||||
//
|
||||
if (mWatchdogNotify != NULL) {
|
||||
TimerPeriod = ((TIME_UNITS_PER_SECOND / mTimerFrequencyHz) * mNumTimerTicks);
|
||||
mWatchdogNotify (TimerPeriod + 1);
|
||||
}
|
||||
|
||||
gRT->ResetSystem (EfiResetCold, EFI_TIMEOUT, StrSize (ResetString),
|
||||
(CHAR16 *)ResetString);
|
||||
|
||||
// If we got here then the reset didn't work
|
||||
ASSERT (FALSE);
|
||||
@@ -140,16 +156,24 @@ WatchdogInterruptHandler (
|
||||
@retval EFI_UNSUPPORTED The code does not support NotifyFunction.
|
||||
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
WatchdogRegisterHandler (
|
||||
IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
|
||||
IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
|
||||
IN EFI_WATCHDOG_TIMER_NOTIFY NotifyFunction
|
||||
)
|
||||
{
|
||||
// ERROR: This function is not supported.
|
||||
// The watchdog will reset the board
|
||||
return EFI_UNSUPPORTED;
|
||||
if (mWatchdogNotify == NULL && NotifyFunction == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
if (mWatchdogNotify != NULL && NotifyFunction != NULL) {
|
||||
return EFI_ALREADY_STARTED;
|
||||
}
|
||||
|
||||
mWatchdogNotify = NotifyFunction;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -163,25 +187,24 @@ WatchdogRegisterHandler (
|
||||
then the watchdog timer is disabled.
|
||||
|
||||
@retval EFI_SUCCESS The watchdog timer has been programmed to fire
|
||||
in Time 100ns units.
|
||||
@retval EFI_DEVICE_ERROR A watchdog timer could not be programmed due
|
||||
to a device error.
|
||||
in TimerPeriod 100ns units.
|
||||
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
WatchdogSetTimerPeriod (
|
||||
IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
|
||||
IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
|
||||
IN UINT64 TimerPeriod // In 100ns units
|
||||
)
|
||||
{
|
||||
UINTN SystemCount;
|
||||
EFI_STATUS Status;
|
||||
|
||||
// if TimerPeriod is 0, this is a request to stop the watchdog.
|
||||
if (TimerPeriod == 0) {
|
||||
mNumTimerTicks = 0;
|
||||
return WatchdogDisable ();
|
||||
WatchdogDisable ();
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
// Work out how many timer ticks will equate to TimerPeriod
|
||||
@@ -195,19 +218,16 @@ WatchdogSetTimerPeriod (
|
||||
because enabling the watchdog causes an "explicit refresh", which
|
||||
clobbers the compare register (WCV). In order to make sure this doesn't
|
||||
trigger an interrupt, set the offset to max. */
|
||||
Status = WatchdogWriteOffsetRegister (MAX_UINT32);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
WatchdogWriteOffsetRegister (MAX_UINT32);
|
||||
WatchdogEnable ();
|
||||
SystemCount = ArmGenericTimerGetSystemCount ();
|
||||
Status = WatchdogWriteCompareRegister (SystemCount + mNumTimerTicks);
|
||||
WatchdogWriteCompareRegister (SystemCount + mNumTimerTicks);
|
||||
} else {
|
||||
Status = WatchdogWriteOffsetRegister ((UINT32)mNumTimerTicks);
|
||||
WatchdogWriteOffsetRegister ((UINT32)mNumTimerTicks);
|
||||
WatchdogEnable ();
|
||||
}
|
||||
|
||||
return Status;
|
||||
return EFI_SUCCESS;
|
||||
}
|
||||
|
||||
/**
|
||||
@@ -226,10 +246,11 @@ WatchdogSetTimerPeriod (
|
||||
@retval EFI_INVALID_PARAMETER TimerPeriod is NULL.
|
||||
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
WatchdogGetTimerPeriod (
|
||||
IN CONST EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
|
||||
IN EFI_WATCHDOG_TIMER_ARCH_PROTOCOL *This,
|
||||
OUT UINT64 *TimerPeriod
|
||||
)
|
||||
{
|
||||
@@ -274,13 +295,13 @@ WatchdogGetTimerPeriod (
|
||||
Retrieves the period of the timer interrupt in 100ns units.
|
||||
|
||||
**/
|
||||
EFI_WATCHDOG_TIMER_ARCH_PROTOCOL gWatchdogTimer = {
|
||||
(EFI_WATCHDOG_TIMER_REGISTER_HANDLER)WatchdogRegisterHandler,
|
||||
(EFI_WATCHDOG_TIMER_SET_TIMER_PERIOD)WatchdogSetTimerPeriod,
|
||||
(EFI_WATCHDOG_TIMER_GET_TIMER_PERIOD)WatchdogGetTimerPeriod
|
||||
STATIC EFI_WATCHDOG_TIMER_ARCH_PROTOCOL mWatchdogTimer = {
|
||||
WatchdogRegisterHandler,
|
||||
WatchdogSetTimerPeriod,
|
||||
WatchdogGetTimerPeriod
|
||||
};
|
||||
|
||||
EFI_EVENT EfiExitBootServicesEvent = (EFI_EVENT)NULL;
|
||||
STATIC EFI_EVENT mEfiExitBootServicesEvent;
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
@@ -292,6 +313,10 @@ GenericWatchdogEntry (
|
||||
EFI_STATUS Status;
|
||||
EFI_HANDLE Handle;
|
||||
|
||||
Status = gBS->LocateProtocol (&gHardwareInterrupt2ProtocolGuid, NULL,
|
||||
(VOID **)&mInterruptProtocol);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
/* Make sure the Watchdog Timer Architectural Protocol has not been installed
|
||||
in the system yet.
|
||||
This will avoid conflicts with the universal watchdog */
|
||||
@@ -300,51 +325,45 @@ GenericWatchdogEntry (
|
||||
mTimerFrequencyHz = ArmGenericTimerGetTimerFreq ();
|
||||
ASSERT (mTimerFrequencyHz != 0);
|
||||
|
||||
// Register for an ExitBootServicesEvent
|
||||
Status = gBS->CreateEvent (
|
||||
EVT_SIGNAL_EXIT_BOOT_SERVICES,
|
||||
TPL_NOTIFY,
|
||||
WatchdogExitBootServicesEvent,
|
||||
NULL,
|
||||
&EfiExitBootServicesEvent
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
// Install interrupt handler
|
||||
Status = gBS->LocateProtocol (
|
||||
&gHardwareInterrupt2ProtocolGuid,
|
||||
NULL,
|
||||
(VOID **)&mInterruptProtocol
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Status = mInterruptProtocol->RegisterInterruptSource (
|
||||
mInterruptProtocol,
|
||||
Status = mInterruptProtocol->RegisterInterruptSource (mInterruptProtocol,
|
||||
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
||||
WatchdogInterruptHandler
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
Status = mInterruptProtocol->SetTriggerType (
|
||||
mInterruptProtocol,
|
||||
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
||||
EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING
|
||||
);
|
||||
if (!EFI_ERROR (Status)) {
|
||||
// Install the Timer Architectural Protocol onto a new handle
|
||||
Handle = NULL;
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (
|
||||
&Handle,
|
||||
&gEfiWatchdogTimerArchProtocolGuid,
|
||||
&gWatchdogTimer,
|
||||
NULL
|
||||
);
|
||||
}
|
||||
}
|
||||
}
|
||||
WatchdogInterruptHandler);
|
||||
if (EFI_ERROR (Status)) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
Status = mInterruptProtocol->SetTriggerType (mInterruptProtocol,
|
||||
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
||||
EFI_HARDWARE_INTERRUPT2_TRIGGER_EDGE_RISING);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto UnregisterHandler;
|
||||
}
|
||||
|
||||
// Install the Timer Architectural Protocol onto a new handle
|
||||
Handle = NULL;
|
||||
Status = gBS->InstallMultipleProtocolInterfaces (&Handle,
|
||||
&gEfiWatchdogTimerArchProtocolGuid, &mWatchdogTimer,
|
||||
NULL);
|
||||
if (EFI_ERROR (Status)) {
|
||||
goto UnregisterHandler;
|
||||
}
|
||||
|
||||
// Register for an ExitBootServicesEvent
|
||||
Status = gBS->CreateEvent (EVT_SIGNAL_EXIT_BOOT_SERVICES, TPL_NOTIFY,
|
||||
WatchdogExitBootServicesEvent, NULL,
|
||||
&mEfiExitBootServicesEvent);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
mNumTimerTicks = 0;
|
||||
WatchdogDisable ();
|
||||
|
||||
return EFI_SUCCESS;
|
||||
|
||||
UnregisterHandler:
|
||||
// Unregister the handler
|
||||
mInterruptProtocol->RegisterInterruptSource (mInterruptProtocol,
|
||||
FixedPcdGet32 (PcdGenericWatchdogEl2IntrNum),
|
||||
NULL);
|
||||
return Status;
|
||||
}
|
||||
|
@@ -16,17 +16,16 @@
|
||||
FILE_GUID = 0619f5c2-4858-4caa-a86a-73a21a18df6b
|
||||
MODULE_TYPE = DXE_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
|
||||
ENTRY_POINT = GenericWatchdogEntry
|
||||
|
||||
[Sources.common]
|
||||
GenericWatchdogDxe.c
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
EmbeddedPkg/EmbeddedPkg.dec
|
||||
ArmPkg/ArmPkg.dec
|
||||
ArmPlatformPkg/ArmPlatformPkg.dec
|
||||
EmbeddedPkg/EmbeddedPkg.dec
|
||||
MdePkg/MdePkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
ArmGenericTimerCounterLib
|
||||
@@ -46,8 +45,8 @@
|
||||
gArmTokenSpaceGuid.PcdGenericWatchdogEl2IntrNum
|
||||
|
||||
[Protocols]
|
||||
gEfiWatchdogTimerArchProtocolGuid
|
||||
gHardwareInterrupt2ProtocolGuid
|
||||
gEfiWatchdogTimerArchProtocolGuid ## ALWAYS_PRODUCES
|
||||
gHardwareInterrupt2ProtocolGuid ## ALWAYS_CONSUMES
|
||||
|
||||
[Depex]
|
||||
gHardwareInterrupt2ProtocolGuid
|
||||
|
28
ArmPkg/Drivers/MmCommunicationDxe/MmCommunicate.h
Normal file
28
ArmPkg/Drivers/MmCommunicationDxe/MmCommunicate.h
Normal file
@@ -0,0 +1,28 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2016-2018, ARM Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#if !defined _MM_COMMUNICATE_H_
|
||||
#define _MM_COMMUNICATE_H_
|
||||
|
||||
#define MM_MAJOR_VER_MASK 0xEFFF0000
|
||||
#define MM_MINOR_VER_MASK 0x0000FFFF
|
||||
#define MM_MAJOR_VER_SHIFT 16
|
||||
|
||||
#define MM_MAJOR_VER(x) (((x) & MM_MAJOR_VER_MASK) >> MM_MAJOR_VER_SHIFT)
|
||||
#define MM_MINOR_VER(x) ((x) & MM_MINOR_VER_MASK)
|
||||
|
||||
#define MM_CALLER_MAJOR_VER 0x1UL
|
||||
#define MM_CALLER_MINOR_VER 0x0
|
||||
|
||||
#endif /* _MM_COMMUNICATE_H_ */
|
372
ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c
Normal file
372
ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.c
Normal file
@@ -0,0 +1,372 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2016-2018, ARM Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <Library/ArmLib.h>
|
||||
#include <Library/ArmSmcLib.h>
|
||||
#include <Library/BaseMemoryLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/DxeServicesTableLib.h>
|
||||
#include <Library/HobLib.h>
|
||||
#include <Library/PcdLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/UefiRuntimeServicesTableLib.h>
|
||||
|
||||
#include <Protocol/MmCommunication.h>
|
||||
|
||||
#include <IndustryStandard/ArmStdSmc.h>
|
||||
|
||||
#include "MmCommunicate.h"
|
||||
|
||||
//
|
||||
// Address, Length of the pre-allocated buffer for communication with the secure
|
||||
// world.
|
||||
//
|
||||
STATIC ARM_MEMORY_REGION_DESCRIPTOR mNsCommBuffMemRegion;
|
||||
|
||||
// Notification event when virtual address map is set.
|
||||
STATIC EFI_EVENT mSetVirtualAddressMapEvent;
|
||||
|
||||
//
|
||||
// Handle to install the MM Communication Protocol
|
||||
//
|
||||
STATIC EFI_HANDLE mMmCommunicateHandle;
|
||||
|
||||
/**
|
||||
Communicates with a registered handler.
|
||||
|
||||
This function provides an interface to send and receive messages to the
|
||||
Standalone MM environment on behalf of UEFI services. This function is part
|
||||
of the MM Communication Protocol that may be called in physical mode prior to
|
||||
SetVirtualAddressMap() and in virtual mode after SetVirtualAddressMap().
|
||||
|
||||
@param[in] This The EFI_MM_COMMUNICATION_PROTOCOL
|
||||
instance.
|
||||
@param[in, out] CommBuffer A pointer to the buffer to convey
|
||||
into MMRAM.
|
||||
@param[in, out] CommSize The size of the data buffer being
|
||||
passed in. This is optional.
|
||||
|
||||
@retval EFI_SUCCESS The message was successfully posted.
|
||||
@retval EFI_INVALID_PARAMETER The CommBuffer was NULL.
|
||||
@retval EFI_BAD_BUFFER_SIZE The buffer size is incorrect for the MM
|
||||
implementation. If this error is
|
||||
returned, the MessageLength field in
|
||||
the CommBuffer header or the integer
|
||||
pointed by CommSize are updated to reflect
|
||||
the maximum payload size the
|
||||
implementation can accommodate.
|
||||
@retval EFI_ACCESS_DENIED The CommunicateBuffer parameter
|
||||
or CommSize parameter, if not omitted,
|
||||
are in address range that cannot be
|
||||
accessed by the MM environment
|
||||
**/
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
MmCommunicationCommunicate (
|
||||
IN CONST EFI_MM_COMMUNICATION_PROTOCOL *This,
|
||||
IN OUT VOID *CommBuffer,
|
||||
IN OUT UINTN *CommSize OPTIONAL
|
||||
)
|
||||
{
|
||||
EFI_MM_COMMUNICATE_HEADER *CommunicateHeader;
|
||||
ARM_SMC_ARGS CommunicateSmcArgs;
|
||||
EFI_STATUS Status;
|
||||
UINTN BufferSize;
|
||||
|
||||
Status = EFI_ACCESS_DENIED;
|
||||
BufferSize = 0;
|
||||
|
||||
ZeroMem (&CommunicateSmcArgs, sizeof (ARM_SMC_ARGS));
|
||||
|
||||
//
|
||||
// Check parameters
|
||||
//
|
||||
if (CommBuffer == NULL) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
CommunicateHeader = CommBuffer;
|
||||
// CommBuffer is a mandatory parameter. Hence, Rely on
|
||||
// MessageLength + Header to ascertain the
|
||||
// total size of the communication payload rather than
|
||||
// rely on optional CommSize parameter
|
||||
BufferSize = CommunicateHeader->MessageLength +
|
||||
sizeof (CommunicateHeader->HeaderGuid) +
|
||||
sizeof (CommunicateHeader->MessageLength);
|
||||
|
||||
// If the length of the CommBuffer is 0 then return the expected length.
|
||||
if (CommSize) {
|
||||
// This case can be used by the consumer of this driver to find out the
|
||||
// max size that can be used for allocating CommBuffer.
|
||||
if ((*CommSize == 0) ||
|
||||
(*CommSize > mNsCommBuffMemRegion.Length)) {
|
||||
*CommSize = mNsCommBuffMemRegion.Length;
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
//
|
||||
// CommSize must match MessageLength + sizeof (EFI_MM_COMMUNICATE_HEADER);
|
||||
//
|
||||
if (*CommSize != BufferSize) {
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
}
|
||||
|
||||
//
|
||||
// If the buffer size is 0 or greater than what can be tolerated by the MM
|
||||
// environment then return the expected size.
|
||||
//
|
||||
if ((BufferSize == 0) ||
|
||||
(BufferSize > mNsCommBuffMemRegion.Length)) {
|
||||
CommunicateHeader->MessageLength = mNsCommBuffMemRegion.Length -
|
||||
sizeof (CommunicateHeader->HeaderGuid) -
|
||||
sizeof (CommunicateHeader->MessageLength);
|
||||
return EFI_BAD_BUFFER_SIZE;
|
||||
}
|
||||
|
||||
// SMC Function ID
|
||||
CommunicateSmcArgs.Arg0 = ARM_SMC_ID_MM_COMMUNICATE_AARCH64;
|
||||
|
||||
// Cookie
|
||||
CommunicateSmcArgs.Arg1 = 0;
|
||||
|
||||
// Copy Communication Payload
|
||||
CopyMem ((VOID *)mNsCommBuffMemRegion.VirtualBase, CommBuffer, BufferSize);
|
||||
|
||||
// comm_buffer_address (64-bit physical address)
|
||||
CommunicateSmcArgs.Arg2 = (UINTN)mNsCommBuffMemRegion.PhysicalBase;
|
||||
|
||||
// comm_size_address (not used, indicated by setting to zero)
|
||||
CommunicateSmcArgs.Arg3 = 0;
|
||||
|
||||
// Call the Standalone MM environment.
|
||||
ArmCallSmc (&CommunicateSmcArgs);
|
||||
|
||||
switch (CommunicateSmcArgs.Arg0) {
|
||||
case ARM_SMC_MM_RET_SUCCESS:
|
||||
ZeroMem (CommBuffer, BufferSize);
|
||||
// On successful return, the size of data being returned is inferred from
|
||||
// MessageLength + Header.
|
||||
CommunicateHeader = (EFI_MM_COMMUNICATE_HEADER *)mNsCommBuffMemRegion.VirtualBase;
|
||||
BufferSize = CommunicateHeader->MessageLength +
|
||||
sizeof (CommunicateHeader->HeaderGuid) +
|
||||
sizeof (CommunicateHeader->MessageLength);
|
||||
|
||||
CopyMem (
|
||||
CommBuffer,
|
||||
(VOID *)mNsCommBuffMemRegion.VirtualBase,
|
||||
BufferSize
|
||||
);
|
||||
Status = EFI_SUCCESS;
|
||||
break;
|
||||
|
||||
case ARM_SMC_MM_RET_INVALID_PARAMS:
|
||||
Status = EFI_INVALID_PARAMETER;
|
||||
break;
|
||||
|
||||
case ARM_SMC_MM_RET_DENIED:
|
||||
Status = EFI_ACCESS_DENIED;
|
||||
break;
|
||||
|
||||
case ARM_SMC_MM_RET_NO_MEMORY:
|
||||
// Unexpected error since the CommSize was checked for zero length
|
||||
// prior to issuing the SMC
|
||||
Status = EFI_OUT_OF_RESOURCES;
|
||||
ASSERT (0);
|
||||
break;
|
||||
|
||||
default:
|
||||
Status = EFI_ACCESS_DENIED;
|
||||
ASSERT (0);
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
//
|
||||
// MM Communication Protocol instance
|
||||
//
|
||||
EFI_MM_COMMUNICATION_PROTOCOL mMmCommunication = {
|
||||
MmCommunicationCommunicate
|
||||
};
|
||||
|
||||
/**
|
||||
Notification callback on SetVirtualAddressMap event.
|
||||
|
||||
This function notifies the MM communication protocol interface on
|
||||
SetVirtualAddressMap event and converts pointers used in this driver
|
||||
from physical to virtual address.
|
||||
|
||||
@param Event SetVirtualAddressMap event.
|
||||
@param Context A context when the SetVirtualAddressMap triggered.
|
||||
|
||||
@retval EFI_SUCCESS The function executed successfully.
|
||||
@retval Other Some error occurred when executing this function.
|
||||
|
||||
**/
|
||||
STATIC
|
||||
VOID
|
||||
EFIAPI
|
||||
NotifySetVirtualAddressMap (
|
||||
IN EFI_EVENT Event,
|
||||
IN VOID *Context
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
Status = gRT->ConvertPointer (
|
||||
EFI_OPTIONAL_PTR,
|
||||
(VOID **)&mNsCommBuffMemRegion.VirtualBase
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "NotifySetVirtualAddressMap():"
|
||||
" Unable to convert MM runtime pointer. Status:0x%r\n", Status));
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
STATIC
|
||||
EFI_STATUS
|
||||
GetMmCompatibility ()
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
UINT32 MmVersion;
|
||||
ARM_SMC_ARGS MmVersionArgs;
|
||||
|
||||
// MM_VERSION uses SMC32 calling conventions
|
||||
MmVersionArgs.Arg0 = ARM_SMC_ID_MM_VERSION_AARCH32;
|
||||
|
||||
ArmCallSmc (&MmVersionArgs);
|
||||
|
||||
MmVersion = MmVersionArgs.Arg0;
|
||||
|
||||
if ((MM_MAJOR_VER(MmVersion) == MM_CALLER_MAJOR_VER) &&
|
||||
(MM_MINOR_VER(MmVersion) >= MM_CALLER_MINOR_VER)) {
|
||||
DEBUG ((DEBUG_INFO, "MM Version: Major=0x%x, Minor=0x%x\n",
|
||||
MM_MAJOR_VER(MmVersion), MM_MINOR_VER(MmVersion)));
|
||||
Status = EFI_SUCCESS;
|
||||
} else {
|
||||
DEBUG ((DEBUG_ERROR, "Incompatible MM Versions.\n Current Version: Major=0x%x, Minor=0x%x.\n Expected: Major=0x%x, Minor>=0x%x.\n",
|
||||
MM_MAJOR_VER(MmVersion), MM_MINOR_VER(MmVersion), MM_CALLER_MAJOR_VER, MM_CALLER_MINOR_VER));
|
||||
Status = EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
return Status;
|
||||
}
|
||||
|
||||
/**
|
||||
The Entry Point for MM Communication
|
||||
|
||||
This function installs the MM communication protocol interface and finds out
|
||||
what type of buffer management will be required prior to invoking the
|
||||
communication SMC.
|
||||
|
||||
@param ImageHandle The firmware allocated handle for the EFI image.
|
||||
@param SystemTable A pointer to the EFI System Table.
|
||||
|
||||
@retval EFI_SUCCESS The entry point is executed successfully.
|
||||
@retval Other Some error occurred when executing this entry point.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
MmCommunicationInitialize (
|
||||
IN EFI_HANDLE ImageHandle,
|
||||
IN EFI_SYSTEM_TABLE *SystemTable
|
||||
)
|
||||
{
|
||||
EFI_STATUS Status;
|
||||
|
||||
// Check if we can make the MM call
|
||||
Status = GetMmCompatibility ();
|
||||
if (EFI_ERROR(Status)) {
|
||||
goto ReturnErrorStatus;
|
||||
}
|
||||
|
||||
mNsCommBuffMemRegion.PhysicalBase = PcdGet64 (PcdMmBufferBase);
|
||||
// During boot , Virtual and Physical are same
|
||||
mNsCommBuffMemRegion.VirtualBase = mNsCommBuffMemRegion.PhysicalBase;
|
||||
mNsCommBuffMemRegion.Length = PcdGet64 (PcdMmBufferSize);
|
||||
|
||||
ASSERT (mNsCommBuffMemRegion.PhysicalBase != 0);
|
||||
|
||||
ASSERT (mNsCommBuffMemRegion.Length != 0);
|
||||
|
||||
Status = gDS->AddMemorySpace (
|
||||
EfiGcdMemoryTypeReserved,
|
||||
mNsCommBuffMemRegion.PhysicalBase,
|
||||
mNsCommBuffMemRegion.Length,
|
||||
EFI_MEMORY_WB |
|
||||
EFI_MEMORY_XP |
|
||||
EFI_MEMORY_RUNTIME
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "MmCommunicateInitialize: "
|
||||
"Failed to add MM-NS Buffer Memory Space\n"));
|
||||
goto ReturnErrorStatus;
|
||||
}
|
||||
|
||||
Status = gDS->SetMemorySpaceAttributes (
|
||||
mNsCommBuffMemRegion.PhysicalBase,
|
||||
mNsCommBuffMemRegion.Length,
|
||||
EFI_MEMORY_WB | EFI_MEMORY_XP | EFI_MEMORY_RUNTIME
|
||||
);
|
||||
if (EFI_ERROR (Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "MmCommunicateInitialize: "
|
||||
"Failed to set MM-NS Buffer Memory attributes\n"));
|
||||
goto CleanAddedMemorySpace;
|
||||
}
|
||||
|
||||
// Install the communication protocol
|
||||
Status = gBS->InstallProtocolInterface (
|
||||
&mMmCommunicateHandle,
|
||||
&gEfiMmCommunicationProtocolGuid,
|
||||
EFI_NATIVE_INTERFACE,
|
||||
&mMmCommunication
|
||||
);
|
||||
if (EFI_ERROR(Status)) {
|
||||
DEBUG ((DEBUG_ERROR, "MmCommunicationInitialize: "
|
||||
"Failed to install MM communication protocol\n"));
|
||||
goto CleanAddedMemorySpace;
|
||||
}
|
||||
|
||||
// Register notification callback when virtual address is associated
|
||||
// with the physical address.
|
||||
// Create a Set Virtual Address Map event.
|
||||
Status = gBS->CreateEvent (
|
||||
EVT_SIGNAL_VIRTUAL_ADDRESS_CHANGE,
|
||||
TPL_NOTIFY,
|
||||
NotifySetVirtualAddressMap,
|
||||
NULL,
|
||||
&mSetVirtualAddressMapEvent
|
||||
);
|
||||
if (Status == EFI_SUCCESS) {
|
||||
return Status;
|
||||
}
|
||||
|
||||
gBS->UninstallProtocolInterface (
|
||||
mMmCommunicateHandle,
|
||||
&gEfiMmCommunicationProtocolGuid,
|
||||
&mMmCommunication
|
||||
);
|
||||
|
||||
CleanAddedMemorySpace:
|
||||
gDS->RemoveMemorySpace (
|
||||
mNsCommBuffMemRegion.PhysicalBase,
|
||||
mNsCommBuffMemRegion.Length
|
||||
);
|
||||
|
||||
ReturnErrorStatus:
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
56
ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf
Normal file
56
ArmPkg/Drivers/MmCommunicationDxe/MmCommunication.inf
Normal file
@@ -0,0 +1,56 @@
|
||||
#/** @file
|
||||
#
|
||||
# DXE MM Communicate driver
|
||||
#
|
||||
# Copyright (c) 2016 - 2018, ARM Limited. All rights reserved.
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#
|
||||
#**/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x0001001A
|
||||
BASE_NAME = ArmMmCommunication
|
||||
FILE_GUID = 09EE81D3-F15E-43F4-85B4-CB9873DA5D6B
|
||||
MODULE_TYPE = DXE_RUNTIME_DRIVER
|
||||
VERSION_STRING = 1.0
|
||||
ENTRY_POINT = MmCommunicationInitialize
|
||||
|
||||
#
|
||||
# The following is for reference only and not required by
|
||||
# build tools
|
||||
#
|
||||
# VALID_ARCHITECTURES = AARCH64
|
||||
#
|
||||
|
||||
[Sources.AARCH64]
|
||||
MmCommunication.c
|
||||
|
||||
[Packages]
|
||||
ArmPkg/ArmPkg.dec
|
||||
MdePkg/MdePkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
ArmLib
|
||||
ArmSmcLib
|
||||
BaseMemoryLib
|
||||
DebugLib
|
||||
DxeServicesTableLib
|
||||
HobLib
|
||||
UefiDriverEntryPoint
|
||||
|
||||
[Protocols]
|
||||
gEfiMmCommunicationProtocolGuid ## PRODUCES
|
||||
|
||||
[Pcd.common]
|
||||
gArmTokenSpaceGuid.PcdMmBufferBase
|
||||
gArmTokenSpaceGuid.PcdMmBufferSize
|
||||
|
||||
[Depex]
|
||||
gEfiCpuArchProtocolGuid
|
@@ -306,12 +306,13 @@ TimerInterruptHandler (
|
||||
//
|
||||
OriginalTPL = gBS->RaiseTPL (TPL_HIGH_LEVEL);
|
||||
|
||||
// Signal end of interrupt early to help avoid losing subsequent ticks
|
||||
// from long duration handlers
|
||||
gInterrupt->EndOfInterrupt (gInterrupt, Source);
|
||||
|
||||
// Check if the timer interrupt is active
|
||||
if ((ArmGenericTimerGetTimerCtrlReg () ) & ARM_ARCH_TIMER_ISTATUS) {
|
||||
|
||||
// Signal end of interrupt early to help avoid losing subsequent ticks from long duration handlers
|
||||
gInterrupt->EndOfInterrupt (gInterrupt, Source);
|
||||
|
||||
if (mTimerNotifyFunction) {
|
||||
mTimerNotifyFunction (mTimerPeriod * mElapsedPeriod);
|
||||
}
|
||||
@@ -336,12 +337,10 @@ TimerInterruptHandler (
|
||||
|
||||
// Set next compare value
|
||||
ArmGenericTimerSetCompareVal (CompareValue);
|
||||
ArmGenericTimerEnableTimer ();
|
||||
ArmGenericTimerReenableTimer ();
|
||||
ArmInstructionSynchronizationBarrier ();
|
||||
}
|
||||
|
||||
// Enable timer interrupts
|
||||
gInterrupt->EnableInterruptSource (gInterrupt, Source);
|
||||
|
||||
gBS->RestoreTPL (OriginalTPL);
|
||||
}
|
||||
|
||||
|
@@ -20,7 +20,7 @@
|
||||
* delegated events and request the Secure partition manager to perform
|
||||
* privileged operations on its behalf.
|
||||
*/
|
||||
#define ARM_SVC_ID_SPM_VERSION_AARCH64 0xC4000060
|
||||
#define ARM_SVC_ID_SPM_VERSION_AARCH32 0x84000060
|
||||
#define ARM_SVC_ID_SP_EVENT_COMPLETE_AARCH64 0xC4000061
|
||||
#define ARM_SVC_ID_SP_GET_MEM_ATTRIBUTES_AARCH64 0xC4000064
|
||||
#define ARM_SVC_ID_SP_SET_MEM_ATTRIBUTES_AARCH64 0xC4000065
|
||||
@@ -40,4 +40,11 @@
|
||||
((((c_perm) & SET_MEM_ATTR_CODE_PERM_MASK) << SET_MEM_ATTR_CODE_PERM_SHIFT) | \
|
||||
(( (d_perm) & SET_MEM_ATTR_DATA_PERM_MASK) << SET_MEM_ATTR_DATA_PERM_SHIFT))
|
||||
|
||||
/* MM SVC Return error codes */
|
||||
#define ARM_SVC_SPM_RET_SUCCESS 0
|
||||
#define ARM_SVC_SPM_RET_NOT_SUPPORTED -1
|
||||
#define ARM_SVC_SPM_RET_INVALID_PARAMS -2
|
||||
#define ARM_SVC_SPM_RET_DENIED -3
|
||||
#define ARM_SVC_SPM_RET_NO_MEMORY -5
|
||||
|
||||
#endif
|
||||
|
@@ -111,4 +111,12 @@
|
||||
#define ARM_SMC_ID_PSCI_AFFINITY_INFO_OFF 1
|
||||
#define ARM_SMC_ID_PSCI_AFFINITY_INFO_ON_PENDING 2
|
||||
|
||||
/*
|
||||
* SMC function IDs for Trusted OS Service queries
|
||||
*/
|
||||
#define ARM_SMC_ID_TOS_CALL_COUNT 0xbf00ff00
|
||||
#define ARM_SMC_ID_TOS_UID 0xbf00ff01
|
||||
/* 0xbf00ff02 is reserved */
|
||||
#define ARM_SMC_ID_TOS_REVISION 0xbf00ff03
|
||||
|
||||
#endif
|
||||
|
@@ -22,6 +22,12 @@ ArmGenericTimerEnableTimer (
|
||||
VOID
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ArmGenericTimerReenableTimer (
|
||||
VOID
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ArmGenericTimerDisableTimer (
|
||||
|
@@ -1,6 +1,6 @@
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2011-2017, ARM Limited. All rights reserved.
|
||||
* Copyright (c) 2011-2018, ARM Limited. All rights reserved.
|
||||
*
|
||||
* This program and the accompanying materials
|
||||
* are licensed and made available under the terms and conditions of the BSD License
|
||||
@@ -62,10 +62,26 @@
|
||||
// GIC Redistributor
|
||||
#define ARM_GICR_CTLR_FRAME_SIZE SIZE_64KB
|
||||
#define ARM_GICR_SGI_PPI_FRAME_SIZE SIZE_64KB
|
||||
#define ARM_GICR_SGI_VLPI_FRAME_SIZE SIZE_64KB
|
||||
#define ARM_GICR_SGI_RESERVED_FRAME_SIZE SIZE_64KB
|
||||
|
||||
// GIC Redistributor Control frame
|
||||
#define ARM_GICR_TYPER 0x0008 // Redistributor Type Register
|
||||
|
||||
// GIC Redistributor TYPER bit assignments
|
||||
#define ARM_GICR_TYPER_PLPIS (1 << 0) // Physical LPIs
|
||||
#define ARM_GICR_TYPER_VLPIS (1 << 1) // Virtual LPIs
|
||||
#define ARM_GICR_TYPER_DIRECTLPI (1 << 3) // Direct LPIs
|
||||
#define ARM_GICR_TYPER_LAST (1 << 4) // Last Redistributor in series
|
||||
#define ARM_GICR_TYPER_DPGS (1 << 5) // Disable Processor Group
|
||||
// Selection Support
|
||||
#define ARM_GICR_TYPER_PROCNO (0xFFFF << 8) // Processor Number
|
||||
#define ARM_GICR_TYPER_COMMONLPIAFF (0x3 << 24) // Common LPI Affinity
|
||||
#define ARM_GICR_TYPER_AFFINITY (0xFFFFFFFFULL << 32) // Redistributor Affinity
|
||||
|
||||
#define ARM_GICR_TYPER_GET_AFFINITY(TypeReg) (((TypeReg) & \
|
||||
ARM_GICR_TYPER_AFFINITY) >> 32)
|
||||
|
||||
// GIC SGI & PPI Redistributor frame
|
||||
#define ARM_GICR_ISENABLER 0x0100 // Interrupt Set-Enable Registers
|
||||
#define ARM_GICR_ICENABLER 0x0180 // Interrupt Clear-Enable Registers
|
||||
|
@@ -558,6 +558,12 @@ ArmReadSctlr (
|
||||
VOID
|
||||
);
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ArmWriteSctlr (
|
||||
IN UINT32 Value
|
||||
);
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
ArmReadHVBar (
|
||||
@@ -727,4 +733,10 @@ ArmWriteCntvOff (
|
||||
UINT64 Val
|
||||
);
|
||||
|
||||
UINTN
|
||||
EFIAPI
|
||||
ArmGetPhysicalAddressBits (
|
||||
VOID
|
||||
);
|
||||
|
||||
#endif // __ARM_LIB__
|
||||
|
137
ArmPkg/Include/Library/ArmMtlLib.h
Normal file
137
ArmPkg/Include/Library/ArmMtlLib.h
Normal file
@@ -0,0 +1,137 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#ifndef ARM_MTL_LIB_H_
|
||||
#define ARM_MTL_LIB_H_
|
||||
|
||||
#include <Uefi/UefiBaseType.h>
|
||||
|
||||
// Ideally we don't need packed struct. However we can't rely on compilers.
|
||||
#pragma pack(1)
|
||||
|
||||
typedef struct {
|
||||
UINT32 Reserved1;
|
||||
UINT32 ChannelStatus;
|
||||
UINT64 Reserved2;
|
||||
UINT32 Flags;
|
||||
UINT32 Length;
|
||||
UINT32 MessageHeader;
|
||||
|
||||
// NOTE: Since EDK2 does not allow flexible array member [] we declare
|
||||
// here array of 1 element length. However below is used as a variable
|
||||
// length array.
|
||||
UINT32 Payload[1]; // size less object gives offset to payload.
|
||||
} MTL_MAILBOX;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
// Channel Type, Low-priority, and High-priority
|
||||
typedef enum {
|
||||
MTL_CHANNEL_TYPE_LOW = 0,
|
||||
MTL_CHANNEL_TYPE_HIGH = 1
|
||||
} MTL_CHANNEL_TYPE;
|
||||
|
||||
typedef struct {
|
||||
UINT64 PhysicalAddress;
|
||||
UINT32 ModifyMask;
|
||||
UINT32 PreserveMask;
|
||||
} MTL_DOORBELL;
|
||||
|
||||
typedef struct {
|
||||
MTL_CHANNEL_TYPE ChannelType;
|
||||
MTL_MAILBOX * CONST MailBox;
|
||||
MTL_DOORBELL DoorBell;
|
||||
} MTL_CHANNEL;
|
||||
|
||||
/** Wait until channel is free.
|
||||
|
||||
@param[in] Channel Pointer to a channel.
|
||||
@param[in] TimeOutInMicroSeconds Time out in micro seconds.
|
||||
|
||||
@retval EFI_SUCCESS Channel is free.
|
||||
@retval EFI_TIMEOUT Time out error.
|
||||
**/
|
||||
EFI_STATUS
|
||||
MtlWaitUntilChannelFree (
|
||||
IN MTL_CHANNEL *Channel,
|
||||
IN UINTN TimeOutInMicroSeconds
|
||||
);
|
||||
|
||||
/** Return the address of the message payload.
|
||||
|
||||
@param[in] Channel Pointer to a channel.
|
||||
|
||||
@retval UINT32* Pointer to the payload.
|
||||
**/
|
||||
UINT32*
|
||||
MtlGetChannelPayload (
|
||||
IN MTL_CHANNEL *Channel
|
||||
);
|
||||
|
||||
/** Return pointer to a channel for the requested channel type.
|
||||
|
||||
@param[in] ChannelType ChannelType, Low or High priority channel.
|
||||
MTL_CHANNEL_TYPE_LOW or
|
||||
MTL_CHANNEL_TYPE_HIGH
|
||||
|
||||
@param[out] Channel Holds pointer to the channel.
|
||||
|
||||
@retval EFI_SUCCESS Pointer to channel is returned.
|
||||
@retval EFI_UNSUPPORTED Requested channel type not supported.
|
||||
**/
|
||||
EFI_STATUS
|
||||
MtlGetChannel (
|
||||
IN MTL_CHANNEL_TYPE ChannelType,
|
||||
OUT MTL_CHANNEL **Channel
|
||||
);
|
||||
|
||||
/** Mark the channel busy and ring the doorbell.
|
||||
|
||||
@param[in] Channel Pointer to a channel.
|
||||
@param[in] MessageHeader Message header.
|
||||
|
||||
@param[out] PayloadLength Message length.
|
||||
|
||||
@retval EFI_SUCCESS Message sent successfully.
|
||||
@retval EFI_DEVICE_ERROR Channel is busy.
|
||||
**/
|
||||
EFI_STATUS
|
||||
MtlSendMessage (
|
||||
IN MTL_CHANNEL *Channel,
|
||||
IN UINT32 MessageHeader,
|
||||
OUT UINT32 PayloadLength
|
||||
);
|
||||
|
||||
/** Wait for a response on a channel.
|
||||
|
||||
If channel is free after sending message, it implies SCP responded
|
||||
with a response on the channel.
|
||||
|
||||
@param[in] Channel Pointer to a channel.
|
||||
|
||||
@retval EFI_SUCCESS Message received successfully.
|
||||
@retval EFI_TIMEOUT Time out error.
|
||||
**/
|
||||
EFI_STATUS
|
||||
MtlReceiveMessage (
|
||||
IN MTL_CHANNEL *Channel,
|
||||
OUT UINT32 *MessageHeader,
|
||||
OUT UINT32 *PayloadLength
|
||||
);
|
||||
|
||||
#endif /* ARM_MTL_LIB_H_ */
|
||||
|
@@ -1,212 +0,0 @@
|
||||
/** @file
|
||||
*
|
||||
* Copyright (c) 2013-2015, ARM Limited. All rights reserved.
|
||||
*
|
||||
* This program and the accompanying materials
|
||||
* are licensed and made available under the terms and conditions of the BSD License
|
||||
* which accompanies this distribution. The full text of the license may be found at
|
||||
* http://opensource.org/licenses/bsd-license.php
|
||||
*
|
||||
* THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
*
|
||||
**/
|
||||
|
||||
#ifndef __BDS_ENTRY_H__
|
||||
#define __BDS_ENTRY_H__
|
||||
|
||||
#define IS_DEVICE_PATH_NODE(node,type,subtype) \
|
||||
(((node)->Type == (type)) && ((node)->SubType == (subtype)))
|
||||
|
||||
/**
|
||||
This is defined by the UEFI specs, don't change it
|
||||
**/
|
||||
typedef struct {
|
||||
UINT16 LoadOptionIndex;
|
||||
EFI_LOAD_OPTION *LoadOption;
|
||||
UINTN LoadOptionSize;
|
||||
|
||||
UINT32 Attributes;
|
||||
UINT16 FilePathListLength;
|
||||
CHAR16 *Description;
|
||||
EFI_DEVICE_PATH_PROTOCOL *FilePathList;
|
||||
|
||||
VOID* OptionalData;
|
||||
UINTN OptionalDataSize;
|
||||
} BDS_LOAD_OPTION;
|
||||
|
||||
/**
|
||||
Connect a Device Path and return the handle of the driver that support this DevicePath
|
||||
|
||||
@param DevicePath Device Path of the File to connect
|
||||
@param Handle Handle of the driver that support this DevicePath
|
||||
@param RemainingDevicePath Remaining DevicePath nodes that do not match the driver DevicePath
|
||||
|
||||
@retval EFI_SUCCESS A driver that matches the Device Path has been found
|
||||
@retval EFI_NOT_FOUND No handles match the search.
|
||||
@retval EFI_INVALID_PARAMETER DevicePath or Handle is NULL
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
BdsConnectDevicePath (
|
||||
IN EFI_DEVICE_PATH_PROTOCOL* DevicePath,
|
||||
OUT EFI_HANDLE *Handle,
|
||||
OUT EFI_DEVICE_PATH_PROTOCOL **RemainingDevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
Connect all DXE drivers
|
||||
|
||||
@retval EFI_SUCCESS All drivers have been connected
|
||||
@retval EFI_NOT_FOUND No handles match the search.
|
||||
@retval EFI_OUT_OF_RESOURCES There is not resource pool memory to store the matching results.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
BdsConnectAllDrivers (
|
||||
VOID
|
||||
);
|
||||
|
||||
/**
|
||||
Return the value of a global variable defined by its VariableName.
|
||||
The variable must be defined with the VendorGuid gEfiGlobalVariableGuid.
|
||||
|
||||
@param VariableName A Null-terminated string that is the name of the vendor's
|
||||
variable.
|
||||
@param DefaultValue Value returned by the function if the variable does not exist
|
||||
@param DataSize On input, the size in bytes of the return Data buffer.
|
||||
On output the size of data returned in Data.
|
||||
@param Value Value read from the UEFI Variable or copy of the default value
|
||||
if the UEFI Variable does not exist
|
||||
|
||||
@retval EFI_SUCCESS All drivers have been connected
|
||||
@retval EFI_NOT_FOUND No handles match the search.
|
||||
@retval EFI_OUT_OF_RESOURCES There is not resource pool memory to store the matching results.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
GetGlobalEnvironmentVariable (
|
||||
IN CONST CHAR16* VariableName,
|
||||
IN VOID* DefaultValue,
|
||||
IN OUT UINTN* Size,
|
||||
OUT VOID** Value
|
||||
);
|
||||
|
||||
/**
|
||||
Return the value of the variable defined by its VariableName and VendorGuid
|
||||
|
||||
@param VariableName A Null-terminated string that is the name of the vendor's
|
||||
variable.
|
||||
@param VendorGuid A unique identifier for the vendor.
|
||||
@param DefaultValue Value returned by the function if the variable does not exist
|
||||
@param DataSize On input, the size in bytes of the return Data buffer.
|
||||
On output the size of data returned in Data.
|
||||
@param Value Value read from the UEFI Variable or copy of the default value
|
||||
if the UEFI Variable does not exist
|
||||
|
||||
@retval EFI_SUCCESS All drivers have been connected
|
||||
@retval EFI_NOT_FOUND No handles match the search.
|
||||
@retval EFI_OUT_OF_RESOURCES There is not resource pool memory to store the matching results.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
GetEnvironmentVariable (
|
||||
IN CONST CHAR16* VariableName,
|
||||
IN EFI_GUID* VendorGuid,
|
||||
IN VOID* DefaultValue,
|
||||
IN OUT UINTN* Size,
|
||||
OUT VOID** Value
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
BootOptionFromLoadOptionIndex (
|
||||
IN UINT16 LoadOptionIndex,
|
||||
OUT BDS_LOAD_OPTION** BdsLoadOption
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
BootOptionFromLoadOptionVariable (
|
||||
IN CHAR16* BootVariableName,
|
||||
OUT BDS_LOAD_OPTION** BdsLoadOption
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
BootOptionToLoadOptionVariable (
|
||||
IN BDS_LOAD_OPTION* BdsLoadOption
|
||||
);
|
||||
|
||||
UINT16
|
||||
BootOptionAllocateBootIndex (
|
||||
VOID
|
||||
);
|
||||
|
||||
/**
|
||||
Start an EFI Application from a Device Path
|
||||
|
||||
@param ParentImageHandle Handle of the calling image
|
||||
@param DevicePath Location of the EFI Application
|
||||
|
||||
@retval EFI_SUCCESS All drivers have been connected
|
||||
@retval EFI_NOT_FOUND The Linux kernel Device Path has not been found
|
||||
@retval EFI_OUT_OF_RESOURCES There is not enough resource memory to store the matching results.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
BdsStartEfiApplication (
|
||||
IN EFI_HANDLE ParentImageHandle,
|
||||
IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
|
||||
IN UINTN LoadOptionsSize,
|
||||
IN VOID* LoadOptions
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
BdsLoadImage (
|
||||
IN EFI_DEVICE_PATH *DevicePath,
|
||||
IN EFI_ALLOCATE_TYPE Type,
|
||||
IN OUT EFI_PHYSICAL_ADDRESS* Image,
|
||||
OUT UINTN *FileSize
|
||||
);
|
||||
|
||||
/**
|
||||
* Call BS.ExitBootServices with the appropriate Memory Map information
|
||||
*/
|
||||
EFI_STATUS
|
||||
ShutdownUefiBootServices (
|
||||
VOID
|
||||
);
|
||||
|
||||
/**
|
||||
Locate an EFI application in a the Firmware Volumes by its name
|
||||
|
||||
@param EfiAppGuid Guid of the EFI Application into the Firmware Volume
|
||||
@param DevicePath EFI Device Path of the EFI application
|
||||
|
||||
@return EFI_SUCCESS The function completed successfully.
|
||||
@return EFI_NOT_FOUND The protocol could not be located.
|
||||
@return EFI_OUT_OF_RESOURCES There are not enough resources to find the protocol.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LocateEfiApplicationInFvByName (
|
||||
IN CONST CHAR16* EfiAppName,
|
||||
OUT EFI_DEVICE_PATH **DevicePath
|
||||
);
|
||||
|
||||
/**
|
||||
Locate an EFI application in a the Firmware Volumes by its GUID
|
||||
|
||||
@param EfiAppGuid Guid of the EFI Application into the Firmware Volume
|
||||
@param DevicePath EFI Device Path of the EFI application
|
||||
|
||||
@return EFI_SUCCESS The function completed successfully.
|
||||
@return EFI_NOT_FOUND The protocol could not be located.
|
||||
@return EFI_OUT_OF_RESOURCES There are not enough resources to find the protocol.
|
||||
|
||||
**/
|
||||
EFI_STATUS
|
||||
LocateEfiApplicationInFvByGuid (
|
||||
IN CONST EFI_GUID *EfiAppGuid,
|
||||
OUT EFI_DEVICE_PATH **DevicePath
|
||||
);
|
||||
|
||||
#endif
|
123
ArmPkg/Include/Library/OpteeLib.h
Normal file
123
ArmPkg/Include/Library/OpteeLib.h
Normal file
@@ -0,0 +1,123 @@
|
||||
/** @file
|
||||
OP-TEE specific header file.
|
||||
|
||||
Copyright (c) 2018, Linaro Ltd. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef _OPTEE_H_
|
||||
#define _OPTEE_H_
|
||||
|
||||
/*
|
||||
* The 'Trusted OS Call UID' is supposed to return the following UUID for
|
||||
* OP-TEE OS. This is a 128-bit value.
|
||||
*/
|
||||
#define OPTEE_OS_UID0 0x384fb3e0
|
||||
#define OPTEE_OS_UID1 0xe7f811e3
|
||||
#define OPTEE_OS_UID2 0xaf630002
|
||||
#define OPTEE_OS_UID3 0xa5d5c51b
|
||||
|
||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_NONE 0x0
|
||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INPUT 0x1
|
||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_OUTPUT 0x2
|
||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_VALUE_INOUT 0x3
|
||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INPUT 0x9
|
||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_OUTPUT 0xa
|
||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MEMORY_INOUT 0xb
|
||||
|
||||
#define OPTEE_MESSAGE_ATTRIBUTE_TYPE_MASK 0xff
|
||||
|
||||
#define OPTEE_SUCCESS 0x00000000
|
||||
#define OPTEE_ORIGIN_COMMUNICATION 0x00000002
|
||||
#define OPTEE_ERROR_COMMUNICATION 0xFFFF000E
|
||||
|
||||
typedef struct {
|
||||
UINT64 BufferAddress;
|
||||
UINT64 Size;
|
||||
UINT64 SharedMemoryReference;
|
||||
} OPTEE_MESSAGE_PARAM_MEMORY;
|
||||
|
||||
typedef struct {
|
||||
UINT64 A;
|
||||
UINT64 B;
|
||||
UINT64 C;
|
||||
} OPTEE_MESSAGE_PARAM_VALUE;
|
||||
|
||||
typedef struct {
|
||||
UINT64 Attribute;
|
||||
union {
|
||||
OPTEE_MESSAGE_PARAM_MEMORY Memory;
|
||||
OPTEE_MESSAGE_PARAM_VALUE Value;
|
||||
} Union;
|
||||
} OPTEE_MESSAGE_PARAM;
|
||||
|
||||
#define OPTEE_MAX_CALL_PARAMS 4
|
||||
|
||||
typedef struct {
|
||||
UINT32 Command;
|
||||
UINT32 Function;
|
||||
UINT32 Session;
|
||||
UINT32 CancelId;
|
||||
UINT32 Pad;
|
||||
UINT32 Return;
|
||||
UINT32 ReturnOrigin;
|
||||
UINT32 NumParams;
|
||||
|
||||
// NumParams tells the actual number of element in Params
|
||||
OPTEE_MESSAGE_PARAM Params[OPTEE_MAX_CALL_PARAMS];
|
||||
} OPTEE_MESSAGE_ARG;
|
||||
|
||||
typedef struct {
|
||||
EFI_GUID Uuid; // [in] GUID/UUID of the Trusted Application
|
||||
UINT32 Session; // [out] Session id
|
||||
UINT32 Return; // [out] Return value
|
||||
UINT32 ReturnOrigin; // [out] Origin of the return value
|
||||
} OPTEE_OPEN_SESSION_ARG;
|
||||
|
||||
typedef struct {
|
||||
UINT32 Function; // [in] Trusted Application function, specific to the TA
|
||||
UINT32 Session; // [in] Session id
|
||||
UINT32 Return; // [out] Return value
|
||||
UINT32 ReturnOrigin; // [out] Origin of the return value
|
||||
OPTEE_MESSAGE_PARAM Params[OPTEE_MAX_CALL_PARAMS]; // Params for function to be invoked
|
||||
} OPTEE_INVOKE_FUNCTION_ARG;
|
||||
|
||||
BOOLEAN
|
||||
EFIAPI
|
||||
IsOpteePresent (
|
||||
VOID
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
OpteeInit (
|
||||
VOID
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
OpteeOpenSession (
|
||||
IN OUT OPTEE_OPEN_SESSION_ARG *OpenSessionArg
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
OpteeCloseSession (
|
||||
IN UINT32 Session
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
EFIAPI
|
||||
OpteeInvokeFunction (
|
||||
IN OUT OPTEE_INVOKE_FUNCTION_ARG *InvokeFunctionArg
|
||||
);
|
||||
|
||||
#endif
|
42
ArmPkg/Include/Library/StandaloneMmMmuLib.h
Normal file
42
ArmPkg/Include/Library/StandaloneMmMmuLib.h
Normal file
@@ -0,0 +1,42 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2018, ARM Ltd. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#ifndef __STANDALONEMM_MMU_LIB__
|
||||
#define __STANDALONEMM_MMU_LIB__
|
||||
|
||||
EFI_STATUS
|
||||
ArmSetMemoryRegionNoExec (
|
||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||
IN UINT64 Length
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
ArmClearMemoryRegionNoExec (
|
||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||
IN UINT64 Length
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
ArmSetMemoryRegionReadOnly (
|
||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||
IN UINT64 Length
|
||||
);
|
||||
|
||||
EFI_STATUS
|
||||
ArmClearMemoryRegionReadOnly (
|
||||
IN EFI_PHYSICAL_ADDRESS BaseAddress,
|
||||
IN UINT64 Length
|
||||
);
|
||||
|
||||
#endif /* __STANDALONEMM_MMU_LIB__ */
|
27
ArmPkg/Include/Protocol/ArmScmi.h
Normal file
27
ArmPkg/Include/Protocol/ArmScmi.h
Normal file
@@ -0,0 +1,27 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#ifndef ARM_SCMI_H_
|
||||
#define ARM_SCMI_H_
|
||||
|
||||
/* As per SCMI specification, maximum allowed ASCII string length
|
||||
for various return values/parameters of a SCMI message.
|
||||
*/
|
||||
#define SCMI_MAX_STR_LEN 16
|
||||
|
||||
#endif /* ARM_SCMI_H_ */
|
||||
|
174
ArmPkg/Include/Protocol/ArmScmiBaseProtocol.h
Normal file
174
ArmPkg/Include/Protocol/ArmScmiBaseProtocol.h
Normal file
@@ -0,0 +1,174 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#ifndef ARM_SCMI_BASE_PROTOCOL_H_
|
||||
#define ARM_SCMI_BASE_PROTOCOL_H_
|
||||
|
||||
#include <Protocol/ArmScmi.h>
|
||||
|
||||
#define BASE_PROTOCOL_VERSION 0x10000
|
||||
|
||||
#define NUM_PROTOCOL_MASK 0xFFU
|
||||
#define NUM_AGENT_MASK 0xFFU
|
||||
|
||||
#define NUM_AGENT_SHIFT 0x8
|
||||
|
||||
/** Returns total number of protocols that are
|
||||
implemented (excluding the Base protocol)
|
||||
*/
|
||||
#define SCMI_TOTAL_PROTOCOLS(Attr) (Attr & NUM_PROTOCOL_MASK)
|
||||
|
||||
// Returns total number of agents in the system.
|
||||
#define SCMI_TOTAL_AGENTS(Attr) ((Attr >> NUM_AGENT_SHIFT) & NUM_AGENT_MASK)
|
||||
|
||||
#define ARM_SCMI_BASE_PROTOCOL_GUID { \
|
||||
0xd7e5abe9, 0x33ab, 0x418e, {0x9f, 0x91, 0x72, 0xda, 0xe2, 0xba, 0x8e, 0x2f} \
|
||||
}
|
||||
|
||||
extern EFI_GUID gArmScmiBaseProtocolGuid;
|
||||
|
||||
typedef struct _SCMI_BASE_PROTOCOL SCMI_BASE_PROTOCOL;
|
||||
|
||||
/** Return version of the Base protocol supported by SCP firmware.
|
||||
|
||||
@param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.
|
||||
|
||||
@param[out] Version Version of the supported SCMI Base protocol.
|
||||
|
||||
@retval EFI_SUCCESS The version of the protocol is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_BASE_GET_VERSION) (
|
||||
IN SCMI_BASE_PROTOCOL *This,
|
||||
OUT UINT32 *Version
|
||||
);
|
||||
|
||||
/** Return total number of SCMI protocols supported by the SCP firmware.
|
||||
|
||||
@param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.
|
||||
|
||||
@param[out] TotalProtocols Total number of SCMI protocols supported.
|
||||
|
||||
@retval EFI_SUCCESS Total number of protocols supported are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns a SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_BASE_GET_TOTAL_PROTOCOLS) (
|
||||
IN SCMI_BASE_PROTOCOL *This,
|
||||
OUT UINT32 *TotalProtocols
|
||||
);
|
||||
|
||||
/** Return vendor name.
|
||||
|
||||
@param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.
|
||||
|
||||
@param[out] VendorIdentifier Null terminated ASCII string of up to
|
||||
16 bytes with a vendor name.
|
||||
|
||||
@retval EFI_SUCCESS VendorIdentifier is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns a SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_BASE_DISCOVER_VENDOR) (
|
||||
IN SCMI_BASE_PROTOCOL *This,
|
||||
OUT UINT8 VendorIdentifier[SCMI_MAX_STR_LEN]
|
||||
);
|
||||
|
||||
/** Return sub vendor name.
|
||||
|
||||
@param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.
|
||||
|
||||
@param[out] VendorIdentifier Null terminated ASCII string of up to
|
||||
16 bytes with a vendor name.
|
||||
|
||||
@retval EFI_SUCCESS VendorIdentifier is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns a SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_BASE_DISCOVER_SUB_VENDOR) (
|
||||
IN SCMI_BASE_PROTOCOL *This,
|
||||
OUT UINT8 VendorIdentifier[SCMI_MAX_STR_LEN]
|
||||
);
|
||||
|
||||
/** Return implementation version.
|
||||
|
||||
@param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.
|
||||
|
||||
@param[out] ImplementationVersion Vendor specific implementation version.
|
||||
|
||||
@retval EFI_SUCCESS Implementation version is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns a SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_BASE_DISCOVER_IMPLEMENTATION_VERSION) (
|
||||
IN SCMI_BASE_PROTOCOL *This,
|
||||
OUT UINT32 *ImplementationVersion
|
||||
);
|
||||
|
||||
/** Return list of protocols.
|
||||
|
||||
@param[in] This A Pointer to SCMI_BASE_PROTOCOL Instance.
|
||||
|
||||
@param[out] ProtocolListSize Size of the ProtocolList.
|
||||
|
||||
@param[out] ProtocolList Protocol list.
|
||||
|
||||
@retval EFI_SUCCESS List of protocols is returned.
|
||||
@retval EFI_BUFFER_TOO_SMALL ProtocolListSize is too small for the result.
|
||||
It has been updated to the size needed.
|
||||
@retval EFI_DEVICE_ERROR SCP returns a SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_BASE_DISCOVER_LIST_PROTOCOLS) (
|
||||
IN SCMI_BASE_PROTOCOL *This,
|
||||
IN OUT UINT32 *ProtocolListSize,
|
||||
OUT UINT8 *ProtocolList
|
||||
);
|
||||
|
||||
// Base protocol.
|
||||
typedef struct _SCMI_BASE_PROTOCOL {
|
||||
SCMI_BASE_GET_VERSION GetVersion;
|
||||
SCMI_BASE_GET_TOTAL_PROTOCOLS GetTotalProtocols;
|
||||
SCMI_BASE_DISCOVER_VENDOR DiscoverVendor;
|
||||
SCMI_BASE_DISCOVER_SUB_VENDOR DiscoverSubVendor;
|
||||
SCMI_BASE_DISCOVER_IMPLEMENTATION_VERSION DiscoverImplementationVersion;
|
||||
SCMI_BASE_DISCOVER_LIST_PROTOCOLS DiscoverListProtocols;
|
||||
} SCMI_BASE_PROTOCOL;
|
||||
|
||||
// SCMI Message IDs for Base protocol.
|
||||
typedef enum {
|
||||
SCMI_MESSAGE_ID_BASE_DISCOVER_VENDOR = 0x3,
|
||||
SCMI_MESSAGE_ID_BASE_DISCOVER_SUB_VENDOR = 0x4,
|
||||
SCMI_MESSAGE_ID_BASE_DISCOVER_IMPLEMENTATION_VERSION = 0x5,
|
||||
SCMI_MESSAGE_ID_BASE_DISCOVER_LIST_PROTOCOLS = 0x6
|
||||
} SCMI_MESSAGE_ID_BASE;
|
||||
|
||||
#endif /* ARM_SCMI_BASE_PROTOCOL_H_ */
|
||||
|
197
ArmPkg/Include/Protocol/ArmScmiClock2Protocol.h
Normal file
197
ArmPkg/Include/Protocol/ArmScmiClock2Protocol.h
Normal file
@@ -0,0 +1,197 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#ifndef ARM_SCMI_CLOCK2_PROTOCOL_H_
|
||||
#define ARM_SCMI_CLOCK2_PROTOCOL_H_
|
||||
|
||||
#include <Protocol/ArmScmi.h>
|
||||
#include <Protocol/ArmScmiClockProtocol.h>
|
||||
|
||||
#define ARM_SCMI_CLOCK2_PROTOCOL_GUID { \
|
||||
0xb8d8caf2, 0x9e94, 0x462c, { 0xa8, 0x34, 0x6c, 0x99, 0xfc, 0x05, 0xef, 0xcf } \
|
||||
}
|
||||
|
||||
extern EFI_GUID gArmScmiClock2ProtocolGuid;
|
||||
|
||||
#define SCMI_CLOCK2_PROTOCOL_VERSION 1
|
||||
|
||||
typedef struct _SCMI_CLOCK2_PROTOCOL SCMI_CLOCK2_PROTOCOL;
|
||||
|
||||
// Protocol Interface functions.
|
||||
|
||||
/** Return version of the clock management protocol supported by SCP firmware.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK2_PROTOCOL Instance.
|
||||
|
||||
@param[out] Version Version of the supported SCMI Clock management protocol.
|
||||
|
||||
@retval EFI_SUCCESS The version is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_CLOCK2_GET_VERSION) (
|
||||
IN SCMI_CLOCK2_PROTOCOL *This,
|
||||
OUT UINT32 *Version
|
||||
);
|
||||
|
||||
/** Return total number of clock devices supported by the clock management
|
||||
protocol.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK2_PROTOCOL Instance.
|
||||
|
||||
@param[out] TotalClocks Total number of clocks supported.
|
||||
|
||||
@retval EFI_SUCCESS Total number of clocks supported is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_CLOCK2_GET_TOTAL_CLOCKS) (
|
||||
IN SCMI_CLOCK2_PROTOCOL *This,
|
||||
OUT UINT32 *TotalClocks
|
||||
);
|
||||
|
||||
/** Return attributes of a clock device.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK2_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
|
||||
@param[out] Enabled If TRUE, the clock device is enabled.
|
||||
@param[out] ClockAsciiName A NULL terminated ASCII string with the clock
|
||||
name, of up to 16 bytes.
|
||||
|
||||
@retval EFI_SUCCESS Clock device attributes are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES) (
|
||||
IN SCMI_CLOCK2_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
OUT BOOLEAN *Enabled,
|
||||
OUT CHAR8 *ClockAsciiName
|
||||
);
|
||||
|
||||
/** Return list of rates supported by a given clock device.
|
||||
|
||||
@param[in] This A pointer to SCMI_CLOCK2_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
|
||||
@param[out] Format SCMI_CLOCK_RATE_FORMAT_DISCRETE: Clock device
|
||||
supports range of clock rates which are non-linear.
|
||||
|
||||
SCMI_CLOCK_RATE_FORMAT_LINEAR: Clock device supports
|
||||
range of linear clock rates from Min to Max in steps.
|
||||
|
||||
@param[out] TotalRates Total number of rates.
|
||||
|
||||
@param[in,out] RateArraySize Size of the RateArray.
|
||||
|
||||
@param[out] RateArray List of clock rates.
|
||||
|
||||
@retval EFI_SUCCESS List of clock rates are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval EFI_BUFFER_TOO_SMALL RateArraySize is too small for the result.
|
||||
It has been updated to the size needed.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_CLOCK2_DESCRIBE_RATES) (
|
||||
IN SCMI_CLOCK2_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
OUT SCMI_CLOCK_RATE_FORMAT *Format,
|
||||
OUT UINT32 *TotalRates,
|
||||
IN OUT UINT32 *RateArraySize,
|
||||
OUT SCMI_CLOCK_RATE *RateArray
|
||||
);
|
||||
|
||||
/** Get clock rate.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK2_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
|
||||
@param[out] Rate Clock rate.
|
||||
|
||||
@retval EFI_SUCCESS Clock rate is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_CLOCK2_RATE_GET) (
|
||||
IN SCMI_CLOCK2_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
OUT UINT64 *Rate
|
||||
);
|
||||
|
||||
/** Set clock rate.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK2_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
@param[in] Rate Clock rate.
|
||||
|
||||
@retval EFI_SUCCESS Clock rate set success.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_CLOCK2_RATE_SET) (
|
||||
IN SCMI_CLOCK2_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
IN UINT64 Rate
|
||||
);
|
||||
|
||||
/** Enable/Disable specified clock.
|
||||
Function is only available under gArmScmiClock2ProtocolGuid
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK2_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
@param[in] Enable TRUE to enable, FALSE to disable.
|
||||
|
||||
@retval EFI_SUCCESS Clock enable/disable successful.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_CLOCK2_ENABLE) (
|
||||
IN SCMI_CLOCK2_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
IN BOOLEAN Enable
|
||||
);
|
||||
|
||||
typedef struct _SCMI_CLOCK2_PROTOCOL {
|
||||
SCMI_CLOCK2_GET_VERSION GetVersion;
|
||||
SCMI_CLOCK2_GET_TOTAL_CLOCKS GetTotalClocks;
|
||||
SCMI_CLOCK2_GET_CLOCK_ATTRIBUTES GetClockAttributes;
|
||||
SCMI_CLOCK2_DESCRIBE_RATES DescribeRates;
|
||||
SCMI_CLOCK2_RATE_GET RateGet;
|
||||
SCMI_CLOCK2_RATE_SET RateSet;
|
||||
|
||||
// Extension to original ClockProtocol, added here so SCMI_CLOCK2_PROTOCOL
|
||||
// can be cast to SCMI_CLOCK_PROTOCOL
|
||||
UINTN Version; // For future expandability
|
||||
SCMI_CLOCK2_ENABLE Enable;
|
||||
} SCMI_CLOCK2_PROTOCOL;
|
||||
|
||||
#endif /* ARM_SCMI_CLOCK2_PROTOCOL_H_ */
|
218
ArmPkg/Include/Protocol/ArmScmiClockProtocol.h
Normal file
218
ArmPkg/Include/Protocol/ArmScmiClockProtocol.h
Normal file
@@ -0,0 +1,218 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#ifndef ARM_SCMI_CLOCK_PROTOCOL_H_
|
||||
#define ARM_SCMI_CLOCK_PROTOCOL_H_
|
||||
|
||||
#include <Protocol/ArmScmi.h>
|
||||
|
||||
#define ARM_SCMI_CLOCK_PROTOCOL_GUID { \
|
||||
0x91ce67a8, 0xe0aa, 0x4012, {0xb9, 0x9f, 0xb6, 0xfc, 0xf3, 0x4, 0x8e, 0xaa} \
|
||||
}
|
||||
|
||||
extern EFI_GUID gArmScmiClockProtocolGuid;
|
||||
|
||||
// Message Type for clock management protocol.
|
||||
typedef enum {
|
||||
SCMI_MESSAGE_ID_CLOCK_ATTRIBUTES = 0x3,
|
||||
SCMI_MESSAGE_ID_CLOCK_DESCRIBE_RATES = 0x4,
|
||||
SCMI_MESSAGE_ID_CLOCK_RATE_SET = 0x5,
|
||||
SCMI_MESSAGE_ID_CLOCK_RATE_GET = 0x6,
|
||||
SCMI_MESSAGE_ID_CLOCK_CONFIG_SET = 0x7
|
||||
} SCMI_MESSAGE_ID_CLOCK;
|
||||
|
||||
typedef enum {
|
||||
SCMI_CLOCK_RATE_FORMAT_DISCRETE, // Non-linear range.
|
||||
SCMI_CLOCK_RATE_FORMAT_LINEAR // Linear range.
|
||||
} SCMI_CLOCK_RATE_FORMAT;
|
||||
|
||||
// Clock management protocol version.
|
||||
#define SCMI_CLOCK_PROTOCOL_VERSION 0x10000
|
||||
|
||||
#define SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_MASK 0xFFU
|
||||
#define SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_SHIFT 16
|
||||
#define SCMI_CLOCK_PROTOCOL_NUM_CLOCKS_MASK 0xFFFFU
|
||||
|
||||
/** Total number of pending asynchronous clock rates changes
|
||||
supported by the SCP, Attr Bits[23:16]
|
||||
*/
|
||||
#define SCMI_CLOCK_PROTOCOL_MAX_ASYNC_CLK_RATES(Attr) ( \
|
||||
(Attr >> SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_SHIFT) && \
|
||||
SCMI_CLOCK_PROTOCOL_PENDING_ASYNC_RATES_MASK)
|
||||
|
||||
// Total of clock devices supported by the SCP, Attr Bits[15:0]
|
||||
#define SCMI_CLOCK_PROTOCOL_TOTAL_CLKS(Attr) (Attr & SCMI_CLOCK_PROTOCOL_NUM_CLOCKS_MASK)
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
/* Depending on the format (linear/non-linear) supported by a clock device
|
||||
either Rate or Min/Max/Step triplet is valid.
|
||||
*/
|
||||
typedef struct {
|
||||
union {
|
||||
UINT64 Min;
|
||||
UINT64 Rate;
|
||||
};
|
||||
UINT64 Max;
|
||||
UINT64 Step;
|
||||
} SCMI_CLOCK_RATE;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
typedef struct _SCMI_CLOCK_PROTOCOL SCMI_CLOCK_PROTOCOL;
|
||||
|
||||
// Protocol Interface functions.
|
||||
|
||||
/** Return version of the clock management protocol supported by SCP firmware.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||
|
||||
@param[out] Version Version of the supported SCMI Clock management protocol.
|
||||
|
||||
@retval EFI_SUCCESS The version is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_CLOCK_GET_VERSION) (
|
||||
IN SCMI_CLOCK_PROTOCOL *This,
|
||||
OUT UINT32 *Version
|
||||
);
|
||||
|
||||
/** Return total number of clock devices supported by the clock management
|
||||
protocol.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||
|
||||
@param[out] TotalClocks Total number of clocks supported.
|
||||
|
||||
@retval EFI_SUCCESS Total number of clocks supported is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_CLOCK_GET_TOTAL_CLOCKS) (
|
||||
IN SCMI_CLOCK_PROTOCOL *This,
|
||||
OUT UINT32 *TotalClocks
|
||||
);
|
||||
|
||||
/** Return attributes of a clock device.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
|
||||
@param[out] Enabled If TRUE, the clock device is enabled.
|
||||
@param[out] ClockAsciiName A NULL terminated ASCII string with the clock
|
||||
name, of up to 16 bytes.
|
||||
|
||||
@retval EFI_SUCCESS Clock device attributes are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_CLOCK_GET_CLOCK_ATTRIBUTES) (
|
||||
IN SCMI_CLOCK_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
OUT BOOLEAN *Enabled,
|
||||
OUT CHAR8 *ClockAsciiName
|
||||
);
|
||||
|
||||
/** Return list of rates supported by a given clock device.
|
||||
|
||||
@param[in] This A pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
|
||||
@param[out] Format SCMI_CLOCK_RATE_FORMAT_DISCRETE: Clock device
|
||||
supports range of clock rates which are non-linear.
|
||||
|
||||
SCMI_CLOCK_RATE_FORMAT_LINEAR: Clock device supports
|
||||
range of linear clock rates from Min to Max in steps.
|
||||
|
||||
@param[out] TotalRates Total number of rates.
|
||||
|
||||
@param[in,out] RateArraySize Size of the RateArray.
|
||||
|
||||
@param[out] RateArray List of clock rates.
|
||||
|
||||
@retval EFI_SUCCESS List of clock rates are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval EFI_BUFFER_TOO_SMALL RateArraySize is too small for the result.
|
||||
It has been updated to the size needed.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_CLOCK_DESCRIBE_RATES) (
|
||||
IN SCMI_CLOCK_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
OUT SCMI_CLOCK_RATE_FORMAT *Format,
|
||||
OUT UINT32 *TotalRates,
|
||||
IN OUT UINT32 *RateArraySize,
|
||||
OUT SCMI_CLOCK_RATE *RateArray
|
||||
);
|
||||
|
||||
/** Get clock rate.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
|
||||
@param[out] Rate Clock rate.
|
||||
|
||||
@retval EFI_SUCCESS Clock rate is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_CLOCK_RATE_GET) (
|
||||
IN SCMI_CLOCK_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
OUT UINT64 *Rate
|
||||
);
|
||||
|
||||
/** Set clock rate.
|
||||
|
||||
@param[in] This A Pointer to SCMI_CLOCK_PROTOCOL Instance.
|
||||
@param[in] ClockId Identifier for the clock device.
|
||||
@param[in] Rate Clock rate.
|
||||
|
||||
@retval EFI_SUCCESS Clock rate set success.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_CLOCK_RATE_SET) (
|
||||
IN SCMI_CLOCK_PROTOCOL *This,
|
||||
IN UINT32 ClockId,
|
||||
IN UINT64 Rate
|
||||
);
|
||||
|
||||
typedef struct _SCMI_CLOCK_PROTOCOL {
|
||||
SCMI_CLOCK_GET_VERSION GetVersion;
|
||||
SCMI_CLOCK_GET_TOTAL_CLOCKS GetTotalClocks;
|
||||
SCMI_CLOCK_GET_CLOCK_ATTRIBUTES GetClockAttributes;
|
||||
SCMI_CLOCK_DESCRIBE_RATES DescribeRates;
|
||||
SCMI_CLOCK_RATE_GET RateGet;
|
||||
SCMI_CLOCK_RATE_SET RateSet;
|
||||
} SCMI_CLOCK_PROTOCOL;
|
||||
|
||||
#endif /* ARM_SCMI_CLOCK_PROTOCOL_H_ */
|
||||
|
265
ArmPkg/Include/Protocol/ArmScmiPerformanceProtocol.h
Normal file
265
ArmPkg/Include/Protocol/ArmScmiPerformanceProtocol.h
Normal file
@@ -0,0 +1,265 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#ifndef ARM_SCMI_PERFORMANCE_PROTOCOL_H_
|
||||
#define ARM_SCMI_PERFORMANCE_PROTOCOL_H_
|
||||
|
||||
#include <Protocol/ArmScmi.h>
|
||||
|
||||
#define PERFORMANCE_PROTOCOL_VERSION 0x10000
|
||||
|
||||
#define ARM_SCMI_PERFORMANCE_PROTOCOL_GUID { \
|
||||
0x9b8ba84, 0x3dd3, 0x49a6, {0xa0, 0x5a, 0x31, 0x34, 0xa5, 0xf0, 0x7b, 0xad} \
|
||||
}
|
||||
|
||||
extern EFI_GUID gArmScmiPerformanceProtocolGuid;
|
||||
|
||||
typedef struct _SCMI_PERFORMANCE_PROTOCOL SCMI_PERFORMANCE_PROTOCOL;
|
||||
|
||||
#pragma pack(1)
|
||||
|
||||
#define POWER_IN_MW_SHIFT 16
|
||||
#define POWER_IN_MW_MASK 0x1
|
||||
#define NUM_PERF_DOMAINS_MASK 0xFFFF
|
||||
|
||||
// Total number of performance domains, Attr Bits [15:0]
|
||||
#define SCMI_PERF_TOTAL_DOMAINS(Attr) (Attr & NUM_PERF_DOMAINS_MASK)
|
||||
|
||||
// A flag to express power values in mW or platform specific way, Attr Bit [16]
|
||||
#define SCMI_PERF_POWER_IN_MW(Attr) ((Attr >> POWER_IN_MW_SHIFT) & \
|
||||
POWER_IN_MW_MASK)
|
||||
|
||||
// Performance protocol attributes return values.
|
||||
typedef struct {
|
||||
UINT32 Attributes;
|
||||
UINT64 StatisticsAddress;
|
||||
UINT32 StatisticsLen;
|
||||
} SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES;
|
||||
|
||||
#define SCMI_PERF_SUPPORT_LVL_CHANGE_NOTIFY(Attr) ((Attr >> 28) & 0x1)
|
||||
#define SCMI_PERF_SUPPORT_LIM_CHANGE_NOTIFY(Attr) ((Attr >> 29) & 0x1)
|
||||
#define SCMI_PERF_SUPPORT_SET_LVL(Attr) ((Attr >> 30) & 0x1)
|
||||
#define SCMI_PERF_SUPPORT_SET_LIM(Attr) ((Attr >> 31) & 0x1)
|
||||
#define SCMI_PERF_RATE_LIMIT(RateLimit) (RateLimit & 0xFFF)
|
||||
|
||||
// Performance protocol domain attributes.
|
||||
typedef struct {
|
||||
UINT32 Attributes;
|
||||
UINT32 RateLimit;
|
||||
UINT32 SustainedFreq;
|
||||
UINT32 SustainedPerfLevel;
|
||||
UINT8 Name[SCMI_MAX_STR_LEN];
|
||||
} SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES;
|
||||
|
||||
// Worst case latency in microseconds, Bits[15:0]
|
||||
#define PERF_LATENCY_MASK 0xFFFF
|
||||
#define SCMI_PERFORMANCE_PROTOCOL_LATENCY(Latency) (Latency & PERF_LATENCY_MASK)
|
||||
|
||||
// Performance protocol performance level.
|
||||
typedef struct {
|
||||
UINT32 Level;
|
||||
UINT32 PowerCost;
|
||||
UINT32 Latency;
|
||||
} SCMI_PERFORMANCE_LEVEL;
|
||||
|
||||
// Performance protocol performance limit.
|
||||
typedef struct {
|
||||
UINT32 RangeMax;
|
||||
UINT32 RangeMin;
|
||||
} SCMI_PERFORMANCE_LIMITS;
|
||||
|
||||
#pragma pack()
|
||||
|
||||
/** Return version of the performance management protocol supported by SCP.
|
||||
firmware.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
|
||||
@param[out] Version Version of the supported SCMI performance management
|
||||
protocol.
|
||||
|
||||
@retval EFI_SUCCESS The version is returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_PERFORMANCE_GET_VERSION) (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
OUT UINT32 *Version
|
||||
);
|
||||
|
||||
/** Return protocol attributes of the performance management protocol.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
|
||||
@param[out] Attributes Protocol attributes.
|
||||
|
||||
@retval EFI_SUCCESS Protocol attributes are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_PERFORMANCE_GET_ATTRIBUTES) (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
OUT SCMI_PERFORMANCE_PROTOCOL_ATTRIBUTES *Attributes
|
||||
|
||||
);
|
||||
|
||||
/** Return performance domain attributes.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
@param[in] DomainId Identifier for the performance domain.
|
||||
|
||||
@param[out] Attributes Performance domain attributes.
|
||||
|
||||
@retval EFI_SUCCESS Domain attributes are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES) (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
IN UINT32 DomainId,
|
||||
OUT SCMI_PERFORMANCE_DOMAIN_ATTRIBUTES *DomainAttributes
|
||||
);
|
||||
|
||||
/** Return list of performance domain levels of a given domain.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
@param[in] DomainId Identifier for the performance domain.
|
||||
|
||||
@param[out] NumLevels Total number of levels a domain can support.
|
||||
|
||||
@param[in,out] LevelArraySize Size of the performance level array.
|
||||
|
||||
@param[out] LevelArray Array of the performance levels.
|
||||
|
||||
@retval EFI_SUCCESS Domain levels are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval EFI_BUFFER_TOO_SMALL LevelArraySize is too small for the result.
|
||||
It has been updated to the size needed.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_PERFORMANCE_DESCRIBE_LEVELS) (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
IN UINT32 DomainId,
|
||||
OUT UINT32 *NumLevels,
|
||||
IN OUT UINT32 *LevelArraySize,
|
||||
OUT SCMI_PERFORMANCE_LEVEL *LevelArray
|
||||
);
|
||||
|
||||
/** Set performance limits of a domain.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
@param[in] DomainId Identifier for the performance domain.
|
||||
@param[in] Limit Performance limit to set.
|
||||
|
||||
@retval EFI_SUCCESS Performance limits set successfully.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_PERFORMANCE_LIMITS_SET) (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
IN UINT32 DomainId,
|
||||
IN SCMI_PERFORMANCE_LIMITS *Limits
|
||||
);
|
||||
|
||||
/** Get performance limits of a domain.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
@param[in] DomainId Identifier for the performance domain.
|
||||
|
||||
@param[out] Limit Performance Limits of the domain.
|
||||
|
||||
@retval EFI_SUCCESS Performance limits are returned.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_PERFORMANCE_LIMITS_GET) (
|
||||
SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
UINT32 DomainId,
|
||||
SCMI_PERFORMANCE_LIMITS *Limits
|
||||
);
|
||||
|
||||
/** Set performance level of a domain.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
@param[in] DomainId Identifier for the performance domain.
|
||||
@param[in] Level Performance level of the domain.
|
||||
|
||||
@retval EFI_SUCCESS Performance level set successfully.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_PERFORMANCE_LEVEL_SET) (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
IN UINT32 DomainId,
|
||||
IN UINT32 Level
|
||||
);
|
||||
|
||||
/** Get performance level of a domain.
|
||||
|
||||
@param[in] This A Pointer to SCMI_PERFORMANCE_PROTOCOL Instance.
|
||||
@param[in] DomainId Identifier for the performance domain.
|
||||
|
||||
@param[out] Level Performance level of the domain.
|
||||
|
||||
@retval EFI_SUCCESS Performance level got successfully.
|
||||
@retval EFI_DEVICE_ERROR SCP returns an SCMI error.
|
||||
@retval !(EFI_SUCCESS) Other errors.
|
||||
**/
|
||||
typedef
|
||||
EFI_STATUS
|
||||
(EFIAPI *SCMI_PERFORMANCE_LEVEL_GET) (
|
||||
IN SCMI_PERFORMANCE_PROTOCOL *This,
|
||||
IN UINT32 DomainId,
|
||||
OUT UINT32 *Level
|
||||
);
|
||||
|
||||
typedef struct _SCMI_PERFORMANCE_PROTOCOL {
|
||||
SCMI_PERFORMANCE_GET_VERSION GetVersion;
|
||||
SCMI_PERFORMANCE_GET_ATTRIBUTES GetProtocolAttributes;
|
||||
SCMI_PERFORMANCE_GET_DOMAIN_ATTRIBUTES GetDomainAttributes;
|
||||
SCMI_PERFORMANCE_DESCRIBE_LEVELS DescribeLevels;
|
||||
SCMI_PERFORMANCE_LIMITS_SET LimitsSet;
|
||||
SCMI_PERFORMANCE_LIMITS_GET LimitsGet;
|
||||
SCMI_PERFORMANCE_LEVEL_SET LevelSet;
|
||||
SCMI_PERFORMANCE_LEVEL_GET LevelGet;
|
||||
} SCMI_PERFORMANCE_PROTOCOL;
|
||||
|
||||
typedef enum {
|
||||
SCMI_MESSAGE_ID_PERFORMANCE_DOMAIN_ATTRIBUTES = 0x3,
|
||||
SCMI_MESSAGE_ID_PERFORMANCE_DESCRIBE_LEVELS = 0x4,
|
||||
SCMI_MESSAGE_ID_PERFORMANCE_LIMITS_SET = 0x5,
|
||||
SCMI_MESSAGE_ID_PERFORMANCE_LIMITS_GET = 0x6,
|
||||
SCMI_MESSAGE_ID_PERFORMANCE_LEVEL_SET = 0x7,
|
||||
SCMI_MESSAGE_ID_PERFORMANCE_LEVEL_GET = 0x8,
|
||||
} SCMI_MESSAGE_ID_PERFORMANCE;
|
||||
|
||||
#endif /* ARM_SCMI_PERFORMANCE_PROTOCOL_H_ */
|
||||
|
@@ -394,7 +394,7 @@ DisassembleArmInstruction (
|
||||
}
|
||||
|
||||
|
||||
if ((OpCode & 0x0db00000) == 0x03200000) {
|
||||
if ((OpCode & 0x0db00000) == 0x01200000) {
|
||||
// A4.1.38 MSR{<cond>} CPSR_<fields>, #<immediate> MSR{<cond>} CPSR_<fields>, <Rm>
|
||||
if (I) {
|
||||
// MSR{<cond>} CPSR_<fields>, #<immediate>
|
||||
|
@@ -29,6 +29,14 @@ ArmGenericTimerEnableTimer (
|
||||
ArmWriteCntpCtl (TimerCtrlReg);
|
||||
}
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ArmGenericTimerReenableTimer (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ArmGenericTimerDisableTimer (
|
||||
|
@@ -26,19 +26,17 @@ ArmGenericTimerEnableTimer (
|
||||
|
||||
TimerCtrlReg = ArmReadCntvCtl ();
|
||||
TimerCtrlReg |= ARM_ARCH_TIMER_ENABLE;
|
||||
|
||||
//
|
||||
// When running under KVM, we need to unmask the interrupt on the timer side
|
||||
// as KVM will mask it when servicing the interrupt at the hypervisor level
|
||||
// and delivering the virtual timer interrupt to the guest. Otherwise, the
|
||||
// interrupt will fire again, trapping into the hypervisor again, etc. etc.
|
||||
// This is scheduled to be fixed on the KVM side, but there is no harm in
|
||||
// leaving this in once KVM gets fixed.
|
||||
//
|
||||
TimerCtrlReg &= ~ARM_ARCH_TIMER_IMASK;
|
||||
ArmWriteCntvCtl (TimerCtrlReg);
|
||||
}
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ArmGenericTimerReenableTimer (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
}
|
||||
|
||||
VOID
|
||||
EFIAPI
|
||||
ArmGenericTimerDisableTimer (
|
||||
|
@@ -187,4 +187,30 @@ ASM_FUNC(ArmReadSctlr)
|
||||
3:mrs x0, sctlr_el3
|
||||
4:ret
|
||||
|
||||
ASM_FUNC(ArmWriteSctlr)
|
||||
EL1_OR_EL2_OR_EL3(x1)
|
||||
1:msr sctlr_el1, x0
|
||||
ret
|
||||
2:msr sctlr_el2, x0
|
||||
ret
|
||||
3:msr sctlr_el3, x0
|
||||
4:ret
|
||||
|
||||
ASM_FUNC(ArmGetPhysicalAddressBits)
|
||||
mrs x0, id_aa64mmfr0_el1
|
||||
adr x1, .LPARanges
|
||||
and x0, x0, #0xf
|
||||
ldrb w0, [x1, x0]
|
||||
ret
|
||||
|
||||
//
|
||||
// Bits 0..3 of the AA64MFR0_EL1 system register encode the size of the
|
||||
// physical address space support on this CPU:
|
||||
// 0 == 32 bits, 1 == 36 bits, etc etc
|
||||
// 7 and up are reserved
|
||||
//
|
||||
.LPARanges:
|
||||
.byte 32, 36, 40, 42, 44, 48, 52, 0
|
||||
.byte 0, 0, 0, 0, 0, 0, 0, 0
|
||||
|
||||
ASM_FUNCTION_REMOVE_IF_UNREFERENCED
|
||||
|
@@ -100,8 +100,6 @@ ASM_FUNC(ArmGetTTBR0BaseAddress)
|
||||
// IN VOID *MVA // R1
|
||||
// );
|
||||
ASM_FUNC(ArmUpdateTranslationTableEntry)
|
||||
mcr p15,0,R0,c7,c14,1 @ DCCIMVAC Clean data cache by MVA
|
||||
dsb
|
||||
mcr p15,0,R1,c8,c7,1 @ TLBIMVA TLB Invalidate MVA
|
||||
mcr p15,0,R9,c7,c5,6 @ BPIALL Invalidate Branch predictor array. R9 == NoOp
|
||||
dsb
|
||||
@@ -153,6 +151,10 @@ ASM_FUNC(ArmReadSctlr)
|
||||
mrc p15, 0, r0, c1, c0, 0 @ Read SCTLR into R0 (Read control register configuration data)
|
||||
bx lr
|
||||
|
||||
ASM_FUNC(ArmWriteSctlr)
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
bx lr
|
||||
|
||||
ASM_FUNC(ArmReadCpuActlr)
|
||||
mrc p15, 0, r0, c1, c0, 1
|
||||
bx lr
|
||||
@@ -163,4 +165,12 @@ ASM_FUNC(ArmWriteCpuActlr)
|
||||
isb
|
||||
bx lr
|
||||
|
||||
ASM_FUNC (ArmGetPhysicalAddressBits)
|
||||
mrc p15, 0, r0, c0, c1, 4 // MMFR0
|
||||
and r0, r0, #0xf // VMSA [3:0]
|
||||
cmp r0, #5 // >= 5 implies LPAE support
|
||||
movlt r0, #32 // 32 bits if no LPAE
|
||||
movge r0, #40 // 40 bits if LPAE
|
||||
bx lr
|
||||
|
||||
ASM_FUNCTION_REMOVE_IF_UNREFERENCED
|
||||
|
@@ -155,6 +155,9 @@
|
||||
mrc p15, 0, r0, c1, c0, 0 // Read SCTLR into R0 (Read control register configuration data)
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmWriteSctlr
|
||||
mcr p15, 0, r0, c1, c0, 0
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmReadCpuActlr
|
||||
mrc p15, 0, r0, c1, c0, 1
|
||||
@@ -166,4 +169,12 @@
|
||||
isb
|
||||
bx lr
|
||||
|
||||
RVCT_ASM_EXPORT ArmGetPhysicalAddressBits
|
||||
mrc p15, 0, r0, c0, c1, 4 ; MMFR0
|
||||
and r0, r0, #0xf ; VMSA [3:0]
|
||||
cmp r0, #5 ; >= 5 implies LPAE support
|
||||
movlt r0, #32 ; 32 bits if no LPAE
|
||||
movge r0, #40 ; 40 bits if LPAE
|
||||
bx lr
|
||||
|
||||
END
|
||||
|
@@ -604,8 +604,15 @@ ArmConfigureMmu (
|
||||
return EFI_INVALID_PARAMETER;
|
||||
}
|
||||
|
||||
// Cover the entire GCD memory space
|
||||
MaxAddress = (1UL << PcdGet8 (PcdPrePiCpuMemorySize)) - 1;
|
||||
//
|
||||
// Limit the virtual address space to what we can actually use: UEFI
|
||||
// mandates a 1:1 mapping, so no point in making the virtual address
|
||||
// space larger than the physical address space. We also have to take
|
||||
// into account the architectural limitations that result from UEFI's
|
||||
// use of 4 KB pages.
|
||||
//
|
||||
MaxAddress = MIN (LShiftU64 (1ULL, ArmGetPhysicalAddressBits ()) - 1,
|
||||
MAX_ALLOC_ADDRESS);
|
||||
|
||||
// Lookup the Table Level to get the information
|
||||
LookupAddresstoRootTable (MaxAddress, &T0SZ, &RootTableEntryCount);
|
||||
|
@@ -343,17 +343,12 @@ ArmConfigureMmu (
|
||||
}
|
||||
|
||||
// Translate the Memory Attributes into Translation Table Register Attributes
|
||||
if ((TranslationTableAttribute == ARM_MEMORY_REGION_ATTRIBUTE_UNCACHED_UNBUFFERED) ||
|
||||
(TranslationTableAttribute == ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_UNCACHED_UNBUFFERED)) {
|
||||
TTBRAttributes = ArmHasMpExtensions () ? TTBR_MP_NON_CACHEABLE : TTBR_NON_CACHEABLE;
|
||||
} else if ((TranslationTableAttribute == ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK) ||
|
||||
if ((TranslationTableAttribute == ARM_MEMORY_REGION_ATTRIBUTE_WRITE_BACK) ||
|
||||
(TranslationTableAttribute == ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_BACK)) {
|
||||
TTBRAttributes = ArmHasMpExtensions () ? TTBR_MP_WRITE_BACK_ALLOC : TTBR_WRITE_BACK_ALLOC;
|
||||
} else if ((TranslationTableAttribute == ARM_MEMORY_REGION_ATTRIBUTE_WRITE_THROUGH) ||
|
||||
(TranslationTableAttribute == ARM_MEMORY_REGION_ATTRIBUTE_NONSECURE_WRITE_THROUGH)) {
|
||||
TTBRAttributes = ArmHasMpExtensions () ? TTBR_MP_WRITE_THROUGH : TTBR_WRITE_THROUGH;
|
||||
} else {
|
||||
ASSERT (0); // No support has been found for the attributes of the memory region that the translation table belongs to.
|
||||
// Page tables must reside in memory mapped as write-back cacheable
|
||||
ASSERT (0);
|
||||
return RETURN_UNSUPPORTED;
|
||||
}
|
||||
|
||||
@@ -461,9 +456,6 @@ ConvertSectionToPages (
|
||||
PageTable[Index] = TT_DESCRIPTOR_PAGE_BASE_ADDRESS(BaseAddress + (Index << 12)) | PageDescriptor;
|
||||
}
|
||||
|
||||
// Flush d-cache so descriptors make it back to uncached memory for subsequent table walks
|
||||
WriteBackInvalidateDataCacheRange ((VOID *)PageTable, TT_DESCRIPTOR_PAGE_SIZE);
|
||||
|
||||
// Formulate page table entry, Domain=0, NS=0
|
||||
PageTableDescriptor = (((UINTN)PageTable) & TT_DESCRIPTOR_SECTION_PAGETABLE_ADDRESS_MASK) | TT_DESCRIPTOR_SECTION_TYPE_PAGE_TABLE;
|
||||
|
||||
@@ -597,12 +589,6 @@ UpdatePageEntries (
|
||||
if (CurrentPageTableEntry != PageTableEntry) {
|
||||
Mva = (VOID *)(UINTN)((((UINTN)FirstLevelIdx) << TT_DESCRIPTOR_SECTION_BASE_SHIFT) + (PageTableIndex << TT_DESCRIPTOR_PAGE_BASE_SHIFT));
|
||||
|
||||
// Clean/invalidate the cache for this page, but only
|
||||
// if we are modifying the memory type attributes
|
||||
if (((CurrentPageTableEntry ^ PageTableEntry) & TT_DESCRIPTOR_PAGE_CACHE_POLICY_MASK) != 0) {
|
||||
WriteBackInvalidateDataCacheRange (Mva, TT_DESCRIPTOR_PAGE_SIZE);
|
||||
}
|
||||
|
||||
// Only need to update if we are changing the entry
|
||||
PageTable[PageTableIndex] = PageTableEntry;
|
||||
ArmUpdateTranslationTableEntry ((VOID *)&PageTable[PageTableIndex], Mva);
|
||||
@@ -709,20 +695,18 @@ UpdateSectionEntries (
|
||||
} else {
|
||||
// still a section entry
|
||||
|
||||
if (CurrentDescriptor != 0) {
|
||||
// mask off appropriate fields
|
||||
Descriptor = CurrentDescriptor & ~EntryMask;
|
||||
} else {
|
||||
Descriptor = ((UINTN)FirstLevelIdx + i) << TT_DESCRIPTOR_SECTION_BASE_SHIFT;
|
||||
}
|
||||
|
||||
// mask in new attributes and/or permissions
|
||||
Descriptor |= EntryValue;
|
||||
|
||||
if (CurrentDescriptor != Descriptor) {
|
||||
Mva = (VOID *)(UINTN)(((UINTN)FirstLevelTable) << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
|
||||
|
||||
// Clean/invalidate the cache for this section, but only
|
||||
// if we are modifying the memory type attributes
|
||||
if (((CurrentDescriptor ^ Descriptor) & TT_DESCRIPTOR_SECTION_CACHE_POLICY_MASK) != 0) {
|
||||
WriteBackInvalidateDataCacheRange (Mva, SIZE_1MB);
|
||||
}
|
||||
Mva = (VOID *)(UINTN)(((UINTN)FirstLevelIdx + i) << TT_DESCRIPTOR_SECTION_BASE_SHIFT);
|
||||
|
||||
// Only need to update if we are changing the descriptor
|
||||
FirstLevelTable[FirstLevelIdx + i] = Descriptor;
|
||||
|
@@ -40,8 +40,5 @@
|
||||
CacheMaintenanceLib
|
||||
MemoryAllocationLib
|
||||
|
||||
[Pcd.AARCH64]
|
||||
gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize
|
||||
|
||||
[Pcd.ARM]
|
||||
gArmTokenSpaceGuid.PcdNormalMemoryNonshareableOverride
|
||||
|
@@ -35,6 +35,3 @@
|
||||
ArmLib
|
||||
CacheMaintenanceLib
|
||||
MemoryAllocationLib
|
||||
|
||||
[Pcd.AARCH64]
|
||||
gEmbeddedTokenSpaceGuid.PcdPrePiCpuMemorySize
|
||||
|
108
ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.c
Normal file
108
ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.c
Normal file
@@ -0,0 +1,108 @@
|
||||
/** @file
|
||||
|
||||
Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
System Control and Management Interface V1.0
|
||||
http://infocenter.arm.com/help/topic/com.arm.doc.den0056a/
|
||||
DEN0056A_System_Control_and_Management_Interface.pdf
|
||||
**/
|
||||
|
||||
#include <Library/ArmMtlLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
|
||||
/** Wait until channel is free.
|
||||
|
||||
@param[in] Channel Pointer to a channel.
|
||||
@param[in] TimeOutInMicroSeconds Timeout in micro seconds.
|
||||
|
||||
@retval EFI_UNSUPPORTED Interface not implemented.
|
||||
**/
|
||||
EFI_STATUS
|
||||
MtlWaitUntilChannelFree (
|
||||
IN MTL_CHANNEL *Channel,
|
||||
IN UINTN TimeOutInMicroSeconds
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
/** Return the address of the message payload.
|
||||
|
||||
@param[in] Channel Pointer to a channel.
|
||||
|
||||
@retval UINT32* Pointer to the payload.
|
||||
**/
|
||||
UINT32*
|
||||
MtlGetChannelPayload (
|
||||
IN MTL_CHANNEL *Channel
|
||||
)
|
||||
{
|
||||
ASSERT (FALSE);
|
||||
return NULL;
|
||||
}
|
||||
|
||||
/** Return pointer to a channel for the requested channel type.
|
||||
|
||||
@param[in] ChannelType ChannelType, Low or High priority channel.
|
||||
MTL_CHANNEL_TYPE_LOW or
|
||||
MTL_CHANNEL_TYPE_HIGH
|
||||
|
||||
@param[out] Channel Holds pointer to the channel.
|
||||
|
||||
@retval EFI_UNSUPPORTED Requested channel type not supported or
|
||||
interface not implemented.
|
||||
**/
|
||||
EFI_STATUS
|
||||
MtlGetChannel (
|
||||
IN MTL_CHANNEL_TYPE ChannelType,
|
||||
OUT MTL_CHANNEL **Channel
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
/** Mark the channel busy and ring the doorbell.
|
||||
|
||||
@param[in] Channel Pointer to a channel.
|
||||
@param[in] MessageHeader Message header.
|
||||
|
||||
@param[out] PayloadLength Message length.
|
||||
|
||||
@retval EFI_UNSUPPORTED Interface not implemented.
|
||||
**/
|
||||
EFI_STATUS
|
||||
MtlSendMessage (
|
||||
IN MTL_CHANNEL *Channel,
|
||||
IN UINT32 MessageHeader,
|
||||
OUT UINT32 PayloadLength
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
||||
|
||||
/** Wait for a response on a channel.
|
||||
|
||||
If channel is free after sending message, it implies SCP responded
|
||||
with a response on the channel.
|
||||
|
||||
@param[in] Channel Pointer to a channel.
|
||||
|
||||
@retval EFI_UNSUPPORTED Interface not implemented.
|
||||
**/
|
||||
EFI_STATUS
|
||||
MtlReceiveMessage (
|
||||
IN MTL_CHANNEL *Channel,
|
||||
OUT UINT32 *MessageHeader,
|
||||
OUT UINT32 *PayloadLength
|
||||
)
|
||||
{
|
||||
return EFI_UNSUPPORTED;
|
||||
}
|
26
ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.inf
Normal file
26
ArmPkg/Library/ArmMtlNullLib/ArmMtlNullLib.inf
Normal file
@@ -0,0 +1,26 @@
|
||||
#/** @file
|
||||
# Copyright (c) 2017-2018, Arm Limited. All rights reserved.
|
||||
#
|
||||
# This program and the accompanying materials
|
||||
# are licensed and made available under the terms and conditions of the BSD License
|
||||
# which accompanies this distribution. The full text of the license may be found at
|
||||
# http://opensource.org/licenses/bsd-license.php
|
||||
#
|
||||
# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
#**/
|
||||
|
||||
[Defines]
|
||||
INF_VERSION = 0x00010019
|
||||
BASE_NAME = ArmMtlNullLib
|
||||
FILE_GUID = 05810525-FDEC-4006-9F1F-37609B3675FA
|
||||
MODULE_TYPE = BASE
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = ArmMtlLib
|
||||
|
||||
[Sources.common]
|
||||
ArmMtlNullLib.c
|
||||
|
||||
[Packages]
|
||||
ArmPkg/ArmPkg.dec
|
||||
MdePkg/MdePkg.dec
|
30
ArmPkg/Library/ArmSmcPsciResetSystemLib/AArch64/Reset.S
Normal file
30
ArmPkg/Library/ArmSmcPsciResetSystemLib/AArch64/Reset.S
Normal file
@@ -0,0 +1,30 @@
|
||||
/** @file
|
||||
ResetSystemLib implementation using PSCI calls
|
||||
|
||||
Copyright (c) 2018, Linaro Ltd. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <AsmMacroIoLibV8.h>
|
||||
|
||||
ASM_FUNC(DisableMmuAndReenterPei)
|
||||
stp x29, x30, [sp, #-16]!
|
||||
mov x29, sp
|
||||
|
||||
bl ArmDisableMmu
|
||||
|
||||
// no memory accesses after MMU and caches have been disabled
|
||||
|
||||
MOV64 (x0, FixedPcdGet64 (PcdFvBaseAddress))
|
||||
blr x0
|
||||
|
||||
// never returns
|
||||
nop
|
35
ArmPkg/Library/ArmSmcPsciResetSystemLib/AArch64/Reset.asm
Normal file
35
ArmPkg/Library/ArmSmcPsciResetSystemLib/AArch64/Reset.asm
Normal file
@@ -0,0 +1,35 @@
|
||||
;/** @file
|
||||
; ResetSystemLib implementation using PSCI calls
|
||||
;
|
||||
; Copyright (c) 2018, Linaro Ltd. All rights reserved.<BR>
|
||||
;
|
||||
; This program and the accompanying materials
|
||||
; are licensed and made available under the terms and conditions of the BSD License
|
||||
; which accompanies this distribution. The full text of the license may be found at
|
||||
; http://opensource.org/licenses/bsd-license.php
|
||||
;
|
||||
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
;
|
||||
;**/
|
||||
|
||||
AREA Reset, CODE, READONLY
|
||||
|
||||
EXPORT DisableMmuAndReenterPei
|
||||
IMPORT ArmDisableMmu
|
||||
|
||||
DisableMmuAndReenterPei
|
||||
stp x29, x30, [sp, #-16]!
|
||||
mov x29, sp
|
||||
|
||||
bl ArmDisableMmu
|
||||
|
||||
; no memory accesses after MMU and caches have been disabled
|
||||
|
||||
movl x0, FixedPcdGet64 (PcdFvBaseAddress)
|
||||
blr x0
|
||||
|
||||
; never returns
|
||||
nop
|
||||
|
||||
END
|
29
ArmPkg/Library/ArmSmcPsciResetSystemLib/Arm/Reset.S
Normal file
29
ArmPkg/Library/ArmSmcPsciResetSystemLib/Arm/Reset.S
Normal file
@@ -0,0 +1,29 @@
|
||||
/** @file
|
||||
ResetSystemLib implementation using PSCI calls
|
||||
|
||||
Copyright (c) 2018, Linaro Ltd. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
which accompanies this distribution. The full text of the license may be found at
|
||||
http://opensource.org/licenses/bsd-license.php
|
||||
|
||||
THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
|
||||
**/
|
||||
|
||||
#include <AsmMacroIoLib.h>
|
||||
|
||||
ASM_FUNC(DisableMmuAndReenterPei)
|
||||
push {lr}
|
||||
|
||||
bl ArmDisableMmu
|
||||
|
||||
// no memory accesses after MMU and caches have been disabled
|
||||
|
||||
MOV32 (r0, FixedPcdGet64 (PcdFvBaseAddress))
|
||||
blx r0
|
||||
|
||||
// never returns
|
||||
nop
|
34
ArmPkg/Library/ArmSmcPsciResetSystemLib/Arm/Reset.asm
Normal file
34
ArmPkg/Library/ArmSmcPsciResetSystemLib/Arm/Reset.asm
Normal file
@@ -0,0 +1,34 @@
|
||||
;/** @file
|
||||
; ResetSystemLib implementation using PSCI calls
|
||||
;
|
||||
; Copyright (c) 2018, Linaro Ltd. All rights reserved.<BR>
|
||||
;
|
||||
; This program and the accompanying materials
|
||||
; are licensed and made available under the terms and conditions of the BSD License
|
||||
; which accompanies this distribution. The full text of the license may be found at
|
||||
; http://opensource.org/licenses/bsd-license.php
|
||||
;
|
||||
; THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
; WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.
|
||||
;
|
||||
;**/
|
||||
|
||||
INCLUDE AsmMacroExport.inc
|
||||
PRESERVE8
|
||||
|
||||
IMPORT ArmDisableMmu
|
||||
|
||||
RVCT_ASM_EXPORT DisableMmuAndReenterPei
|
||||
push {lr}
|
||||
|
||||
bl ArmDisableMmu
|
||||
|
||||
; no memory accesses after MMU and caches have been disabled
|
||||
|
||||
mov32 r0, FixedPcdGet64 (PcdFvBaseAddress)
|
||||
blx r0
|
||||
|
||||
; never returns
|
||||
nop
|
||||
|
||||
END
|
@@ -1,7 +1,7 @@
|
||||
/** @file
|
||||
ResetSystemLib implementation using PSCI calls
|
||||
|
||||
Copyright (c) 2017, Linaro Ltd. All rights reserved.<BR>
|
||||
Copyright (c) 2017 - 2018, Linaro Ltd. All rights reserved.<BR>
|
||||
|
||||
This program and the accompanying materials
|
||||
are licensed and made available under the terms and conditions of the BSD License
|
||||
@@ -15,10 +15,13 @@
|
||||
|
||||
#include <PiDxe.h>
|
||||
|
||||
#include <Library/ArmMmuLib.h>
|
||||
#include <Library/ArmSmcLib.h>
|
||||
#include <Library/BaseLib.h>
|
||||
#include <Library/DebugLib.h>
|
||||
#include <Library/ResetSystemLib.h>
|
||||
#include <Library/ArmSmcLib.h>
|
||||
#include <Library/UefiBootServicesTableLib.h>
|
||||
#include <Library/UefiRuntimeLib.h>
|
||||
|
||||
#include <IndustryStandard/ArmStdSmc.h>
|
||||
|
||||
@@ -78,6 +81,8 @@ ResetShutdown (
|
||||
ArmCallSmc (&ArmSmcArgs);
|
||||
}
|
||||
|
||||
VOID DisableMmuAndReenterPei (VOID);
|
||||
|
||||
/**
|
||||
This function causes the system to enter S3 and then wake up immediately.
|
||||
|
||||
@@ -89,7 +94,64 @@ EnterS3WithImmediateWake (
|
||||
VOID
|
||||
)
|
||||
{
|
||||
// Not implemented
|
||||
EFI_PHYSICAL_ADDRESS Alloc;
|
||||
EFI_MEMORY_DESCRIPTOR *MemMap;
|
||||
UINTN MemMapSize;
|
||||
UINTN MapKey, DescriptorSize;
|
||||
UINT32 DescriptorVersion;
|
||||
EFI_STATUS Status;
|
||||
|
||||
if (FeaturePcdGet (PcdArmReenterPeiForCapsuleWarmReboot) &&
|
||||
!EfiAtRuntime ()) {
|
||||
//
|
||||
// At boot time, we are the only core running, so we can implement the
|
||||
// immediate wake (which is used by capsule update) by disabling the MMU
|
||||
// and interrupts, and jumping to the PEI entry point.
|
||||
//
|
||||
|
||||
//
|
||||
// Obtain the size of the memory map
|
||||
//
|
||||
MemMapSize = 0;
|
||||
MemMap = NULL;
|
||||
Status = gBS->GetMemoryMap (&MemMapSize, MemMap, &MapKey, &DescriptorSize,
|
||||
&DescriptorVersion);
|
||||
ASSERT (Status == EFI_BUFFER_TOO_SMALL);
|
||||
|
||||
//
|
||||
// Add some slack to the allocation to cater for changes in the memory
|
||||
// map if ExitBootServices () fails the first time around.
|
||||
//
|
||||
MemMapSize += SIZE_4KB;
|
||||
Status = gBS->AllocatePages (AllocateAnyPages, EfiBootServicesData,
|
||||
EFI_SIZE_TO_PAGES (MemMapSize), &Alloc);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
MemMap = (EFI_MEMORY_DESCRIPTOR *)(UINTN)Alloc;
|
||||
|
||||
Status = gBS->GetMemoryMap (&MemMapSize, MemMap, &MapKey, &DescriptorSize,
|
||||
&DescriptorVersion);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = gBS->ExitBootServices (gImageHandle, MapKey);
|
||||
if (EFI_ERROR (Status)) {
|
||||
//
|
||||
// ExitBootServices () may fail the first time around if an event fired
|
||||
// right after the call to GetMemoryMap() which allocated or freed memory.
|
||||
// Since that first call to ExitBootServices () will disarm the timer,
|
||||
// this is guaranteed not to happen again, so one additional attempt
|
||||
// should suffice.
|
||||
//
|
||||
Status = gBS->GetMemoryMap (&MemMapSize, MemMap, &MapKey, &DescriptorSize,
|
||||
&DescriptorVersion);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
|
||||
Status = gBS->ExitBootServices (gImageHandle, MapKey);
|
||||
ASSERT_EFI_ERROR (Status);
|
||||
}
|
||||
|
||||
DisableMmuAndReenterPei ();
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
|
@@ -21,6 +21,14 @@
|
||||
VERSION_STRING = 1.0
|
||||
LIBRARY_CLASS = ResetSystemLib
|
||||
|
||||
[Sources.AARCH64]
|
||||
AArch64/Reset.S | GCC
|
||||
AArch64/Reset.asm | MSFT
|
||||
|
||||
[Sources.ARM]
|
||||
Arm/Reset.S | GCC
|
||||
Arm/Reset.asm | RVCT
|
||||
|
||||
[Sources]
|
||||
ArmSmcPsciResetSystemLib.c
|
||||
|
||||
@@ -30,6 +38,15 @@
|
||||
MdePkg/MdePkg.dec
|
||||
|
||||
[LibraryClasses]
|
||||
ArmMmuLib
|
||||
ArmSmcLib
|
||||
BaseLib
|
||||
DebugLib
|
||||
UefiBootServicesTableLib
|
||||
UefiRuntimeLib
|
||||
|
||||
[FeaturePcd]
|
||||
gArmTokenSpaceGuid.PcdArmReenterPeiForCapsuleWarmReboot
|
||||
|
||||
[FixedPcd]
|
||||
gArmTokenSpaceGuid.PcdFvBaseAddress
|
||||
|
@@ -1,6 +1,7 @@
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
||||
// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
|
||||
//
|
||||
// This program and the accompanying materials
|
||||
// are licensed and made available under the terms and conditions of the BSD License
|
||||
@@ -17,18 +18,19 @@
|
||||
EXPORT __aeabi_uidivmod
|
||||
EXPORT __aeabi_idiv
|
||||
EXPORT __aeabi_idivmod
|
||||
EXPORT __rt_udiv
|
||||
EXPORT __rt_sdiv
|
||||
|
||||
AREA Math, CODE, READONLY
|
||||
|
||||
;
|
||||
;UINT32
|
||||
;EFIAPI
|
||||
;__aeabi_uidivmode (
|
||||
; IN UINT32 Dividen
|
||||
;__aeabi_uidivmod (
|
||||
; IN UINT32 Dividend
|
||||
; IN UINT32 Divisor
|
||||
; );
|
||||
;
|
||||
|
||||
__aeabi_uidiv
|
||||
__aeabi_uidivmod
|
||||
RSBS r12, r1, r0, LSR #4
|
||||
@@ -39,11 +41,41 @@ __aeabi_uidivmod
|
||||
MOV r3, #0
|
||||
B __arm_div_large
|
||||
|
||||
;
|
||||
;UINT64
|
||||
;EFIAPI
|
||||
;__rt_udiv (
|
||||
; IN UINT32 Divisor,
|
||||
; IN UINT32 Dividend
|
||||
; );
|
||||
;
|
||||
__rt_udiv
|
||||
; Swap R0 and R1
|
||||
MOV r12, r0
|
||||
MOV r0, r1
|
||||
MOV r1, r12
|
||||
B __aeabi_uidivmod
|
||||
|
||||
;
|
||||
;UINT64
|
||||
;EFIAPI
|
||||
;__rt_sdiv (
|
||||
; IN INT32 Divisor,
|
||||
; IN INT32 Dividend
|
||||
; );
|
||||
;
|
||||
__rt_sdiv
|
||||
; Swap R0 and R1
|
||||
MOV r12, r0
|
||||
MOV r0, r1
|
||||
MOV r1, r12
|
||||
B __aeabi_idivmod
|
||||
|
||||
;
|
||||
;INT32
|
||||
;EFIAPI
|
||||
;__aeabi_idivmode (
|
||||
; IN INT32 Dividen
|
||||
;__aeabi_idivmod (
|
||||
; IN INT32 Dividend
|
||||
; IN INT32 Divisor
|
||||
; );
|
||||
;
|
||||
@@ -152,4 +184,3 @@ __aeabi_idiv0
|
||||
BX r14
|
||||
|
||||
END
|
||||
|
||||
|
@@ -1,6 +1,7 @@
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
||||
// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
|
||||
//
|
||||
// This program and the accompanying materials
|
||||
// are licensed and made available under the terms and conditions of the BSD License
|
||||
@@ -13,20 +14,41 @@
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
EXTERN __aeabi_uldivmod
|
||||
IMPORT __aeabi_uldivmod
|
||||
EXPORT __aeabi_ldivmod
|
||||
EXPORT __rt_sdiv64
|
||||
|
||||
INCLUDE AsmMacroExport.inc
|
||||
AREA s___aeabi_ldivmod, CODE, READONLY, ARM
|
||||
|
||||
ARM
|
||||
|
||||
;
|
||||
;UINT32
|
||||
;INT64
|
||||
;EFIAPI
|
||||
;__aeabi_uidivmode (
|
||||
; IN UINT32 Dividen
|
||||
; IN UINT32 Divisor
|
||||
;__rt_sdiv64 (
|
||||
; IN INT64 Divisor
|
||||
; IN INT64 Dividend
|
||||
; );
|
||||
;
|
||||
__rt_sdiv64
|
||||
; Swap r0-r1 and r2-r3
|
||||
MOV r12, r0
|
||||
MOV r0, r2
|
||||
MOV r2, r12
|
||||
MOV r12, r1
|
||||
MOV r1, r3
|
||||
MOV r3, r12
|
||||
B __aeabi_ldivmod
|
||||
|
||||
RVCT_ASM_EXPORT __aeabi_ldivmod
|
||||
;
|
||||
;INT64
|
||||
;EFIAPI
|
||||
;__aeabi_ldivmod (
|
||||
; IN INT64 Dividend
|
||||
; IN INT64 Divisor
|
||||
; );
|
||||
;
|
||||
__aeabi_ldivmod
|
||||
PUSH {r4,lr}
|
||||
ASRS r4,r1,#1
|
||||
EOR r4,r4,r3,LSR #1
|
||||
@@ -39,7 +61,7 @@ L_Test1
|
||||
RSBS r2,r2,#0
|
||||
RSC r3,r3,#0
|
||||
L_Test2
|
||||
BL __aeabi_uldivmod ;
|
||||
BL __aeabi_uldivmod
|
||||
TST r4,#0x40000000
|
||||
BEQ L_Test3
|
||||
RSBS r0,r0,#0
|
||||
@@ -53,5 +75,3 @@ L_Exit
|
||||
POP {r4,pc}
|
||||
|
||||
END
|
||||
|
||||
|
||||
|
@@ -1,6 +1,7 @@
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
||||
// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
|
||||
//
|
||||
// This program and the accompanying materials
|
||||
// are licensed and made available under the terms and conditions of the BSD License
|
||||
@@ -12,32 +13,33 @@
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
EXPORT __aeabi_llsr
|
||||
EXPORT __rt_srsh
|
||||
|
||||
AREA s___aeabi_llsr, CODE, READONLY, ARM
|
||||
|
||||
INCLUDE AsmMacroExport.inc
|
||||
ARM
|
||||
|
||||
;
|
||||
;VOID
|
||||
;EFIAPI
|
||||
;__aeabi_llsr (
|
||||
; IN VOID *Destination,
|
||||
; IN VOID *Source,
|
||||
; IN UINT32 Size
|
||||
; );
|
||||
; IN UINT64 Value,
|
||||
; IN UINT32 Shift
|
||||
;)
|
||||
;
|
||||
RVCT_ASM_EXPORT __aeabi_llsr
|
||||
__aeabi_llsr
|
||||
__rt_srsh
|
||||
SUBS r3,r2,#0x20
|
||||
BPL {pc} + 0x18 ; 0x1c
|
||||
BPL __aeabi_llsr_label1
|
||||
RSB r3,r2,#0x20
|
||||
LSR r0,r0,r2
|
||||
ORR r0,r0,r1,LSL r3
|
||||
LSR r1,r1,r2
|
||||
BX lr
|
||||
__aeabi_llsr_label1
|
||||
LSR r0,r1,r3
|
||||
MOV r1,#0
|
||||
BX lr
|
||||
|
||||
END
|
||||
|
||||
|
||||
|
||||
|
@@ -1,6 +1,7 @@
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>
|
||||
// Copyright (c) 2018, Pete Batard. All rights reserved.<BR>
|
||||
//
|
||||
// This program and the accompanying materials
|
||||
// are licensed and made available under the terms and conditions of the BSD License
|
||||
@@ -13,9 +14,30 @@
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
|
||||
EXPORT __aeabi_uldivmod
|
||||
EXPORT __rt_udiv64
|
||||
|
||||
AREA s___aeabi_uldivmod, CODE, READONLY, ARM
|
||||
|
||||
INCLUDE AsmMacroExport.inc
|
||||
ARM
|
||||
|
||||
;
|
||||
;UINT64
|
||||
;EFIAPI
|
||||
;__rt_udiv64 (
|
||||
; IN UINT64 Divisor
|
||||
; IN UINT64 Dividend
|
||||
; )
|
||||
;
|
||||
__rt_udiv64
|
||||
; Swap r0-r1 and r2-r3
|
||||
mov r12, r0
|
||||
mov r0, r2
|
||||
mov r2, r12
|
||||
mov r12, r1
|
||||
mov r1, r3
|
||||
mov r3, r12
|
||||
b __aeabi_uldivmod
|
||||
|
||||
;
|
||||
;UINT64
|
||||
@@ -25,7 +47,7 @@
|
||||
; IN UINT64 Divisor
|
||||
; )
|
||||
;
|
||||
RVCT_ASM_EXPORT __aeabi_uldivmod
|
||||
__aeabi_uldivmod
|
||||
stmdb sp!, {r4, r5, r6, lr}
|
||||
mov r4, r1
|
||||
mov r5, r0
|
||||
@@ -261,7 +283,6 @@ _ll_div0
|
||||
b __aeabi_ldiv0
|
||||
|
||||
__aeabi_ldiv0
|
||||
BX r14
|
||||
bx r14
|
||||
|
||||
END
|
||||
|
||||
|
@@ -23,8 +23,12 @@
|
||||
LIBRARY_CLASS = CompilerIntrinsicsLib
|
||||
|
||||
[Sources]
|
||||
memcpy.c
|
||||
memset.c
|
||||
memcpy.c | RVCT
|
||||
memcpy.c | GCC
|
||||
memcpy_ms.c | MSFT
|
||||
memset.c | RVCT
|
||||
memset.c | GCC
|
||||
memset_ms.c | MSFT
|
||||
|
||||
[Sources.ARM]
|
||||
Arm/mullu.asm | RVCT
|
||||
@@ -94,6 +98,10 @@
|
||||
Arm/llsr.S | GCC
|
||||
Arm/llsl.S | GCC
|
||||
|
||||
Arm/div.asm | MSFT
|
||||
Arm/uldiv.asm | MSFT
|
||||
Arm/ldivmod.asm | MSFT
|
||||
Arm/llsr.asm | MSFT
|
||||
|
||||
[Packages]
|
||||
MdePkg/MdePkg.dec
|
||||
@@ -101,3 +109,7 @@
|
||||
|
||||
[LibraryClasses]
|
||||
|
||||
[BuildOptions]
|
||||
MSFT:*_*_ARM_CC_FLAGS = /GL-
|
||||
MSFT:*_*_ARM_ASM_FLAGS = /oldit
|
||||
MSFT:*_*_AARCH64_CC_FLAGS = /GL-
|
||||
|
@@ -15,20 +15,20 @@
|
||||
|
||||
typedef __SIZE_TYPE__ size_t;
|
||||
|
||||
static __attribute__((__used__))
|
||||
void *__memcpy(void *dest, const void *src, size_t n)
|
||||
static void __memcpy(void *dest, const void *src, size_t n)
|
||||
{
|
||||
unsigned char *d = dest;
|
||||
unsigned char const *s = src;
|
||||
|
||||
while (n--)
|
||||
*d++ = *s++;
|
||||
|
||||
return dest;
|
||||
}
|
||||
|
||||
__attribute__((__alias__("__memcpy")))
|
||||
void *memcpy(void *dest, const void *src, size_t n);
|
||||
void *memcpy(void *dest, const void *src, size_t n)
|
||||
{
|
||||
__memcpy(dest, src, n);
|
||||
return dest;
|
||||
}
|
||||
|
||||
#ifdef __arm__
|
||||
|
||||
|
34
ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
Normal file
34
ArmPkg/Library/CompilerIntrinsicsLib/memcpy_ms.c
Normal file
@@ -0,0 +1,34 @@
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) 2017, Pete Batard. All rights reserved.<BR>
|
||||
//
|
||||
// This program and the accompanying materials are licensed and made
|
||||
// available under the terms and conditions of the BSD License which
|
||||
// accompanies this distribution. The full text of the license may be
|
||||
// found at http://opensource.org/licenses/bsd-license.php
|
||||
//
|
||||
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
|
||||
// IMPLIED.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#if defined(_M_ARM64)
|
||||
typedef unsigned __int64 size_t;
|
||||
#else
|
||||
typedef unsigned __int32 size_t;
|
||||
#endif
|
||||
|
||||
void* memcpy(void *, const void *, size_t);
|
||||
#pragma intrinsic(memcpy)
|
||||
#pragma function(memcpy)
|
||||
void* memcpy(void *dest, const void *src, size_t n)
|
||||
{
|
||||
unsigned char *d = dest;
|
||||
unsigned char const *s = src;
|
||||
|
||||
while (n--)
|
||||
*d++ = *s++;
|
||||
|
||||
return dest;
|
||||
}
|
33
ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
Normal file
33
ArmPkg/Library/CompilerIntrinsicsLib/memset_ms.c
Normal file
@@ -0,0 +1,33 @@
|
||||
//------------------------------------------------------------------------------
|
||||
//
|
||||
// Copyright (c) 2017, Pete Batard. All rights reserved.<BR>
|
||||
//
|
||||
// This program and the accompanying materials are licensed and made
|
||||
// available under the terms and conditions of the BSD License which
|
||||
// accompanies this distribution. The full text of the license may be
|
||||
// found at http://opensource.org/licenses/bsd-license.php
|
||||
//
|
||||
// THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,
|
||||
// WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR
|
||||
// IMPLIED.
|
||||
//
|
||||
//------------------------------------------------------------------------------
|
||||
|
||||
#if defined(_M_ARM64)
|
||||
typedef unsigned __int64 size_t;
|
||||
#else
|
||||
typedef unsigned __int32 size_t;
|
||||
#endif
|
||||
|
||||
void* memset(void *, int, size_t);
|
||||
#pragma intrinsic(memset)
|
||||
#pragma function(memset)
|
||||
void *memset(void *s, int c, size_t n)
|
||||
{
|
||||
unsigned char *d = s;
|
||||
|
||||
while (n--)
|
||||
*d++ = (unsigned char)c;
|
||||
|
||||
return s;
|
||||
}
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user