Date   
[PATCH v5 0/5] Compile AML bytecode array into OBJ file

PierreGondois
 

Rm9sbG93aW5nIHRoZSBCWiBhdCBodHRwczovL2J1Z3ppbGxhLnRpYW5vY29yZS5vcmcvc2hvd19i
dWcuY2dpP2lkPTI0MjUKVGhpcyBwYXRjaCBzZXJpZSBpcyBhIGFub3RoZXIgd2F5IHRvIHNvbHZl
IHRoZSBkZXBlbmRlbmN5Cm9mIEMgZmlsZXMgb3ZlciBBU0wgZmlsZXMuIFdpdGggdGhpcyBuZXcg
bWV0aG9kLCB0aGUKZGVwZW5kZW5jeSBpcyByZXNvbHZlZCBhdCB0aGUgbGlua2luZyBzdGFnZS4K
ClRoZSBsYXN0IG1ldGhvZCB0byBzb2x2ZSB0aGlzIGRlcGVuZGVuY3kgd2FzIHRvIGFkZAp0aGUg
cG9zc2liaWxpdHkgdG8gbW9kaWZ5IElORiBmaWxlcyB0byBkZXBpY3Qgc3VjaCBhCmRlcGVuZGVu
Y3kuIFRoaXMgbWV0aG9kIHdhcyBub3QgYWNjZXB0ZWQuIFRoZSBkaXNjdXNzaW9uCmlzIGF2YWls
YWJsZSBhdCBodHRwczovL2VkazIuZ3JvdXBzLmlvL2cvZGV2ZWwvdG9waWMvNzI2NTUzNDIjNTY2
NTgKClRoZSBsYXN0IHBhdGNoIG1vZGlmeWluZyB0aGUgSU5GIHNwZWNpZmljYXRpb24gYW5kIElO
RgpwYXJzaW5nIGFyZSBhdmFpbGFibGUgYXQ6Cmh0dHBzOi8vZWRrMi5ncm91cHMuaW8vZy9kZXZl
bC90b3BpYy83MjY1NTM0MiM1NjY1OApodHRwczovL2VkazIuZ3JvdXBzLmlvL2cvZGV2ZWwvdG9w
aWMvNzI2NTYwNjAjNTY2NjIKClBpZXJyZSBHb25kb2lzICg1KToKICBCYXNlVG9vbHM6IFBhdGNo
Q2hlY2s6IEV4Y2x1ZGUgYmFzaCBzY3JpcHRzIGZyb20gQ1JMRiBjaGVjawogIEJhc2VUb29sczog
R2VuZXJhdGUgbXVsdGlwbGUgcnVsZXMgd2hlbiBtdWx0aXBsZSBvdXRwdXQgZmlsZXMKICBCYXNl
VG9vbHM6IFJlbmFtZSBBbWxUb0hleCBzY3JpcHQgdG8gQW1sVG9DCiAgQmFzZVRvb2xzOiBDb21w
aWxlIEFNTCBieXRlY29kZSBhcnJheXMgaW50byAub2JqIGZpbGUKICBCYXNlVG9vbHM6IEZpeCBz
dHJpbmcgY29uY2F0ZW5hdGlvbgoKIEJhc2VUb29scy9CaW5XcmFwcGVycy9Qb3NpeExpa2Uve0Ft
bFRvSGV4ID0+IEFtbFRvQ30gICAgICAgICAgICAgICB8IDI4ICsrKy0tLS0KIEJhc2VUb29scy9C
aW5XcmFwcGVycy9XaW5kb3dzTGlrZS97QW1sVG9IZXguYmF0ID0+IEFtbFRvQy5iYXR9ICAgICB8
ICAwCiBCYXNlVG9vbHMvQ29uZi9idWlsZF9ydWxlLnRlbXBsYXRlICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICAgICAgfCAxNSArKystCiBCYXNlVG9vbHMvU2NyaXB0cy9QYXRjaENoZWNrLnB5
ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfCAgOCArLQogQmFzZVRvb2xzL1Nv
dXJjZS9QeXRob24ve0FtbFRvSGV4L0FtbFRvSGV4LnB5ID0+IEFtbFRvQy9BbWxUb0MucHl9IHwg
ODIgKysrKysrKystLS0tLS0tLS0tLS0KIEJhc2VUb29scy9Tb3VyY2UvUHl0aG9uL0F1dG9HZW4v
QnVpbGRFbmdpbmUucHkgICAgICAgICAgICAgICAgICAgICB8ICAyICstCiBCYXNlVG9vbHMvU291
cmNlL1B5dGhvbi9BdXRvR2VuL0dlbk1ha2UucHkgICAgICAgICAgICAgICAgICAgICAgICAgfCAg
NiArKwogQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vQXV0b0dlbi9Nb2R1bGVBdXRvR2VuLnB5ICAg
ICAgICAgICAgICAgICAgIHwgMzggKysrKystLS0tCiA4IGZpbGVzIGNoYW5nZWQsIDk2IGluc2Vy
dGlvbnMoKyksIDgzIGRlbGV0aW9ucygtKQogcmVuYW1lIEJhc2VUb29scy9CaW5XcmFwcGVycy9Q
b3NpeExpa2Uve0FtbFRvSGV4ID0+IEFtbFRvQ30gKDk3JSkKIHJlbmFtZSBCYXNlVG9vbHMvQmlu
V3JhcHBlcnMvV2luZG93c0xpa2Uve0FtbFRvSGV4LmJhdCA9PiBBbWxUb0MuYmF0fSAoMTAwJSkK
IHJlbmFtZSBCYXNlVG9vbHMvU291cmNlL1B5dGhvbi97QW1sVG9IZXgvQW1sVG9IZXgucHkgPT4g
QW1sVG9DL0FtbFRvQy5weX0gKDUyJSkKCi0tIAonR3VpZChDRTE2NTY2OS0zRUYzLTQ5M0YtQjg1
RC02MTkwRUU1Qjk3NTkpJwoK

[PATCH v5 3/5] BaseTools: Rename AmlToHex script to AmlToC

PierreGondois
 

RnJvbTogUGllcnJlIEdvbmRvaXMgPHBpZXJyZS5nb25kb2lzQGFybS5jb20+CgpUaGUgQW1sVG9I
ZXggc2NyaXB0IGFuZCBQb3NpeC9XaW5kb3dzTGlrZSB3cmFwcGVycyBjb252ZXJ0CmFuIEFNTCBm
aWxlIHRvIGEgLmhleCBmaWxlLCBjb250YWluaW5nIGEgQyBhcnJheSBzdG9yaW5nCkFNTCBieXRl
Y29kZS4gVGhpcyAiLmhleCIgZmlsZSBjYW4gdGhlbiBiZSBpbmNsdWRlZCBpbiBhCkMgZmlsZSwg
YWxsb3dpbmcgdG8gYWNjZXNzIHRoZSBBTUwgYnl0ZWNvZGUgZnJvbSB0aGlzIEMKZmlsZS4KClRo
ZSBFREsyIGJ1aWxkIHN5c3RlbSBkb2Vzbid0IGFsbG93IHRvIGEgZGVwaWN0IGRlcGVuZGVuY3kK
b3JkZXJzIGJldHdlZW4gZmlsZXMgb2YgZGlmZmVyZW50IGxhbmd1YWdlcy4gRm9yIGluc3RhbmNl
LAppbiBhIG1vZHVsZSBjb250YWluaW5nIGEgIi5jIiBmaWxlIGFuZCBhICIuYXNsIiwgdGhlICIu
YyIKZmlsZSBtYXkgb3IgbWF5IG5vdCBiZSBidWlsdCBwcmlvciB0byB0aGUgIi5hc2wiIGZpbGUu
ClRoaXMgcHJldmVudHMgYW55IGluY2x1c2lvbiBvZiBhIGdlbmVyYXRlZCAiLmhleCIgaW4gYQoi
LmMiIGZpbGUgc2luY2UgdGhpcyBsYXRlciAiLmhleCIgZmlsZSBtYXkgb3IgbWF5IG5vdApoYXZl
IGJlZW4gY3JlYXRlZCB5ZXQuCgpUaGlzIHBhdGNoIHJlbmFtZXMgdGhlIHNjcmlwdCBhcyBBbWxU
b0MuIEl0IGlzIHBvc3RlZCBhcwphIHNlcGFyYXRlIHBhdGNoIHRvIHByZXZlbnQgZ2l0IGZyb20g
c2VlaW5nIHRoZSByZW5hbWluZwphcyBhIGRlbGV0aW9uIHBsdXMgYWRkaXRpb24gb2YgYSBuZXcg
ZmlsZS4KVGhlIGVuZGluZyBsaW5lIG9mIHRoZSBwb3NpeC1saWtlIGJpbi13cmFwcGVyIHNjcmlw
dCBoYXMKYWxzbyBiZWVuIGNvcnJlY3RlZC4KClRoaXMgaXMgYSBmaXJzdCBzdGVwIHRvd2FyZCBn
ZW5lcmF0aW5nIGEgQyBmaWxlIGNvbnRhaW5pbmcKdGhlIEFNTCBieXRlY29kZSBmcm9tIGFuIEFT
TCBmaWxlLiBUaGlzIEMgZmlsZSB3aWxsIHRoZW4KYmUgaGFuZGxlZCBieSB0aGUgRURLMiBidWls
ZCBzeXN0ZW0gdG8gZ2VuZXJhdGUgYW4gb2JqZWN0CmZpbGUuClRodXMsIG5vIGZpbGUgaW5jbHVz
aW9uIHdpbGwgYmUgcmVxdWlyZWQgYW55bW9yZS4gVGhlIEMgZmlsZQpyZXF1aXJpbmcgdGhlIEFN
TCBieXRlY29kZSBhcyBhIEMgYXJyYXksIGFuZCB0aGUgQVNMIGZpbGUsCndpbGwgYmUgY29tcGls
ZWQgaW5kZXBlbmRlbnRseS4gVGhlIEMgYXJyYXkgbXVzdCBiZSBkZWZpbmVkCmFzIGFuIGV4dGVy
bmFsIHN5bWJvbC4gVGhlIGxpbmtlciBpcyByZXNvbHZpbmcgdGhlCnJlZmVyZW5jZSB0byB0aGUg
QyBhcnJheSBzeW1ib2wuCgpUbyBzdW1tYXJpemUsIHRoZSBmbG93IGdvZXMgYXM6CiAtMS4gQVNM
IGZpbGUgaXMgY29tcGlsZWQgdG8gQU1MOwogLTIuIEFNTCBmaWxlIGlzIGNvcGllZCB0byBhICIu
YW1saSIgaW50ZXJtZWRpYXRlIGZpbGU7CiAtMy4gRURLMiBidWlsZCBzeXN0ZW0gYXBwbGllcyB0
aGUgcnVsZSByZWxldmFudCB0byAiLmFtbGkiCiAgICAgZmlsZXMuIFRoaXMgaXMsIGNhbGxpbmcg
dGhlICJBbWxUb0MiIHNjcmlwdCwgZ2VuZXJhdGluZwogICAgIGEgQyBmaWxlIGZyb20gdGhlICIu
YW1saSIgZmlsZTsKIC00LiBFREsyIGJ1aWxkIHN5c3RlbSBhcHBsaWVzIHRoZSBydWxlIHJlbGV2
YW50IHRvIEMgZmlsZXMuCiAgICAgVGhpcyBpcyBjcmVhdGluZyBhbiBvYmplY3QgZmlsZS4KIC01
LiBFREsyIGJ1aWxkIHN5c3RlbSBsaW5rcyB0aGUgb2JqZWN0IGZpbGUgY29udGFpbmluZyB0aGUK
ICAgICBBTUwgYnl0ZWNvZGUgd2l0aCB0aGUgb2JqZWN0IGZpbGUgcmVxdWlyaW5nIGl0LgoKU2ln
bmVkLW9mZi1ieTogUGllcnJlIEdvbmRvaXMgPFBpZXJyZS5Hb25kb2lzQGFybS5jb20+ClN1Z2dl
c3RlZC1ieTogVG9tYXMgUGlsYXIgPFRvbWFzLlBpbGFyQGFybS5jb20+Ci0tLQoKVGhlIGNoYW5n
ZXMgY2FuIGJlIHNlZW4gYXQ6IGh0dHBzOi8vZ2l0aHViLmNvbS9QaWVycmVBUk0vZWRrMi9jb21t
aXRzLzgwM19Db21waWxlX0FNTF9ieXRlY29kZV9hcnJheV9pbnRvX09CSl9maWxlX3Y1CgpOb3Rl
czoKICAgIHYxOgogICAgIC0gUmVuYW1lIEFtbFRvSGV4IHNjcmlwdHMgdG8gQW1sVG9DLCBhbmQg
Y2hhbmdlIGxpbmUKICAgICAgIGVuZGluZ3Mgb2YgdGhlIFBvc2l4TGlrZSBiaW4td3JhcHBlci4g
W1BpZXJyZV0KICAgIHYyOgogICAgIC0gTm8gbW9kaWZpY2F0aW9uLiBbUGllcnJlXQogICAgdjM6
CiAgICAgLSBDaGFuZ2VkICJTaWduZWQtb2ZmLWJ5IiB0byAiU3VnZ2VzdGVkLWJ5Ii4gW0JvYl0K
ICAgIHY0OgogICAgIC0gTm8gbW9kaWZpY2F0aW9uLiBSZS1zZW5kaW5nIHRoZSBwYXRjaCB3aXRo
IGJhc2U2NAogICAgICAgZW5jb2RpbmcgdG8gY29uc2VydmUgdGhlIHJpZ2h0IGxpbmUgZW5kaW5n
cy4gW0JvYl0KICAgIHY1OgogICAgIC0gTm8gbW9kaWZpY2F0aW9uLiBbUGllcnJlXQoKIEJhc2VU
b29scy9CaW5XcmFwcGVycy9Qb3NpeExpa2Uve0FtbFRvSGV4ID0+IEFtbFRvQ30gICAgICAgICAg
ICAgICB8IDI4ICsrKysrKysrKystLS0tLS0tLS0tCiBCYXNlVG9vbHMvQmluV3JhcHBlcnMvV2lu
ZG93c0xpa2Uve0FtbFRvSGV4LmJhdCA9PiBBbWxUb0MuYmF0fSAgICAgfCAgMAogQmFzZVRvb2xz
L1NvdXJjZS9QeXRob24ve0FtbFRvSGV4L0FtbFRvSGV4LnB5ID0+IEFtbFRvQy9BbWxUb0MucHl9
IHwgIDAKIDMgZmlsZXMgY2hhbmdlZCwgMTQgaW5zZXJ0aW9ucygrKSwgMTQgZGVsZXRpb25zKC0p
CgpkaWZmIC0tZ2l0IGEvQmFzZVRvb2xzL0JpbldyYXBwZXJzL1Bvc2l4TGlrZS9BbWxUb0hleCBi
L0Jhc2VUb29scy9CaW5XcmFwcGVycy9Qb3NpeExpa2UvQW1sVG9DCnNpbWlsYXJpdHkgaW5kZXgg
OTclCnJlbmFtZSBmcm9tIEJhc2VUb29scy9CaW5XcmFwcGVycy9Qb3NpeExpa2UvQW1sVG9IZXgK
cmVuYW1lIHRvIEJhc2VUb29scy9CaW5XcmFwcGVycy9Qb3NpeExpa2UvQW1sVG9DCmluZGV4IDlm
YjY4Mjk5ZTRjNjdkMWYzMzJjZDg4M2ZkMzQ4YTg5NmYxYmRjNTAuLjFkZDI4ZTk2NjI4OGY2ZWE0
ZmM1MmQ0MmUyZGM3YjFmNzQyMjZjMjMgMTAwNzU1Ci0tLSBhL0Jhc2VUb29scy9CaW5XcmFwcGVy
cy9Qb3NpeExpa2UvQW1sVG9IZXgKKysrIGIvQmFzZVRvb2xzL0JpbldyYXBwZXJzL1Bvc2l4TGlr
ZS9BbWxUb0MKQEAgLTEsMTQgKzEsMTQgQEAKLSMhL3Vzci9iaW4vZW52IGJhc2gNCi0jcHl0aG9u
IGBkaXJuYW1lICQwYC9SdW5Ub29sRnJvbVNvdXJjZS5weSBgYmFzZW5hbWUgJDBgICQqDQotDQot
IyBJZiBhICR7UFlUSE9OX0NPTU1BTkR9IGNvbW1hbmQgaXMgYXZhaWxhYmxlLCB1c2UgaXQgaW4g
cHJlZmVyZW5jZSB0byBweXRob24NCi1pZiBjb21tYW5kIC12ICR7UFlUSE9OX0NPTU1BTkR9ID4v
ZGV2L251bGwgMj4mMTsgdGhlbg0KLSAgICBweXRob25fZXhlPSR7UFlUSE9OX0NPTU1BTkR9DQot
ZmkNCi0NCi1mdWxsX2NtZD0ke0JBU0hfU09VUkNFOi0kMH0gIyBzZWUgaHR0cDovL215d2lraS53
b29sZWRnZS5vcmcvQmFzaEZBUS8wMjggZm9yIGEgZGlzY3Vzc2lvbiBvZiB3aHkgJDAgaXMgbm90
IGEgZ29vZCBjaG9pY2UgaGVyZQ0KLWRpcj0kKGRpcm5hbWUgIiRmdWxsX2NtZCIpDQotZXhlPSQo
YmFzZW5hbWUgIiRmdWxsX2NtZCIpDQotDQotZXhwb3J0IFBZVEhPTlBBVEg9IiRkaXIvLi4vLi4v
U291cmNlL1B5dGhvbiR7UFlUSE9OUEFUSDorOiIkUFlUSE9OUEFUSCJ9Ig0KLWV4ZWMgIiR7cHl0
aG9uX2V4ZTotcHl0aG9ufSIgIiRkaXIvLi4vLi4vU291cmNlL1B5dGhvbi8kZXhlLyRleGUucHki
ICIkQCINCisjIS91c3IvYmluL2VudiBiYXNoCisjcHl0aG9uIGBkaXJuYW1lICQwYC9SdW5Ub29s
RnJvbVNvdXJjZS5weSBgYmFzZW5hbWUgJDBgICQqCisKKyMgSWYgYSAke1BZVEhPTl9DT01NQU5E
fSBjb21tYW5kIGlzIGF2YWlsYWJsZSwgdXNlIGl0IGluIHByZWZlcmVuY2UgdG8gcHl0aG9uCitp
ZiBjb21tYW5kIC12ICR7UFlUSE9OX0NPTU1BTkR9ID4vZGV2L251bGwgMj4mMTsgdGhlbgorICAg
IHB5dGhvbl9leGU9JHtQWVRIT05fQ09NTUFORH0KK2ZpCisKK2Z1bGxfY21kPSR7QkFTSF9TT1VS
Q0U6LSQwfSAjIHNlZSBodHRwOi8vbXl3aWtpLndvb2xlZGdlLm9yZy9CYXNoRkFRLzAyOCBmb3Ig
YSBkaXNjdXNzaW9uIG9mIHdoeSAkMCBpcyBub3QgYSBnb29kIGNob2ljZSBoZXJlCitkaXI9JChk
aXJuYW1lICIkZnVsbF9jbWQiKQorZXhlPSQoYmFzZW5hbWUgIiRmdWxsX2NtZCIpCisKK2V4cG9y
dCBQWVRIT05QQVRIPSIkZGlyLy4uLy4uL1NvdXJjZS9QeXRob24ke1BZVEhPTlBBVEg6KzoiJFBZ
VEhPTlBBVEgifSIKK2V4ZWMgIiR7cHl0aG9uX2V4ZTotcHl0aG9ufSIgIiRkaXIvLi4vLi4vU291
cmNlL1B5dGhvbi8kZXhlLyRleGUucHkiICIkQCIKZGlmZiAtLWdpdCBhL0Jhc2VUb29scy9CaW5X
cmFwcGVycy9XaW5kb3dzTGlrZS9BbWxUb0hleC5iYXQgYi9CYXNlVG9vbHMvQmluV3JhcHBlcnMv
V2luZG93c0xpa2UvQW1sVG9DLmJhdApzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVuYW1lIGZyb20g
QmFzZVRvb2xzL0JpbldyYXBwZXJzL1dpbmRvd3NMaWtlL0FtbFRvSGV4LmJhdApyZW5hbWUgdG8g
QmFzZVRvb2xzL0JpbldyYXBwZXJzL1dpbmRvd3NMaWtlL0FtbFRvQy5iYXQKZGlmZiAtLWdpdCBh
L0Jhc2VUb29scy9Tb3VyY2UvUHl0aG9uL0FtbFRvSGV4L0FtbFRvSGV4LnB5IGIvQmFzZVRvb2xz
L1NvdXJjZS9QeXRob24vQW1sVG9DL0FtbFRvQy5weQpzaW1pbGFyaXR5IGluZGV4IDEwMCUKcmVu
YW1lIGZyb20gQmFzZVRvb2xzL1NvdXJjZS9QeXRob24vQW1sVG9IZXgvQW1sVG9IZXgucHkKcmVu
YW1lIHRvIEJhc2VUb29scy9Tb3VyY2UvUHl0aG9uL0FtbFRvQy9BbWxUb0MucHkKLS0gCidHdWlk
KENFMTY1NjY5LTNFRjMtNDkzRi1CODVELTYxOTBFRTVCOTc1OSknCgo=

[PATCH v5 1/5] BaseTools: PatchCheck: Exclude bash scripts from CRLF check

PierreGondois
 

RnJvbTogUGllcnJlIEdvbmRvaXMgPHBpZXJyZS5nb25kb2lzQGFybS5jb20+CgpCYXNoIHNjcmlw
dHMgcmVxdWlyZSBMRiBsaW5lIGVuZGluZ3MgdG8gd29yay4KUGF0Y2hDaGVjay5weSBjaGVja3Mg
dGhhdCB0aGUgZmlsZXMgYWRkZWQgaW4gYSBwYXRjaCBoYXZlIENSTEYKbGluZSBlbmRpbmdzLiBJ
dCBleGNsdWRlcyBmaWxlcyBlbmRpbmcgd2l0aCB0aGUgIi5zaCIgZXh0ZW5zaW9uCmZyb20gdGhp
cyBjaGVjay4KClNvbWUgYmFzaCBzY3JpcHQgZG9uJ3QgaGF2ZSBhICIuc2giIGV4dGVuc2lvbi4g
TW9zdCBvZiB0aGVtIGFyZQpsb2NhdGVkIGluOgogLSBCYXNlVG9vbHMvQmluV3JhcHBlcnMvUG9z
aXhMaWtlLwogLSBCYXNlVG9vbHMvQmluL0NZR1dJTl9OVC01LjEtaTY4Ni8KClRoaXMgcGF0Y2gg
ZXhjbHVkZXMgdGhlc2UgZm9sZGVyIHBsdXMgQmFzZVRvb2xzL0J1aWxkRW52IGZyb20KdGhpcyBD
UkxGIGNoZWNrLgoKU2lnbmVkLW9mZi1ieTogUGllcnJlIEdvbmRvaXMgPHBpZXJyZS5nb25kb2lz
QGFybS5jb20+Ci0tLQoKVGhlIGNoYW5nZXMgY2FuIGJlIHNlZW4gYXQ6IGh0dHBzOi8vZ2l0aHVi
LmNvbS9QaWVycmVBUk0vZWRrMi9jb21taXRzLzgwM19Db21waWxlX0FNTF9ieXRlY29kZV9hcnJh
eV9pbnRvX09CSl9maWxlX3Y1CgpOb3RlczoKICAgIHY1OgogICAgIC0gRXhjbHVkZSBzb21lIGRp
cmVjdG9yaWVzL2ZpbGVzIGhhdmluZyBMRiBsaW5lCiAgICAgICBlbmRpbmdzIGZyb20gdGhlIFBh
dGNoQ2hlY2sscHkgc2NyaXB0LiBbQm9iXQoKIEJhc2VUb29scy9TY3JpcHRzL1BhdGNoQ2hlY2su
cHkgfCA4ICsrKysrKystCiAxIGZpbGUgY2hhbmdlZCwgNyBpbnNlcnRpb25zKCspLCAxIGRlbGV0
aW9uKC0pCgpkaWZmIC0tZ2l0IGEvQmFzZVRvb2xzL1NjcmlwdHMvUGF0Y2hDaGVjay5weSBiL0Jh
c2VUb29scy9TY3JpcHRzL1BhdGNoQ2hlY2sucHkKaW5kZXggMTA2YjQzNGM3NTBkNzFkOGFhMTY1
ODEwOWYxNDZkYzA2NjYzM2MyYy4uZTM4Y2Y2MWY5M2RhNTBmNzdkNGUxZTJlMzdkZTVmNmEwOGQy
NTQwOCAxMDA3NTUKLS0tIGEvQmFzZVRvb2xzL1NjcmlwdHMvUGF0Y2hDaGVjay5weQorKysgYi9C
YXNlVG9vbHMvU2NyaXB0cy9QYXRjaENoZWNrLnB5CkBAIC0zLDYgKzMsNyBAQAogIw0KICMgIENv
cHlyaWdodCAoYykgMjAxNSAtIDIwMjAsIEludGVsIENvcnBvcmF0aW9uLiBBbGwgcmlnaHRzIHJl
c2VydmVkLjxCUj4NCiAjICBDb3B5cmlnaHQgKEMpIDIwMjAsIFJlZCBIYXQsIEluYy48QlI+DQor
IyAgQ29weXJpZ2h0IChjKSAyMDIwLCBBUk0gTHRkLiBBbGwgcmlnaHRzIHJlc2VydmVkLjxCUj4N
CiAjDQogIyAgU1BEWC1MaWNlbnNlLUlkZW50aWZpZXI6IEJTRC0yLUNsYXVzZS1QYXRlbnQNCiAj
DQpAQCAtMzg0LDkgKzM4NSwxNCBAQCBjbGFzcyBHaXREaWZmQ2hlY2s6CiAgICAgICAgICAgICAg
ICAgc2VsZi5pc19uZXdmaWxlID0gRmFsc2UNCiAgICAgICAgICAgICAgICAgc2VsZi5mb3JjZV9j
cmxmID0gVHJ1ZQ0KICAgICAgICAgICAgICAgICBzZWxmLmZvcmNlX25vdGFicyA9IFRydWUNCi0g
ICAgICAgICAgICAgICAgaWYgc2VsZi5maWxlbmFtZS5lbmRzd2l0aCgnLnNoJyk6DQorICAgICAg
ICAgICAgICAgIGlmIHNlbGYuZmlsZW5hbWUuZW5kc3dpdGgoJy5zaCcpIG9yIFwNCisgICAgICAg
ICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUuc3RhcnRzd2l0aCgnQmFzZVRvb2xzL0JpbldyYXBw
ZXJzL1Bvc2l4TGlrZS8nKSBvciBcDQorICAgICAgICAgICAgICAgICAgICBzZWxmLmZpbGVuYW1l
LnN0YXJ0c3dpdGgoJ0Jhc2VUb29scy9CaW4vQ1lHV0lOX05ULTUuMS1pNjg2LycpIG9yIFwNCisg
ICAgICAgICAgICAgICAgICAgIHNlbGYuZmlsZW5hbWUgPT0gJ0Jhc2VUb29scy9CdWlsZEVudic6
DQogICAgICAgICAgICAgICAgICAgICAjDQogICAgICAgICAgICAgICAgICAgICAjIERvIG5vdCBl
bmZvcmNlIENSL0xGIGxpbmUgZW5kaW5ncyBmb3IgbGludXggc2hlbGwgc2NyaXB0cy4NCisgICAg
ICAgICAgICAgICAgICAgICMgU29tZSBsaW51eCBzaGVsbCBzY3JpcHRzIGRvbid0IGVuZCB3aXRo
IHRoZSAiLnNoIiBleHRlbnNpb24sDQorICAgICAgICAgICAgICAgICAgICAjIHRoZXkgYXJlIGlk
ZW50aWZpZWQgYnkgdGhlaXIgcGF0aC4NCiAgICAgICAgICAgICAgICAgICAgICMNCiAgICAgICAg
ICAgICAgICAgICAgIHNlbGYuZm9yY2VfY3JsZiA9IEZhbHNlDQogICAgICAgICAgICAgICAgIGlm
IHNlbGYuZmlsZW5hbWUgPT0gJy5naXRtb2R1bGVzJzoNCi0tIAonR3VpZChDRTE2NTY2OS0zRUYz
LTQ5M0YtQjg1RC02MTkwRUU1Qjk3NTkpJwoK

[PATCH 11/11] Maintainers.txt: Add myself as the reviewer for LsiScsi driver

Gary Lin
 

Cc: Jordan Justen <jordan.l.justen@...>
Cc: Laszlo Ersek <lersek@...>
Cc: Ard Biesheuvel <ard.biesheuvel@...>
Signed-off-by: Gary Lin <glin@...>
---
Maintainers.txt | 4 ++++
1 file changed, 4 insertions(+)

diff --git a/Maintainers.txt b/Maintainers.txt
index 32c9003a6209..666d3af4d76a 100644
--- a/Maintainers.txt
+++ b/Maintainers.txt
@@ -400,6 +400,10 @@ OvmfPkg: CSM modules
F: OvmfPkg/Csm/
R: David Woodhouse <dwmw2@...>

+OvmfPkg: LsiScsi Driver
+F: OvmfPkg/LsiScsiDxe/
+R: Gary Lin <glin@...>
+
OvmfPkg: MptScsi and PVSCSI driver
F: OvmfPkg/MptScsiDxe/
F: OvmfPkg/PvScsiDxe/
--
2.25.1

[PATCH 10/11] OvmfPkg/LsiScsiDxe: Process the SCSI Request Packet

Gary Lin
 

This is the second part of LsiScsiPassThru(). LsiScsiProcessRequest() is
added to translate the SCSI Request Packet into the LSI 53C895A
commands. This function utilizes the so-called Script buffer to transmit
a series of commands to the chip and then polls the DMA Status (DSTAT)
register until the Scripts Interrupt Instruction Received (SIR) bit
sets. Once the script is done, the SCSI Request Packet will be modified
to reflect the result of the script.

Cc: Jordan Justen <jordan.l.justen@...>
Cc: Laszlo Ersek <lersek@...>
Cc: Ard Biesheuvel <ard.biesheuvel@...>
Signed-off-by: Gary Lin <glin@...>
---
OvmfPkg/Include/IndustryStandard/LsiScsi.h | 39 +++
OvmfPkg/LsiScsiDxe/LsiScsi.c | 308 +++++++++++++++++++++
OvmfPkg/LsiScsiDxe/LsiScsi.h | 21 ++
OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf | 3 +
OvmfPkg/OvmfPkg.dec | 3 +
5 files changed, 374 insertions(+)

diff --git a/OvmfPkg/Include/IndustryStandard/LsiScsi.h b/OvmfPkg/Include/IndustryStandard/LsiScsi.h
index 60e527f1c6a7..cbf049c18310 100644
--- a/OvmfPkg/Include/IndustryStandard/LsiScsi.h
+++ b/OvmfPkg/Include/IndustryStandard/LsiScsi.h
@@ -26,6 +26,18 @@
#define LSI_REG_SIST0 0x42
#define LSI_REG_SIST1 0x43

+//
+// The status bits for DMA Status (DSTAT)
+//
+#define LSI_DSTAT_IID 0x01
+#define LSI_DSTAT_R 0x02
+#define LSI_DSTAT_SIR 0x04
+#define LSI_DSTAT_SSI 0x08
+#define LSI_DSTAT_ABRT 0x10
+#define LSI_DSTAT_BF 0x20
+#define LSI_DSTAT_MDPE 0x40
+#define LSI_DSTAT_DFE 0x80
+
//
// The status bits for Interrupt Status Zero (ISTAT0)
//
@@ -38,4 +50,31 @@
#define LSI_ISTAT0_SRST 0x40
#define LSI_ISTAT0_ABRT 0x80

+//
+// LSI 53C895A Script Instructions
+//
+#define LSI_INS_TYPE_BLK 0x00000000
+#define LSI_INS_TYPE_IO 0x40000000
+#define LSI_INS_TYPE_TC 0x80000000
+
+#define LSI_INS_BLK_SCSIP_DAT_OUT 0x00000000
+#define LSI_INS_BLK_SCSIP_DAT_IN 0x01000000
+#define LSI_INS_BLK_SCSIP_CMD 0x02000000
+#define LSI_INS_BLK_SCSIP_STAT 0x03000000
+#define LSI_INS_BLK_SCSIP_MSG_OUT 0x06000000
+#define LSI_INS_BLK_SCSIP_MSG_IN 0x07000000
+
+#define LSI_INS_IO_OPC_SEL 0x00000000
+#define LSI_INS_IO_OPC_WAIT_RESEL 0x10000000
+
+#define LSI_INS_TC_CP 0x00020000
+#define LSI_INS_TC_JMP 0x00080000
+#define LSI_INS_TC_RA 0x00800000
+
+#define LSI_INS_TC_OPC_JMP 0x00000000
+#define LSI_INS_TC_OPC_INT 0x18000000
+
+#define LSI_INS_TC_SCSIP_DAT_OUT 0x00000000
+#define LSI_INS_TC_SCSIP_MSG_IN 0x07000000
+
#endif // _LSI_SCSI_H_
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.c b/OvmfPkg/LsiScsiDxe/LsiScsi.c
index 1bcebd92e455..090d7df15b34 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.c
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.c
@@ -43,6 +43,42 @@ Out8 (
);
}

+STATIC
+EFI_STATUS
+Out32 (
+ IN LSI_SCSI_DEV *Dev,
+ IN UINT32 Addr,
+ IN UINT32 Data
+ )
+{
+ return Dev->PciIo->Io.Write (
+ Dev->PciIo,
+ EfiPciIoWidthUint32,
+ PCI_BAR_IDX0,
+ Addr,
+ 1,
+ &Data
+ );
+}
+
+STATIC
+EFI_STATUS
+In8 (
+ IN LSI_SCSI_DEV *Dev,
+ IN UINT32 Addr,
+ OUT UINT8 *Data
+ )
+{
+ return Dev->PciIo->Io.Read (
+ Dev->PciIo,
+ EfiPciIoWidthUint8,
+ PCI_BAR_IDX0,
+ Addr,
+ 1,
+ Data
+ );
+}
+
STATIC
EFI_STATUS
LsiScsiReset (
@@ -141,6 +177,272 @@ LsiScsiCheckRequest (
return EFI_SUCCESS;
}

+/**
+
+ Interpret the request packet from the Extended SCSI Pass Thru Protocol and
+ compose the script to submit the command and data to the contorller.
+
+ @param[in] Dev The LSI 53C895A SCSI device the packet targets.
+
+ @param[in] Target The SCSI target controlled by the LSI 53C895A SCSI
+ device.
+
+ @param[in] Lun The Logical Unit Number under the SCSI target.
+
+ @param[in out] Packet The Extended SCSI Pass Thru Protocol packet.
+
+
+ @retval EFI_SUCCESS The Extended SCSI Pass Thru Protocol packet was valid.
+
+ @return Otherwise, invalid or unsupported parameters were
+ detected. Status codes are meant for direct forwarding
+ by the EFI_EXT_SCSI_PASS_THRU_PROTOCOL.PassThru()
+ implementation.
+
+ **/
+STATIC
+EFI_STATUS
+LsiScsiProcessRequest (
+ IN LSI_SCSI_DEV *Dev,
+ IN UINT8 Target,
+ IN UINT64 Lun,
+ IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
+ )
+{
+ EFI_STATUS Status;
+ UINT32 *Script;
+ UINT8 *Cdb;
+ UINT8 *MsgOut;
+ UINT8 *MsgIn;
+ UINT8 *ScsiStatus;
+ UINT8 *Data;
+ UINT8 DStat;
+ UINT8 SIst0;
+ UINT8 SIst1;
+
+ Script = Dev->Dma->Script;
+ Cdb = Dev->Dma->Cdb;
+ Data = Dev->Dma->Data;
+ MsgIn = Dev->Dma->MsgIn;
+ MsgOut = &Dev->Dma->MsgOut;
+ ScsiStatus = &Dev->Dma->Status;
+
+ *ScsiStatus = 0xFF;
+
+ SetMem (Cdb, sizeof Dev->Dma->Cdb, 0x00);
+ CopyMem (Cdb, Packet->Cdb, Packet->CdbLength);
+
+ //
+ // Clean up the DMA buffer for the script.
+ //
+ SetMem (Script, sizeof Dev->Dma->Script, 0x00);
+
+ //
+ // Compose the script to transfer data between the host and the device.
+ //
+ // Reference:
+ // LSI53C895A PCI to Ultra2 SCSI Controller Version 2.2
+ // - Chapter 5 SCSI SCRIPT Instruction Set
+ //
+ // All instructions used here consist of 2 32bit words. The first word
+ // contains the command to execute. The second word is loaded into the
+ // DMA SCRIPTS Pointer Save (DSPS) register as either the DMA address
+ // for data transmission or the address/offset for the jump command.
+ // Some commands, such as the selection of the target, don't need to
+ // transfer data through DMA or jump to another instruction, then DSPS
+ // has to be zero.
+ //
+ // There are 3 major parts in this script. The first part (1~3) contains
+ // the instructions to select target and LUN and send the SCSI command
+ // from the request packet. The second part (4~7) is to handle the
+ // potential disconnection and prepare for the data transmission. The
+ // instructions in the third part (8~10) transmit the given data and
+ // collect the result. Instruction 11 raises the interrupt and marks the
+ // end of the script.
+ //
+
+ //
+ // 1. Select target.
+ //
+ *Script++ = LSI_INS_TYPE_IO | LSI_INS_IO_OPC_SEL | (UINT32)Target << 16;
+ *Script++ = 0x00000000;
+
+ //
+ // 2. Select LUN.
+ //
+ *MsgOut = 0x80 | (UINT8) Lun; // 0x80: Identify bit
+ *Script++ = LSI_INS_TYPE_BLK | LSI_INS_BLK_SCSIP_MSG_OUT | \
+ sizeof Dev->Dma->MsgOut;
+ *Script++ = LSI_SCSI_DMA_ADDR_LOW (Dev, MsgOut);
+
+ //
+ // 3. Send the SCSI Command.
+ //
+ *Script++ = LSI_INS_TYPE_BLK | LSI_INS_BLK_SCSIP_CMD | \
+ sizeof Dev->Dma->Cdb;
+ *Script++ = LSI_SCSI_DMA_ADDR_LOW (Dev, Cdb);
+
+ //
+ // 4. Check whether the current SCSI phase is "Message In" or not
+ // and jump to 8 if it is.
+ //
+ *Script++ = LSI_INS_TYPE_TC | LSI_INS_TC_OPC_JMP | \
+ LSI_INS_TC_SCSIP_MSG_IN | LSI_INS_TC_RA | \
+ LSI_INS_TC_CP;
+ *Script++ = 0x00000018;
+
+ //
+ // 5. Read "Message" from the initiator to trigger reselect.
+ //
+ *Script++ = LSI_INS_TYPE_BLK | LSI_INS_BLK_SCSIP_MSG_IN | \
+ sizeof Dev->Dma->MsgIn;
+ *Script++ = LSI_SCSI_DMA_ADDR_LOW (Dev, MsgIn);
+
+ //
+ // 6. Wait reselect.
+ //
+ *Script++ = LSI_INS_TYPE_IO | LSI_INS_IO_OPC_WAIT_RESEL;
+ *Script++ = 0x00000000;
+
+ //
+ // 7. Read "Message" from the initiator again
+ //
+ *Script++ = LSI_INS_TYPE_BLK | LSI_INS_BLK_SCSIP_MSG_IN | \
+ sizeof Dev->Dma->MsgIn;
+ *Script++ = LSI_SCSI_DMA_ADDR_LOW (Dev, MsgIn);
+
+ //
+ // 8. Set the DMA command for the read/write operations.
+ //
+ if (Packet->DataDirection == EFI_EXT_SCSI_DATA_DIRECTION_READ &&
+ Packet->InTransferLength > 0) {
+ *Script++ = LSI_INS_TYPE_BLK | LSI_INS_BLK_SCSIP_DAT_IN | \
+ Packet->InTransferLength;
+ *Script++ = LSI_SCSI_DMA_ADDR_LOW (Dev, Data);
+ } else if (Packet->DataDirection == EFI_EXT_SCSI_DATA_DIRECTION_WRITE &&
+ Packet->OutTransferLength > 0) {
+ // LsiScsiCheckRequest() guarantees that OutTransferLength is no
+ // larger than sizeof Dev->Dma->Data, so we can safely copy the
+ // the data to Dev->Dma->Data.
+ CopyMem (Data, Packet->OutDataBuffer, Packet->OutTransferLength);
+ *Script++ = LSI_INS_TYPE_BLK | LSI_INS_BLK_SCSIP_DAT_OUT | \
+ Packet->OutTransferLength;
+ *Script++ = LSI_SCSI_DMA_ADDR_LOW (Dev, Data);
+ }
+
+ //
+ // 9. Get the SCSI status.
+ //
+ *Script++ = LSI_INS_TYPE_BLK | LSI_INS_BLK_SCSIP_STAT | \
+ sizeof Dev->Dma->Status;
+ *Script++ = LSI_SCSI_DMA_ADDR_LOW (Dev, Status);
+
+ //
+ // 10. Get the SCSI message.
+ //
+ *Script++ = LSI_INS_TYPE_BLK | LSI_INS_BLK_SCSIP_MSG_IN | \
+ sizeof Dev->Dma->MsgIn;
+ *Script++ = LSI_SCSI_DMA_ADDR_LOW (Dev, MsgIn);
+
+ //
+ // 11. Raise the interrupt to end the script.
+ //
+ *Script++ = LSI_INS_TYPE_TC | LSI_INS_TC_OPC_INT | \
+ LSI_INS_TC_SCSIP_DAT_OUT | LSI_INS_TC_JMP;
+ *Script++ = 0x00000000;
+
+ //
+ // Make sure the size of the script doesn't exceed the buffer.
+ //
+ ASSERT (Script < Dev->Dma->Script + sizeof Dev->Dma->Script);
+
+ //
+ // The controller starts to execute the script once the DMA Script
+ // Pointer (DSP) register is set.
+ //
+ Status = Out32 (Dev, LSI_REG_DSP, LSI_SCSI_DMA_ADDR_LOW(Dev, Script));
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ //
+ // Poll the device registers (DSTAT, SIST0, and SIST1) until the SIR
+ // bit sets.
+ //
+ for(;;) {
+ Status = In8 (Dev, LSI_REG_DSTAT, &DStat);
+ if (EFI_ERROR (Status)) {
+ goto Error;
+ }
+ Status = In8 (Dev, LSI_REG_SIST0, &SIst0);
+ if (EFI_ERROR (Status)) {
+ goto Error;
+ }
+ Status = In8 (Dev, LSI_REG_SIST1, &SIst1);
+ if (EFI_ERROR (Status)) {
+ goto Error;
+ }
+
+ if (SIst0 != 0 || SIst1 != 0) {
+ goto Error;
+ }
+
+ //
+ // Check the SIR (SCRIPTS Interrupt Instruction Received) bit.
+ //
+ if (DStat & LSI_DSTAT_SIR) {
+ break;
+ }
+
+ gBS->Stall (Dev->StallPerPollUsec);
+ }
+
+ //
+ // Check if everything is good.
+ // SCSI Message Code 0x00: COMMAND COMPLETE
+ // SCSI Status Code 0x00: Good
+ //
+ if (MsgIn[0] == 0 && *ScsiStatus == 0) {
+ //
+ // Copy Data to InDataBuffer if necessary.
+ //
+ if (Packet->DataDirection == EFI_EXT_SCSI_DATA_DIRECTION_READ) {
+ CopyMem (Packet->InDataBuffer, Data, Packet->InTransferLength);
+ }
+
+ //
+ // The controller doesn't return sense data when replying "TEST UNIT READY",
+ // so we have to set SenseDataLength to 0 to notify ScsiIo to issue
+ // "REQUEST SENSE" for the sense data.
+ //
+ if (Cdb[0] == 0x00) {
+ Packet->SenseDataLength = 0;
+ }
+ Packet->HostAdapterStatus = EFI_EXT_SCSI_STATUS_HOST_ADAPTER_OK;
+ Packet->TargetStatus = EFI_EXT_SCSI_STATUS_TARGET_GOOD;
+
+ return EFI_SUCCESS;
+ }
+
+Error:
+ DEBUG((DEBUG_VERBOSE, "%a: dstat: %02X, sist0: %02X, sist1: %02X\n",
+ __FUNCTION__, DStat, SIst0, SIst1));
+ //
+ // Update the request packet to reflect the status.
+ //
+ if (*ScsiStatus != 0xFF) {
+ Packet->TargetStatus = *ScsiStatus;
+ } else {
+ Packet->TargetStatus = EFI_EXT_SCSI_STATUS_TARGET_TASK_ABORTED;
+ }
+ Packet->HostAdapterStatus = EFI_EXT_SCSI_STATUS_HOST_ADAPTER_OTHER;
+ Packet->InTransferLength = 0;
+ Packet->OutTransferLength = 0;
+ Packet->SenseDataLength = 0;
+
+ return EFI_DEVICE_ERROR;
+}
+
//
// The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL
// for the LSI 53C895A SCSI Controller. Refer to UEFI Spec 2.3.1 + Errata C,
@@ -168,6 +470,11 @@ LsiScsiPassThru (
return Status;
}

+ Status = LsiScsiProcessRequest (Dev, *Target, Lun, Packet);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
return EFI_SUCCESS;
}

@@ -469,6 +776,7 @@ LsiScsiControllerStart (

Dev->MaxTarget = PcdGet8 (PcdLsiScsiMaxTargetLimit);
Dev->MaxLun = PcdGet8 (PcdLsiScsiMaxLunLimit);
+ Dev->StallPerPollUsec = PcdGet32 (PcdLsiScsiStallPerPollUsec);

Status = gBS->OpenProtocol (
ControllerHandle,
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.h b/OvmfPkg/LsiScsiDxe/LsiScsi.h
index 9272eb7506c7..1a16ef9f7795 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.h
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.h
@@ -13,6 +13,11 @@
#define _LSI_SCSI_DXE_H_

typedef struct {
+ //
+ // Allocate 32 UINT32 entries for the script and it's sufficient for
+ // 16 instructions.
+ //
+ UINT32 Script[32];
//
// The max size of CDB is 32.
//
@@ -21,6 +26,18 @@ typedef struct {
// Allocate 64KB for read/write buffer.
//
UINT8 Data[0x10000];
+ //
+ // For SCSI Message In phase
+ //
+ UINT8 MsgIn[2];
+ //
+ // For SCSI Message Out phase
+ //
+ UINT8 MsgOut;
+ //
+ // For SCSI Status phase
+ //
+ UINT8 Status;
} LSI_SCSI_DMA_BUFFER;

typedef struct {
@@ -30,6 +47,7 @@ typedef struct {
EFI_PCI_IO_PROTOCOL *PciIo;
UINT8 MaxTarget;
UINT8 MaxLun;
+ UINT32 StallPerPollUsec;
LSI_SCSI_DMA_BUFFER *Dma;
EFI_PHYSICAL_ADDRESS DmaPhysical;
VOID *DmaMapping;
@@ -42,6 +60,9 @@ typedef struct {
#define LSI_SCSI_FROM_PASS_THRU(PassThruPtr) \
CR (PassThruPtr, LSI_SCSI_DEV, PassThru, LSI_SCSI_DEV_SIGNATURE)

+#define LSI_SCSI_DMA_ADDR_LOW(Dev, MemberName) \
+ ((UINT32)(Dev->DmaPhysical + OFFSET_OF (LSI_SCSI_DMA_BUFFER, MemberName)))
+

//
// Probe, start and stop functions of this driver, called by the DXE core for
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
index 68844c6772e3..cbd7294573ac 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
+++ b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
@@ -41,3 +41,6 @@ [Protocols]
[FixedPcd]
gUefiOvmfPkgTokenSpaceGuid.PcdLsiScsiMaxTargetLimit ## CONSUMES
gUefiOvmfPkgTokenSpaceGuid.PcdLsiScsiMaxLunLimit ## CONSUMES
+
+[Pcd]
+ gUefiOvmfPkgTokenSpaceGuid.PcdLsiScsiStallPerPollUsec ## CONSUMES
diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
index ae7d1d648d22..57e418d4b8a9 100644
--- a/OvmfPkg/OvmfPkg.dec
+++ b/OvmfPkg/OvmfPkg.dec
@@ -179,6 +179,9 @@ [PcdsFixedAtBuild]
gUefiOvmfPkgTokenSpaceGuid.PcdLsiScsiMaxTargetLimit|7|UINT8|0x3b
gUefiOvmfPkgTokenSpaceGuid.PcdLsiScsiMaxLunLimit|0|UINT8|0x3c

+ ## Microseconds to stall between polling for LsiScsi request result
+ gUefiOvmfPkgTokenSpaceGuid.PcdLsiScsiStallPerPollUsec|5|UINT32|0x3d
+
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogBase|0x0|UINT32|0x8
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogSize|0x0|UINT32|0x9
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x0|UINT32|0xa
--
2.25.1

[PATCH 09/11] OvmfPkg/LsiScsiDxe: Examine the incoming SCSI Request Packet

Gary Lin
 

This is the first part of LsiScsiPassThru(). Before processing the SCSI
Request packet, we have to make sure whether the packet is valid or not.

Cc: Jordan Justen <jordan.l.justen@...>
Cc: Laszlo Ersek <lersek@...>
Cc: Ard Biesheuvel <ard.biesheuvel@...>
Signed-off-by: Gary Lin <glin@...>
---
OvmfPkg/LsiScsiDxe/LsiScsi.c | 100 ++++++++++++++++++++++++++++++++++-
OvmfPkg/LsiScsiDxe/LsiScsi.h | 4 ++
2 files changed, 103 insertions(+), 1 deletion(-)

diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.c b/OvmfPkg/LsiScsiDxe/LsiScsi.c
index b728d18d51df..1bcebd92e455 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.c
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.c
@@ -52,6 +52,95 @@ LsiScsiReset (
return Out8 (Dev, LSI_REG_ISTAT0, LSI_ISTAT0_SRST);
}

+STATIC
+EFI_STATUS
+ReportHostAdapterOverrunError (
+ OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
+ )
+{
+ Packet->SenseDataLength = 0;
+ Packet->HostAdapterStatus =
+ EFI_EXT_SCSI_STATUS_HOST_ADAPTER_DATA_OVERRUN_UNDERRUN;
+ Packet->TargetStatus = EFI_EXT_SCSI_STATUS_TARGET_GOOD;
+ return EFI_BAD_BUFFER_SIZE;
+}
+
+/**
+
+ Check the request packet from the Extended SCSI Pass Thru Protocol. The
+ request packet is modified, to be forwarded outwards by LsiScsiPassThru(),
+ if invalid or unsupported parameters are detected.
+
+ @param[in] Dev The LSI 53C895A SCSI device the packet targets.
+
+ @param[in] Target The SCSI target controlled by the LSI 53C895A SCSI
+ device.
+
+ @param[in] Lun The Logical Unit Number under the SCSI target.
+
+ @param[in out] Packet The Extended SCSI Pass Thru Protocol packet.
+
+
+ @retval EFI_SUCCESS The Extended SCSI Pass Thru Protocol packet was valid.
+
+ @return Otherwise, invalid or unsupported parameters were
+ detected. Status codes are meant for direct forwarding
+ by the EFI_EXT_SCSI_PASS_THRU_PROTOCOL.PassThru()
+ implementation.
+
+ **/
+STATIC
+EFI_STATUS
+LsiScsiCheckRequest (
+ IN LSI_SCSI_DEV *Dev,
+ IN UINT8 Target,
+ IN UINT64 Lun,
+ IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet
+ )
+{
+ if (Target > Dev->MaxTarget || Lun > Dev->MaxLun ||
+ Packet->DataDirection > EFI_EXT_SCSI_DATA_DIRECTION_BIDIRECTIONAL ||
+ //
+ // Trying to receive, but destination pointer is NULL, or contradicting
+ // transfer direction
+ //
+ (Packet->InTransferLength > 0 &&
+ (Packet->InDataBuffer == NULL ||
+ Packet->DataDirection == EFI_EXT_SCSI_DATA_DIRECTION_WRITE
+ )
+ ) ||
+
+ //
+ // Trying to send, but source pointer is NULL, or contradicting transfer
+ // direction
+ //
+ (Packet->OutTransferLength > 0 &&
+ (Packet->OutDataBuffer == NULL ||
+ Packet->DataDirection == EFI_EXT_SCSI_DATA_DIRECTION_READ
+ )
+ )
+ ) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (Packet->DataDirection == EFI_EXT_SCSI_DATA_DIRECTION_BIDIRECTIONAL ||
+ (Packet->InTransferLength > 0 && Packet->OutTransferLength > 0) ||
+ Packet->CdbLength > sizeof Dev->Dma->Cdb) {
+ return EFI_UNSUPPORTED;
+ }
+
+ if (Packet->InTransferLength > sizeof Dev->Dma->Data) {
+ Packet->InTransferLength = sizeof Dev->Dma->Data;
+ return ReportHostAdapterOverrunError (Packet);
+ }
+ if (Packet->OutTransferLength > sizeof Dev->Dma->Data) {
+ Packet->OutTransferLength = sizeof Dev->Dma->Data;
+ return ReportHostAdapterOverrunError (Packet);
+ }
+
+ return EFI_SUCCESS;
+}
+
//
// The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL
// for the LSI 53C895A SCSI Controller. Refer to UEFI Spec 2.3.1 + Errata C,
@@ -70,7 +159,16 @@ LsiScsiPassThru (
IN EFI_EVENT Event OPTIONAL
)
{
- return EFI_UNSUPPORTED;
+ EFI_STATUS Status;
+ LSI_SCSI_DEV *Dev;
+
+ Dev = LSI_SCSI_FROM_PASS_THRU (This);
+ Status = LsiScsiCheckRequest (Dev, *Target, Lun, Packet);
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ return EFI_SUCCESS;
}

EFI_STATUS
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.h b/OvmfPkg/LsiScsiDxe/LsiScsi.h
index 1e4bbc56f933..9272eb7506c7 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.h
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.h
@@ -13,6 +13,10 @@
#define _LSI_SCSI_DXE_H_

typedef struct {
+ //
+ // The max size of CDB is 32.
+ //
+ UINT8 Cdb[32];
//
// Allocate 64KB for read/write buffer.
//
--
2.25.1

[PATCH 08/11] OvmfPkg/LsiScsiDxe: Map DMA buffer

Gary Lin
 

Map DMA buffer and perpare for the implementation of LsiScsiPassThru().

Cc: Jordan Justen <jordan.l.justen@...>
Cc: Laszlo Ersek <lersek@...>
Cc: Ard Biesheuvel <ard.biesheuvel@...>
Signed-off-by: Gary Lin <glin@...>
---
OvmfPkg/LsiScsiDxe/LsiScsi.c | 85 +++++++++++++++++++++++++++++++++++-
OvmfPkg/LsiScsiDxe/LsiScsi.h | 10 +++++
2 files changed, 94 insertions(+), 1 deletion(-)

diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.c b/OvmfPkg/LsiScsiDxe/LsiScsi.c
index f03774cc4ced..b728d18d51df 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.c
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.c
@@ -359,6 +359,8 @@ LsiScsiControllerStart (
{
EFI_STATUS Status;
LSI_SCSI_DEV *Dev;
+ UINTN Pages;
+ UINTN BytesMapped;

Dev = AllocateZeroPool (sizeof (*Dev));
if (Dev == NULL) {
@@ -406,11 +408,68 @@ LsiScsiControllerStart (
goto CloseProtocol;
}

- Status = LsiScsiReset (Dev);
+ //
+ // Signal device supports 64-bit DMA addresses
+ //
+ Status = Dev->PciIo->Attributes (
+ Dev->PciIo,
+ EfiPciIoAttributeOperationEnable,
+ EFI_PCI_IO_ATTRIBUTE_DUAL_ADDRESS_CYCLE,
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ //
+ // Warn user that device will only be using 32-bit DMA addresses.
+ //
+ // Note that this does not prevent the device/driver from working
+ // and therefore we only warn and continue as usual.
+ //
+ DEBUG ((
+ DEBUG_WARN,
+ "%a: failed to enable 64-bit DMA addresses\n",
+ __FUNCTION__
+ ));
+ }
+
+ //
+ // Create buffers for data transfer
+ //
+ Pages = EFI_SIZE_TO_PAGES (sizeof (*Dev->Dma));
+ Status = Dev->PciIo->AllocateBuffer (
+ Dev->PciIo,
+ AllocateAnyPages,
+ EfiBootServicesData,
+ Pages,
+ (VOID **)&Dev->Dma,
+ EFI_PCI_ATTRIBUTE_MEMORY_CACHED
+ );
if (EFI_ERROR (Status)) {
goto RestoreAttributes;
}

+ BytesMapped = EFI_PAGES_TO_SIZE (Pages);
+ Status = Dev->PciIo->Map (
+ Dev->PciIo,
+ EfiPciIoOperationBusMasterCommonBuffer,
+ Dev->Dma,
+ &BytesMapped,
+ &Dev->DmaPhysical,
+ &Dev->DmaMapping
+ );
+ if (EFI_ERROR (Status)) {
+ goto FreeBuffer;
+ }
+
+ if (BytesMapped != EFI_PAGES_TO_SIZE (Pages)) {
+ Status = EFI_OUT_OF_RESOURCES;
+ goto Unmap;
+ }
+
+ Status = LsiScsiReset (Dev);
+ if (EFI_ERROR (Status)) {
+ goto Unmap;
+ }
+
Status = gBS->CreateEvent (
EVT_SIGNAL_EXIT_BOOT_SERVICES,
TPL_CALLBACK,
@@ -457,6 +516,19 @@ CloseExitBoot:
UninitDev:
LsiScsiReset (Dev);

+Unmap:
+ Dev->PciIo->Unmap (
+ Dev->PciIo,
+ Dev->DmaMapping
+ );
+
+FreeBuffer:
+ Dev->PciIo->FreeBuffer (
+ Dev->PciIo,
+ Pages,
+ Dev->Dma
+ );
+
RestoreAttributes:
Dev->PciIo->Attributes (
Dev->PciIo,
@@ -519,6 +591,17 @@ LsiScsiControllerStop (

LsiScsiReset (Dev);

+ Dev->PciIo->Unmap (
+ Dev->PciIo,
+ Dev->DmaMapping
+ );
+
+ Dev->PciIo->FreeBuffer (
+ Dev->PciIo,
+ EFI_SIZE_TO_PAGES (sizeof (*Dev->Dma)),
+ Dev->Dma
+ );
+
Dev->PciIo->Attributes (
Dev->PciIo,
EfiPciIoAttributeOperationSet,
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.h b/OvmfPkg/LsiScsiDxe/LsiScsi.h
index ffaee6188536..1e4bbc56f933 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.h
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.h
@@ -12,6 +12,13 @@
#ifndef _LSI_SCSI_DXE_H_
#define _LSI_SCSI_DXE_H_

+typedef struct {
+ //
+ // Allocate 64KB for read/write buffer.
+ //
+ UINT8 Data[0x10000];
+} LSI_SCSI_DMA_BUFFER;
+
typedef struct {
UINT32 Signature;
UINT64 OrigPciAttrs;
@@ -19,6 +26,9 @@ typedef struct {
EFI_PCI_IO_PROTOCOL *PciIo;
UINT8 MaxTarget;
UINT8 MaxLun;
+ LSI_SCSI_DMA_BUFFER *Dma;
+ EFI_PHYSICAL_ADDRESS DmaPhysical;
+ VOID *DmaMapping;
EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode;
EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru;
} LSI_SCSI_DEV;
--
2.25.1

[PATCH 07/11] OvmfPkg/LsiScsiDxe: Open PciIo protocol and initialize the device

Gary Lin
 

Open PciIo protocol and use it to initialize the device. The
initialization of LSI 53C895A is simple: just set the SRST bit in
Interrupt Status Zero register to reset the device.

Cc: Jordan Justen <jordan.l.justen@...>
Cc: Laszlo Ersek <lersek@...>
Cc: Ard Biesheuvel <ard.biesheuvel@...>
Signed-off-by: Gary Lin <glin@...>
---
OvmfPkg/Include/IndustryStandard/LsiScsi.h | 21 ++++
OvmfPkg/LsiScsiDxe/LsiScsi.c | 129 ++++++++++++++++++++-
OvmfPkg/LsiScsiDxe/LsiScsi.h | 3 +
3 files changed, 152 insertions(+), 1 deletion(-)

diff --git a/OvmfPkg/Include/IndustryStandard/LsiScsi.h b/OvmfPkg/Include/IndustryStandard/LsiScsi.h
index c09e864a1f39..60e527f1c6a7 100644
--- a/OvmfPkg/Include/IndustryStandard/LsiScsi.h
+++ b/OvmfPkg/Include/IndustryStandard/LsiScsi.h
@@ -17,4 +17,25 @@
#define LSI_LOGIC_PCI_VENDOR_ID 0x1000
#define LSI_53C895A_PCI_DEVICE_ID 0x0012

+//
+// LSI 53C895A Registers
+//
+#define LSI_REG_DSTAT 0x0C
+#define LSI_REG_ISTAT0 0x14
+#define LSI_REG_DSP 0x2C
+#define LSI_REG_SIST0 0x42
+#define LSI_REG_SIST1 0x43
+
+//
+// The status bits for Interrupt Status Zero (ISTAT0)
+//
+#define LSI_ISTAT0_DIP 0x01
+#define LSI_ISTAT0_SIP 0x02
+#define LSI_ISTAT0_INTF 0x04
+#define LSI_ISTAT0_CON 0x08
+#define LSI_ISTAT0_SEM 0x10
+#define LSI_ISTAT0_SIGP 0x20
+#define LSI_ISTAT0_SRST 0x40
+#define LSI_ISTAT0_ABRT 0x80
+
#endif // _LSI_SCSI_H_
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.c b/OvmfPkg/LsiScsiDxe/LsiScsi.c
index e10a81a5f9f7..f03774cc4ced 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.c
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.c
@@ -25,6 +25,33 @@

#include "LsiScsi.h"

+STATIC
+EFI_STATUS
+Out8 (
+ IN LSI_SCSI_DEV *Dev,
+ IN UINT32 Addr,
+ IN UINT8 Data
+ )
+{
+ return Dev->PciIo->Io.Write (
+ Dev->PciIo,
+ EfiPciIoWidthUint8,
+ PCI_BAR_IDX0,
+ Addr,
+ 1,
+ &Data
+ );
+}
+
+STATIC
+EFI_STATUS
+LsiScsiReset (
+ IN LSI_SCSI_DEV *Dev
+ )
+{
+ return Out8 (Dev, LSI_REG_ISTAT0, LSI_ISTAT0_SRST);
+}
+
//
// The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL
// for the LSI 53C895A SCSI Controller. Refer to UEFI Spec 2.3.1 + Errata C,
@@ -246,6 +273,21 @@ LsiScsiGetNextTarget (
return EFI_NOT_FOUND;
}

+STATIC
+VOID
+EFIAPI
+LsiScsiExitBoot (
+ IN EFI_EVENT Event,
+ IN VOID *Context
+ )
+{
+ LSI_SCSI_DEV *Dev;
+
+ Dev = Context;
+ DEBUG ((DEBUG_VERBOSE, "%a: Context=0x%p\n", __FUNCTION__, Context));
+ LsiScsiReset (Dev);
+}
+
//
// Probe, start and stop functions of this driver, called by the DXE core for
// specific devices.
@@ -328,6 +370,58 @@ LsiScsiControllerStart (
Dev->MaxTarget = PcdGet8 (PcdLsiScsiMaxTargetLimit);
Dev->MaxLun = PcdGet8 (PcdLsiScsiMaxLunLimit);

+ Status = gBS->OpenProtocol (
+ ControllerHandle,
+ &gEfiPciIoProtocolGuid,
+ (VOID **)&Dev->PciIo,
+ This->DriverBindingHandle,
+ ControllerHandle,
+ EFI_OPEN_PROTOCOL_BY_DRIVER
+ );
+ if (EFI_ERROR (Status)) {
+ goto FreePool;
+ }
+
+ Status = Dev->PciIo->Attributes (
+ Dev->PciIo,
+ EfiPciIoAttributeOperationGet,
+ 0,
+ &Dev->OrigPciAttrs
+ );
+ if (EFI_ERROR (Status)) {
+ goto CloseProtocol;
+ }
+
+ //
+ // Enable I/O Space & Bus-Mastering
+ //
+ Status = Dev->PciIo->Attributes (
+ Dev->PciIo,
+ EfiPciIoAttributeOperationEnable,
+ (EFI_PCI_IO_ATTRIBUTE_IO |
+ EFI_PCI_IO_ATTRIBUTE_BUS_MASTER),
+ NULL
+ );
+ if (EFI_ERROR (Status)) {
+ goto CloseProtocol;
+ }
+
+ Status = LsiScsiReset (Dev);
+ if (EFI_ERROR (Status)) {
+ goto RestoreAttributes;
+ }
+
+ Status = gBS->CreateEvent (
+ EVT_SIGNAL_EXIT_BOOT_SERVICES,
+ TPL_CALLBACK,
+ &LsiScsiExitBoot,
+ Dev,
+ &Dev->ExitBoot
+ );
+ if (EFI_ERROR (Status)) {
+ goto UninitDev;
+ }
+
//
// Host adapter channel, doesn't exist
//
@@ -352,11 +446,33 @@ LsiScsiControllerStart (
&Dev->PassThru
);
if (EFI_ERROR (Status)) {
- goto FreePool;
+ goto CloseExitBoot;
}

return EFI_SUCCESS;

+CloseExitBoot:
+ gBS->CloseEvent (Dev->ExitBoot);
+
+UninitDev:
+ LsiScsiReset (Dev);
+
+RestoreAttributes:
+ Dev->PciIo->Attributes (
+ Dev->PciIo,
+ EfiPciIoAttributeOperationSet,
+ Dev->OrigPciAttrs,
+ NULL
+ );
+
+CloseProtocol:
+ gBS->CloseProtocol (
+ ControllerHandle,
+ &gEfiPciIoProtocolGuid,
+ This->DriverBindingHandle,
+ ControllerHandle
+ );
+
FreePool:
FreePool (Dev);

@@ -399,6 +515,17 @@ LsiScsiControllerStop (
return Status;
}

+ gBS->CloseEvent (Dev->ExitBoot);
+
+ LsiScsiReset (Dev);
+
+ Dev->PciIo->Attributes (
+ Dev->PciIo,
+ EfiPciIoAttributeOperationSet,
+ Dev->OrigPciAttrs,
+ NULL
+ );
+
gBS->CloseProtocol (
ControllerHandle,
&gEfiPciIoProtocolGuid,
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.h b/OvmfPkg/LsiScsiDxe/LsiScsi.h
index a3d51d8f2386..ffaee6188536 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.h
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.h
@@ -14,6 +14,9 @@

typedef struct {
UINT32 Signature;
+ UINT64 OrigPciAttrs;
+ EFI_EVENT ExitBoot;
+ EFI_PCI_IO_PROTOCOL *PciIo;
UINT8 MaxTarget;
UINT8 MaxLun;
EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode;
--
2.25.1

[PATCH 06/11] OvmfPkg/LsiScsiDxe: Report Targets and LUNs

Gary Lin
 

Implement LsiScsiGetNextTargetLun(), LsiScsiBuildDevicePath(),
LsiScsiGetTargetLun(), and LsiScsiGetNextTarget() to report Targets and
LUNs and build the device path.

This commit also introduces two PCD value: PcdLsiScsiMaxTargetLimit and
PcdLsiScsiMaxLunLimit as the limits for Targets and LUNs.

Cc: Jordan Justen <jordan.l.justen@...>
Cc: Laszlo Ersek <lersek@...>
Cc: Ard Biesheuvel <ard.biesheuvel@...>
Signed-off-by: Gary Lin <glin@...>
---
OvmfPkg/LsiScsiDxe/LsiScsi.c | 143 +++++++++++++++++++++++++++++-
OvmfPkg/LsiScsiDxe/LsiScsi.h | 3 +
OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf | 6 ++
OvmfPkg/OvmfPkg.dec | 5 ++
4 files changed, 155 insertions(+), 2 deletions(-)

diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.c b/OvmfPkg/LsiScsiDxe/LsiScsi.c
index f633c6793298..e10a81a5f9f7 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.c
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.c
@@ -15,6 +15,7 @@
#include <Library/BaseMemoryLib.h>
#include <Library/DebugLib.h>
#include <Library/MemoryAllocationLib.h>
+#include <Library/PcdLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Protocol/PciIo.h>
@@ -53,6 +54,49 @@ LsiScsiGetNextTargetLun (
IN OUT UINT64 *Lun
)
{
+ LSI_SCSI_DEV *Dev;
+ UINTN Idx;
+ UINT8 *Target;
+ UINT16 LastTarget;
+
+ //
+ // the TargetPointer input parameter is unnecessarily a pointer-to-pointer
+ //
+ Target = *TargetPointer;
+
+ //
+ // Search for first non-0xFF byte. If not found, return first target & LUN.
+ //
+ for (Idx = 0; Idx < TARGET_MAX_BYTES && Target[Idx] == 0xFF; ++Idx)
+ ;
+ if (Idx == TARGET_MAX_BYTES) {
+ SetMem (Target, TARGET_MAX_BYTES, 0x00);
+ *Lun = 0;
+ return EFI_SUCCESS;
+ }
+
+ CopyMem (&LastTarget, Target, sizeof LastTarget);
+
+ //
+ // increment (target, LUN) pair if valid on input
+ //
+ Dev = LSI_SCSI_FROM_PASS_THRU (This);
+ if (LastTarget > Dev->MaxTarget || *Lun > Dev->MaxLun) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (*Lun < Dev->MaxLun) {
+ ++*Lun;
+ return EFI_SUCCESS;
+ }
+
+ if (LastTarget < Dev->MaxTarget) {
+ *Lun = 0;
+ ++LastTarget;
+ CopyMem (Target, &LastTarget, sizeof LastTarget);
+ return EFI_SUCCESS;
+ }
+
return EFI_NOT_FOUND;
}

@@ -65,7 +109,34 @@ LsiScsiBuildDevicePath (
IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
)
{
- return EFI_NOT_FOUND;
+ UINT16 TargetValue;
+ LSI_SCSI_DEV *Dev;
+ SCSI_DEVICE_PATH *ScsiDevicePath;
+
+ if (DevicePath == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ CopyMem (&TargetValue, Target, sizeof TargetValue);
+ Dev = LSI_SCSI_FROM_PASS_THRU (This);
+ if (TargetValue > Dev->MaxTarget || Lun > Dev->MaxLun || Lun > 0xFFFF) {
+ return EFI_NOT_FOUND;
+ }
+
+ ScsiDevicePath = AllocatePool (sizeof *ScsiDevicePath);
+ if (ScsiDevicePath == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ ScsiDevicePath->Header.Type = MESSAGING_DEVICE_PATH;
+ ScsiDevicePath->Header.SubType = MSG_SCSI_DP;
+ ScsiDevicePath->Header.Length[0] = (UINT8) sizeof *ScsiDevicePath;
+ ScsiDevicePath->Header.Length[1] = (UINT8) (sizeof *ScsiDevicePath >> 8);
+ ScsiDevicePath->Pun = TargetValue;
+ ScsiDevicePath->Lun = (UINT16) Lun;
+
+ *DevicePath = &ScsiDevicePath->Header;
+ return EFI_SUCCESS;
}

EFI_STATUS
@@ -77,7 +148,36 @@ LsiScsiGetTargetLun (
OUT UINT64 *Lun
)
{
- return EFI_UNSUPPORTED;
+ SCSI_DEVICE_PATH *ScsiDevicePath;
+ LSI_SCSI_DEV *Dev;
+ UINT8 *Target;
+
+ if (DevicePath == NULL || TargetPointer == NULL || *TargetPointer == NULL ||
+ Lun == NULL) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (DevicePath->Type != MESSAGING_DEVICE_PATH ||
+ DevicePath->SubType != MSG_SCSI_DP) {
+ return EFI_UNSUPPORTED;
+ }
+
+ ScsiDevicePath = (SCSI_DEVICE_PATH *) DevicePath;
+ Dev = LSI_SCSI_FROM_PASS_THRU (This);
+ if (ScsiDevicePath->Pun > Dev->MaxTarget ||
+ ScsiDevicePath->Lun > Dev->MaxLun) {
+ return EFI_NOT_FOUND;
+ }
+
+ //
+ // This device support 8 targets only, so it's enough to set the LSB
+ // of Target.
+ //
+ Target = *TargetPointer;
+ *Target = (UINT8)ScsiDevicePath->Pun;
+ *Lun = ScsiDevicePath->Lun;
+
+ return EFI_SUCCESS;
}

EFI_STATUS
@@ -107,6 +207,42 @@ LsiScsiGetNextTarget (
IN OUT UINT8 **TargetPointer
)
{
+ LSI_SCSI_DEV *Dev;
+ UINTN Idx;
+ UINT8 *Target;
+ UINT16 LastTarget;
+
+ //
+ // the TargetPointer input parameter is unnecessarily a pointer-to-pointer
+ //
+ Target = *TargetPointer;
+
+ //
+ // Search for first non-0xFF byte. If not found, return first target.
+ //
+ for (Idx = 0; Idx < TARGET_MAX_BYTES && Target[Idx] == 0xFF; ++Idx)
+ ;
+ if (Idx == TARGET_MAX_BYTES) {
+ SetMem (Target, TARGET_MAX_BYTES, 0x00);
+ return EFI_SUCCESS;
+ }
+
+ CopyMem (&LastTarget, Target, sizeof LastTarget);
+
+ //
+ // increment target if valid on input
+ //
+ Dev = LSI_SCSI_FROM_PASS_THRU (This);
+ if (LastTarget > Dev->MaxTarget) {
+ return EFI_INVALID_PARAMETER;
+ }
+
+ if (LastTarget < Dev->MaxTarget) {
+ ++LastTarget;
+ CopyMem (Target, &LastTarget, sizeof LastTarget);
+ return EFI_SUCCESS;
+ }
+
return EFI_NOT_FOUND;
}

@@ -189,6 +325,9 @@ LsiScsiControllerStart (

Dev->Signature = LSI_SCSI_DEV_SIGNATURE;

+ Dev->MaxTarget = PcdGet8 (PcdLsiScsiMaxTargetLimit);
+ Dev->MaxLun = PcdGet8 (PcdLsiScsiMaxLunLimit);
+
//
// Host adapter channel, doesn't exist
//
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.h b/OvmfPkg/LsiScsiDxe/LsiScsi.h
index fca1007f9b98..a3d51d8f2386 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.h
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.h
@@ -14,6 +14,8 @@

typedef struct {
UINT32 Signature;
+ UINT8 MaxTarget;
+ UINT8 MaxLun;
EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode;
EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru;
} LSI_SCSI_DEV;
@@ -23,6 +25,7 @@ typedef struct {
#define LSI_SCSI_FROM_PASS_THRU(PassThruPtr) \
CR (PassThruPtr, LSI_SCSI_DEV, PassThru, LSI_SCSI_DEV_SIGNATURE)

+
//
// Probe, start and stop functions of this driver, called by the DXE core for
// specific devices.
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
index 8660513e2ffd..68844c6772e3 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
+++ b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
@@ -27,7 +27,9 @@ [Packages]
[LibraryClasses]
BaseLib
BaseMemoryLib
+ DebugLib
MemoryAllocationLib
+ PcdLib
UefiBootServicesTableLib
UefiDriverEntryPoint
UefiLib
@@ -35,3 +37,7 @@ [LibraryClasses]
[Protocols]
gEfiExtScsiPassThruProtocolGuid ## BY_START
gEfiPciIoProtocolGuid ## TO_START
+
+[FixedPcd]
+ gUefiOvmfPkgTokenSpaceGuid.PcdLsiScsiMaxTargetLimit ## CONSUMES
+ gUefiOvmfPkgTokenSpaceGuid.PcdLsiScsiMaxLunLimit ## CONSUMES
diff --git a/OvmfPkg/OvmfPkg.dec b/OvmfPkg/OvmfPkg.dec
index 65bb2bb0eb4c..ae7d1d648d22 100644
--- a/OvmfPkg/OvmfPkg.dec
+++ b/OvmfPkg/OvmfPkg.dec
@@ -174,6 +174,11 @@ [PcdsFixedAtBuild]
## Microseconds to stall between polling for MptScsi request result
gUefiOvmfPkgTokenSpaceGuid.PcdMptScsiStallPerPollUsec|5|UINT32|0x40

+ ## Set the *inclusive* number of targets and LUNs that LsiScsi exposes for
+ # scan by ScsiBusDxe.
+ gUefiOvmfPkgTokenSpaceGuid.PcdLsiScsiMaxTargetLimit|7|UINT8|0x3b
+ gUefiOvmfPkgTokenSpaceGuid.PcdLsiScsiMaxLunLimit|0|UINT8|0x3c
+
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogBase|0x0|UINT32|0x8
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFlashNvStorageEventLogSize|0x0|UINT32|0x9
gUefiOvmfPkgTokenSpaceGuid.PcdOvmfFirmwareFdSize|0x0|UINT32|0xa
--
2.25.1

[PATCH 05/11] OvmfPkg/LsiScsiDxe: Install stubbed EXT_SCSI_PASS_THRU

Gary Lin
 

Partially implement LsiScsiControllerStart() and LsiScsiControllerStop()
to insert the scaffolding of EXT_SCSI_PASS_THRU functions.

Cc: Jordan Justen <jordan.l.justen@...>
Cc: Laszlo Ersek <lersek@...>
Cc: Ard Biesheuvel <ard.biesheuvel@...>
Signed-off-by: Gary Lin <glin@...>
---
OvmfPkg/LsiScsiDxe/LsiScsi.c | 171 +++++++++++++++++++++++++++++-
OvmfPkg/LsiScsiDxe/LsiScsi.h | 77 ++++++++++++++
OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf | 3 +
3 files changed, 250 insertions(+), 1 deletion(-)

diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.c b/OvmfPkg/LsiScsiDxe/LsiScsi.c
index 5bca85bd75eb..f633c6793298 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.c
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.c
@@ -11,14 +11,105 @@

#include <IndustryStandard/LsiScsi.h>
#include <IndustryStandard/Pci.h>
+#include <Library/BaseLib.h>
+#include <Library/BaseMemoryLib.h>
+#include <Library/DebugLib.h>
+#include <Library/MemoryAllocationLib.h>
#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
#include <Protocol/PciIo.h>
#include <Protocol/PciRootBridgeIo.h>
+#include <Protocol/ScsiPassThruExt.h>
#include <Uefi/UefiSpec.h>

#include "LsiScsi.h"

+//
+// The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL
+// for the LSI 53C895A SCSI Controller. Refer to UEFI Spec 2.3.1 + Errata C,
+// sections
+// - 14.1 SCSI Driver Model Overview,
+// - 14.7 Extended SCSI Pass Thru Protocol.
+//
+
+EFI_STATUS
+EFIAPI
+LsiScsiPassThru (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
+ IN UINT8 *Target,
+ IN UINT64 Lun,
+ IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
+ IN EFI_EVENT Event OPTIONAL
+ )
+{
+ return EFI_UNSUPPORTED;
+}
+
+EFI_STATUS
+EFIAPI
+LsiScsiGetNextTargetLun (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
+ IN OUT UINT8 **TargetPointer,
+ IN OUT UINT64 *Lun
+ )
+{
+ return EFI_NOT_FOUND;
+}
+
+EFI_STATUS
+EFIAPI
+LsiScsiBuildDevicePath (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
+ IN UINT8 *Target,
+ IN UINT64 Lun,
+ IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
+ )
+{
+ return EFI_NOT_FOUND;
+}
+
+EFI_STATUS
+EFIAPI
+LsiScsiGetTargetLun (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
+ OUT UINT8 **TargetPointer,
+ OUT UINT64 *Lun
+ )
+{
+ return EFI_UNSUPPORTED;
+}
+
+EFI_STATUS
+EFIAPI
+LsiScsiResetChannel (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This
+ )
+{
+ return EFI_UNSUPPORTED;
+}
+
+EFI_STATUS
+EFIAPI
+LsiScsiResetTargetLun (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
+ IN UINT8 *Target,
+ IN UINT64 Lun
+ )
+{
+ return EFI_UNSUPPORTED;
+}
+
+EFI_STATUS
+EFIAPI
+LsiScsiGetNextTarget (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
+ IN OUT UINT8 **TargetPointer
+ )
+{
+ return EFI_NOT_FOUND;
+}
+
//
// Probe, start and stop functions of this driver, called by the DXE core for
// specific devices.
@@ -88,7 +179,49 @@ LsiScsiControllerStart (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
)
{
+ EFI_STATUS Status;
+ LSI_SCSI_DEV *Dev;
+
+ Dev = AllocateZeroPool (sizeof (*Dev));
+ if (Dev == NULL) {
+ return EFI_OUT_OF_RESOURCES;
+ }
+
+ Dev->Signature = LSI_SCSI_DEV_SIGNATURE;
+
+ //
+ // Host adapter channel, doesn't exist
+ //
+ Dev->PassThruMode.AdapterId = MAX_UINT32;
+ Dev->PassThruMode.Attributes =
+ EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_PHYSICAL |
+ EFI_EXT_SCSI_PASS_THRU_ATTRIBUTES_LOGICAL;
+
+ Dev->PassThru.Mode = &Dev->PassThruMode;
+ Dev->PassThru.PassThru = &LsiScsiPassThru;
+ Dev->PassThru.GetNextTargetLun = &LsiScsiGetNextTargetLun;
+ Dev->PassThru.BuildDevicePath = &LsiScsiBuildDevicePath;
+ Dev->PassThru.GetTargetLun = &LsiScsiGetTargetLun;
+ Dev->PassThru.ResetChannel = &LsiScsiResetChannel;
+ Dev->PassThru.ResetTargetLun = &LsiScsiResetTargetLun;
+ Dev->PassThru.GetNextTarget = &LsiScsiGetNextTarget;
+
+ Status = gBS->InstallProtocolInterface (
+ &ControllerHandle,
+ &gEfiExtScsiPassThruProtocolGuid,
+ EFI_NATIVE_INTERFACE,
+ &Dev->PassThru
+ );
+ if (EFI_ERROR (Status)) {
+ goto FreePool;
+ }
+
return EFI_SUCCESS;
+
+FreePool:
+ FreePool (Dev);
+
+ return Status;
}

EFI_STATUS
@@ -100,7 +233,43 @@ LsiScsiControllerStop (
IN EFI_HANDLE *ChildHandleBuffer
)
{
- return EFI_SUCCESS;
+ EFI_STATUS Status;
+ EFI_EXT_SCSI_PASS_THRU_PROTOCOL *PassThru;
+ LSI_SCSI_DEV *Dev;
+
+ Status = gBS->OpenProtocol (
+ ControllerHandle,
+ &gEfiExtScsiPassThruProtocolGuid,
+ (VOID **)&PassThru,
+ This->DriverBindingHandle,
+ ControllerHandle,
+ EFI_OPEN_PROTOCOL_GET_PROTOCOL // Lookup only
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ Dev = LSI_SCSI_FROM_PASS_THRU (PassThru);
+
+ Status = gBS->UninstallProtocolInterface (
+ ControllerHandle,
+ &gEfiExtScsiPassThruProtocolGuid,
+ &Dev->PassThru
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ gBS->CloseProtocol (
+ ControllerHandle,
+ &gEfiPciIoProtocolGuid,
+ This->DriverBindingHandle,
+ ControllerHandle
+ );
+
+ FreePool (Dev);
+
+ return Status;
}

//
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.h b/OvmfPkg/LsiScsiDxe/LsiScsi.h
index 00db9ada12d2..fca1007f9b98 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.h
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.h
@@ -12,6 +12,17 @@
#ifndef _LSI_SCSI_DXE_H_
#define _LSI_SCSI_DXE_H_

+typedef struct {
+ UINT32 Signature;
+ EFI_EXT_SCSI_PASS_THRU_MODE PassThruMode;
+ EFI_EXT_SCSI_PASS_THRU_PROTOCOL PassThru;
+} LSI_SCSI_DEV;
+
+#define LSI_SCSI_DEV_SIGNATURE SIGNATURE_32 ('L','S','I','S')
+
+#define LSI_SCSI_FROM_PASS_THRU(PassThruPtr) \
+ CR (PassThruPtr, LSI_SCSI_DEV, PassThru, LSI_SCSI_DEV_SIGNATURE)
+
//
// Probe, start and stop functions of this driver, called by the DXE core for
// specific devices.
@@ -48,6 +59,72 @@ LsiScsiControllerStop (
);


+//
+// The next seven functions implement EFI_EXT_SCSI_PASS_THRU_PROTOCOL
+// for the LSI 53C895A SCSI Controller. Refer to UEFI Spec 2.3.1 + Errata C,
+// sections
+// - 14.1 SCSI Driver Model Overview,
+// - 14.7 Extended SCSI Pass Thru Protocol.
+//
+
+EFI_STATUS
+EFIAPI
+LsiScsiPassThru (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
+ IN UINT8 *Target,
+ IN UINT64 Lun,
+ IN OUT EFI_EXT_SCSI_PASS_THRU_SCSI_REQUEST_PACKET *Packet,
+ IN EFI_EVENT Event OPTIONAL
+ );
+
+EFI_STATUS
+EFIAPI
+LsiScsiGetNextTargetLun (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
+ IN OUT UINT8 **TargetPointer,
+ IN OUT UINT64 *Lun
+ );
+
+EFI_STATUS
+EFIAPI
+LsiScsiBuildDevicePath (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
+ IN UINT8 *Target,
+ IN UINT64 Lun,
+ IN OUT EFI_DEVICE_PATH_PROTOCOL **DevicePath
+ );
+
+EFI_STATUS
+EFIAPI
+LsiScsiGetTargetLun (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
+ IN EFI_DEVICE_PATH_PROTOCOL *DevicePath,
+ OUT UINT8 **TargetPointer,
+ OUT UINT64 *Lun
+ );
+
+EFI_STATUS
+EFIAPI
+LsiScsiResetChannel (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This
+ );
+
+EFI_STATUS
+EFIAPI
+LsiScsiResetTargetLun (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
+ IN UINT8 *Target,
+ IN UINT64 Lun
+ );
+
+EFI_STATUS
+EFIAPI
+LsiScsiGetNextTarget (
+ IN EFI_EXT_SCSI_PASS_THRU_PROTOCOL *This,
+ IN OUT UINT8 **TargetPointer
+ );
+
+
//
// The purpose of the following scaffolding (EFI_COMPONENT_NAME_PROTOCOL and
// EFI_COMPONENT_NAME2_PROTOCOL implementation) is to format the driver's name
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
index e86c626a61aa..8660513e2ffd 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
+++ b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
@@ -26,9 +26,12 @@ [Packages]

[LibraryClasses]
BaseLib
+ BaseMemoryLib
+ MemoryAllocationLib
UefiBootServicesTableLib
UefiDriverEntryPoint
UefiLib

[Protocols]
+ gEfiExtScsiPassThruProtocolGuid ## BY_START
gEfiPciIoProtocolGuid ## TO_START
--
2.25.1

[PATCH 04/11] OvmfPkg/LsiScsiDxe: Probe PCI devices and look for LsiScsi

Gary Lin
 

Implement LsiScsiControllerSupported() to probe the PCI ID and look for
LSI 53C895A.

Cc: Jordan Justen <jordan.l.justen@...>
Cc: Laszlo Ersek <lersek@...>
Cc: Ard Biesheuvel <ard.biesheuvel@...>
Signed-off-by: Gary Lin <glin@...>
---
OvmfPkg/Include/IndustryStandard/LsiScsi.h | 20 +++++++++
OvmfPkg/LsiScsiDxe/LsiScsi.c | 48 +++++++++++++++++++++-
OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf | 6 +++
3 files changed, 73 insertions(+), 1 deletion(-)
create mode 100644 OvmfPkg/Include/IndustryStandard/LsiScsi.h

diff --git a/OvmfPkg/Include/IndustryStandard/LsiScsi.h b/OvmfPkg/Include/IndustryStandard/LsiScsi.h
new file mode 100644
index 000000000000..c09e864a1f39
--- /dev/null
+++ b/OvmfPkg/Include/IndustryStandard/LsiScsi.h
@@ -0,0 +1,20 @@
+/** @file
+
+ Macros and type definitions for LSI 53C895A SCSI devices.
+
+ Copyright (C) 2020, SUSE LLC.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef _LSI_SCSI_H_
+#define _LSI_SCSI_H_
+
+//
+// Device ID
+//
+#define LSI_LOGIC_PCI_VENDOR_ID 0x1000
+#define LSI_53C895A_PCI_DEVICE_ID 0x0012
+
+#endif // _LSI_SCSI_H_
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.c b/OvmfPkg/LsiScsiDxe/LsiScsi.c
index 62daa3ab99bf..5bca85bd75eb 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.c
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.c
@@ -9,7 +9,12 @@

**/

+#include <IndustryStandard/LsiScsi.h>
+#include <IndustryStandard/Pci.h>
+#include <Library/UefiBootServicesTableLib.h>
#include <Library/UefiLib.h>
+#include <Protocol/PciIo.h>
+#include <Protocol/PciRootBridgeIo.h>
#include <Uefi/UefiSpec.h>

#include "LsiScsi.h"
@@ -31,7 +36,48 @@ LsiScsiControllerSupported (
IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
)
{
- return EFI_UNSUPPORTED;
+ EFI_STATUS Status;
+ EFI_PCI_IO_PROTOCOL *PciIo;
+ PCI_TYPE00 Pci;
+
+ Status = gBS->OpenProtocol (
+ ControllerHandle,
+ &gEfiPciIoProtocolGuid,
+ (VOID **)&PciIo,
+ This->DriverBindingHandle,
+ ControllerHandle,
+ EFI_OPEN_PROTOCOL_BY_DRIVER
+ );
+ if (EFI_ERROR (Status)) {
+ return Status;
+ }
+
+ Status = PciIo->Pci.Read (
+ PciIo,
+ EfiPciIoWidthUint32,
+ 0,
+ sizeof (Pci) / sizeof (UINT32),
+ &Pci
+ );
+ if (EFI_ERROR (Status)) {
+ goto Done;
+ }
+
+ if (Pci.Hdr.VendorId == LSI_LOGIC_PCI_VENDOR_ID &&
+ Pci.Hdr.DeviceId == LSI_53C895A_PCI_DEVICE_ID) {
+ Status = EFI_SUCCESS;
+ } else {
+ Status = EFI_UNSUPPORTED;
+ }
+
+Done:
+ gBS->CloseProtocol (
+ ControllerHandle,
+ &gEfiPciIoProtocolGuid,
+ This->DriverBindingHandle,
+ ControllerHandle
+ );
+ return Status;
}

EFI_STATUS
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
index 444ceb78e9ca..e86c626a61aa 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
+++ b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
@@ -22,7 +22,13 @@ [Sources]

[Packages]
MdePkg/MdePkg.dec
+ OvmfPkg/OvmfPkg.dec

[LibraryClasses]
+ BaseLib
+ UefiBootServicesTableLib
UefiDriverEntryPoint
UefiLib
+
+[Protocols]
+ gEfiPciIoProtocolGuid ## TO_START
--
2.25.1

[PATCH 03/11] OvmfPkg/LsiScsiDxe: Report the name of the driver

Gary Lin
 

Implement LsiScsiGetDriverName() and LsiScsiGetDeviceName()
to report the name of the driver.

Cc: Jordan Justen <jordan.l.justen@...>
Cc: Laszlo Ersek <lersek@...>
Cc: Ard Biesheuvel <ard.biesheuvel@...>
Signed-off-by: Gary Lin <glin@...>
---
OvmfPkg/LsiScsiDxe/LsiScsi.c | 69 ++++++++++++++++++++++++++++++++++--
OvmfPkg/LsiScsiDxe/LsiScsi.h | 31 ++++++++++++++++
2 files changed, 98 insertions(+), 2 deletions(-)

diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.c b/OvmfPkg/LsiScsiDxe/LsiScsi.c
index 79a2af4fee73..62daa3ab99bf 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.c
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.c
@@ -74,6 +74,71 @@ EFI_DRIVER_BINDING_PROTOCOL gDriverBinding = {
};


+//
+// The purpose of the following scaffolding (EFI_COMPONENT_NAME_PROTOCOL and
+// EFI_COMPONENT_NAME2_PROTOCOL implementation) is to format the driver's name
+// in English, for display on standard console devices. This is recommended for
+// UEFI drivers that follow the UEFI Driver Model. Refer to the Driver Writer's
+// Guide for UEFI 2.3.1 v1.01, 11 UEFI Driver and Controller Names.
+//
+// Device type names ("LSI 53C895A SCSI Controller") are not formatted because
+// the driver supports only that device type. Therefore the driver name
+// suffices for unambiguous identification.
+//
+
+STATIC
+EFI_UNICODE_STRING_TABLE mDriverNameTable[] = {
+ { "eng;en", L"LSI 53C895A SCSI Controller Driver" },
+ { NULL, NULL }
+};
+
+STATIC
+EFI_COMPONENT_NAME_PROTOCOL gComponentName;
+
+EFI_STATUS
+EFIAPI
+LsiScsiGetDriverName (
+ IN EFI_COMPONENT_NAME_PROTOCOL *This,
+ IN CHAR8 *Language,
+ OUT CHAR16 **DriverName
+ )
+{
+ return LookupUnicodeString2 (
+ Language,
+ This->SupportedLanguages,
+ mDriverNameTable,
+ DriverName,
+ (BOOLEAN)(This == &gComponentName) // Iso639Language
+ );
+}
+
+EFI_STATUS
+EFIAPI
+LsiScsiGetDeviceName (
+ IN EFI_COMPONENT_NAME_PROTOCOL *This,
+ IN EFI_HANDLE DeviceHandle,
+ IN EFI_HANDLE ChildHandle,
+ IN CHAR8 *Language,
+ OUT CHAR16 **ControllerName
+ )
+{
+ return EFI_UNSUPPORTED;
+}
+
+STATIC
+EFI_COMPONENT_NAME_PROTOCOL gComponentName = {
+ &LsiScsiGetDriverName,
+ &LsiScsiGetDeviceName,
+ "eng" // SupportedLanguages, ISO 639-2 language codes
+};
+
+STATIC
+EFI_COMPONENT_NAME2_PROTOCOL gComponentName2 = {
+ (EFI_COMPONENT_NAME2_GET_DRIVER_NAME) &LsiScsiGetDriverName,
+ (EFI_COMPONENT_NAME2_GET_CONTROLLER_NAME) &LsiScsiGetDeviceName,
+ "en" // SupportedLanguages, RFC 4646 language codes
+};
+
//
// Entry point of this driver
//
@@ -89,7 +154,7 @@ LsiScsiEntryPoint (
SystemTable,
&gDriverBinding,
ImageHandle, // The handle to install onto
- NULL, // TODO Component name
- NULL // TODO Component name
+ &gComponentName,
+ &gComponentName2
);
}
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.h b/OvmfPkg/LsiScsiDxe/LsiScsi.h
index 17738442fd5f..00db9ada12d2 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.h
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.h
@@ -47,4 +47,35 @@ LsiScsiControllerStop (
IN EFI_HANDLE *ChildHandleBuffer
);

+
+//
+// The purpose of the following scaffolding (EFI_COMPONENT_NAME_PROTOCOL and
+// EFI_COMPONENT_NAME2_PROTOCOL implementation) is to format the driver's name
+// in English, for display on standard console devices. This is recommended for
+// UEFI drivers that follow the UEFI Driver Model. Refer to the Driver Writer's
+// Guide for UEFI 2.3.1 v1.01, 11 UEFI Driver and Controller Names.
+//
+// Device type names ("LSI 53C895A SCSI Controller") are not formatted because
+// the driver supports only that device type. Therefore the driver name
+// suffices for unambiguous identification.
+//
+
+EFI_STATUS
+EFIAPI
+LsiScsiGetDriverName (
+ IN EFI_COMPONENT_NAME_PROTOCOL *This,
+ IN CHAR8 *Language,
+ OUT CHAR16 **DriverName
+ );
+
+EFI_STATUS
+EFIAPI
+LsiScsiGetDeviceName (
+ IN EFI_COMPONENT_NAME_PROTOCOL *This,
+ IN EFI_HANDLE DeviceHandle,
+ IN EFI_HANDLE ChildHandle,
+ IN CHAR8 *Language,
+ OUT CHAR16 **ControllerName
+ );
+
#endif // _LSI_SCSI_DXE_H_
--
2.25.1

[PATCH 02/11] OvmfPkg/LsiScsiDxe: Install the skeleton of driver binding

Gary Lin
 

Implement the dummy functions for EFI Driver Binding protocol.

Cc: Jordan Justen <jordan.l.justen@...>
Cc: Laszlo Ersek <lersek@...>
Cc: Ard Biesheuvel <ard.biesheuvel@...>
Signed-off-by: Gary Lin <glin@...>
---
OvmfPkg/LsiScsiDxe/LsiScsi.c | 72 ++++++++++++++++++++++++++++++-
OvmfPkg/LsiScsiDxe/LsiScsi.h | 50 +++++++++++++++++++++
OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf | 2 +
3 files changed, 123 insertions(+), 1 deletion(-)
create mode 100644 OvmfPkg/LsiScsiDxe/LsiScsi.h

diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.c b/OvmfPkg/LsiScsiDxe/LsiScsi.c
index 9c90941688ed..79a2af4fee73 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsi.c
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.c
@@ -9,8 +9,71 @@

**/

+#include <Library/UefiLib.h>
#include <Uefi/UefiSpec.h>

+#include "LsiScsi.h"
+
+//
+// Probe, start and stop functions of this driver, called by the DXE core for
+// specific devices.
+//
+// The following specifications document these interfaces:
+// - Driver Writer's Guide for UEFI 2.3.1 v1.01, 9 Driver Binding Protocol
+// - UEFI Spec 2.3.1 + Errata C, 10.1 EFI Driver Binding Protocol
+//
+
+EFI_STATUS
+EFIAPI
+LsiScsiControllerSupported (
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,
+ IN EFI_HANDLE ControllerHandle,
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
+ )
+{
+ return EFI_UNSUPPORTED;
+}
+
+EFI_STATUS
+EFIAPI
+LsiScsiControllerStart (
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,
+ IN EFI_HANDLE ControllerHandle,
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
+ )
+{
+ return EFI_SUCCESS;
+}
+
+EFI_STATUS
+EFIAPI
+LsiScsiControllerStop (
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,
+ IN EFI_HANDLE ControllerHandle,
+ IN UINTN NumberOfChildren,
+ IN EFI_HANDLE *ChildHandleBuffer
+ )
+{
+ return EFI_SUCCESS;
+}
+
+//
+// The static object that groups the Supported() (ie. probe), Start() and
+// Stop() functions of the driver together. Refer to UEFI Spec 2.3.1 + Errata
+// C, 10.1 EFI Driver Binding Protocol.
+//
+STATIC
+EFI_DRIVER_BINDING_PROTOCOL gDriverBinding = {
+ &LsiScsiControllerSupported,
+ &LsiScsiControllerStart,
+ &LsiScsiControllerStop,
+ 0x10, // Version, must be in [0x10 .. 0xFFFFFFEF] for IHV-developed drivers
+ NULL, // ImageHandle, to be overwritten by
+ // EfiLibInstallDriverBindingComponentName2() in LsiScsiEntryPoint()
+ NULL // DriverBindingHandle, ditto
+};
+
+
//
// Entry point of this driver
//
@@ -21,5 +84,12 @@ LsiScsiEntryPoint (
IN EFI_SYSTEM_TABLE *SystemTable
)
{
- return EFI_UNSUPPORTED;
+ return EfiLibInstallDriverBindingComponentName2 (
+ ImageHandle,
+ SystemTable,
+ &gDriverBinding,
+ ImageHandle, // The handle to install onto
+ NULL, // TODO Component name
+ NULL // TODO Component name
+ );
}
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.h b/OvmfPkg/LsiScsiDxe/LsiScsi.h
new file mode 100644
index 000000000000..17738442fd5f
--- /dev/null
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.h
@@ -0,0 +1,50 @@
+/** @file
+
+ Internal definitions for the LSI 53C895A SCSI driver, which produces
+ Extended SCSI Pass Thru Protocol instances for LSI 53C895A SCSI devices.
+
+ Copyright (C) 2020, SUSE LLC.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#ifndef _LSI_SCSI_DXE_H_
+#define _LSI_SCSI_DXE_H_
+
+//
+// Probe, start and stop functions of this driver, called by the DXE core for
+// specific devices.
+//
+// The following specifications document these interfaces:
+// - Driver Writer's Guide for UEFI 2.3.1 v1.01, 9 Driver Binding Protocol
+// - UEFI Spec 2.3.1 + Errata C, 10.1 EFI Driver Binding Protocol
+//
+
+STATIC
+EFI_STATUS
+EFIAPI
+LsiScsiControllerSupported (
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,
+ IN EFI_HANDLE ControllerHandle,
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
+ );
+
+EFI_STATUS
+EFIAPI
+LsiScsiControllerStart (
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,
+ IN EFI_HANDLE ControllerHandle,
+ IN EFI_DEVICE_PATH_PROTOCOL *RemainingDevicePath OPTIONAL
+ );
+
+EFI_STATUS
+EFIAPI
+LsiScsiControllerStop (
+ IN EFI_DRIVER_BINDING_PROTOCOL *This,
+ IN EFI_HANDLE ControllerHandle,
+ IN UINTN NumberOfChildren,
+ IN EFI_HANDLE *ChildHandleBuffer
+ );
+
+#endif // _LSI_SCSI_DXE_H_
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
index 55b483c2fa20..444ceb78e9ca 100644
--- a/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
+++ b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
@@ -18,9 +18,11 @@ [Defines]

[Sources]
LsiScsi.c
+ LsiScsi.h

[Packages]
MdePkg/MdePkg.dec

[LibraryClasses]
UefiDriverEntryPoint
+ UefiLib
--
2.25.1

[PATCH 01/11] OvmfPkg/LsiScsiDxe: Create the empty driver

Gary Lin
 

Create the driver with only a dummy LsiScsiEntryPoint() for the further
implementation of the driver for LSI 53C895A SCSI controller.

Cc: Jordan Justen <jordan.l.justen@...>
Cc: Laszlo Ersek <lersek@...>
Cc: Ard Biesheuvel <ard.biesheuvel@...>
Signed-off-by: Gary Lin <glin@...>
---
OvmfPkg/LsiScsiDxe/LsiScsi.c | 25 +++++++++++++++++++++++++
OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf | 26 ++++++++++++++++++++++++++
OvmfPkg/OvmfPkgIa32.dsc | 4 ++++
OvmfPkg/OvmfPkgIa32.fdf | 3 +++
OvmfPkg/OvmfPkgIa32X64.dsc | 4 ++++
OvmfPkg/OvmfPkgIa32X64.fdf | 3 +++
OvmfPkg/OvmfPkgX64.dsc | 4 ++++
OvmfPkg/OvmfPkgX64.fdf | 3 +++
8 files changed, 72 insertions(+)
create mode 100644 OvmfPkg/LsiScsiDxe/LsiScsi.c
create mode 100644 OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf

diff --git a/OvmfPkg/LsiScsiDxe/LsiScsi.c b/OvmfPkg/LsiScsiDxe/LsiScsi.c
new file mode 100644
index 000000000000..9c90941688ed
--- /dev/null
+++ b/OvmfPkg/LsiScsiDxe/LsiScsi.c
@@ -0,0 +1,25 @@
+/** @file
+
+ This driver produces Extended SCSI Pass Thru Protocol instances for
+ LSI 53C895A SCSI devices.
+
+ Copyright (C) 2020, SUSE LLC.
+
+ SPDX-License-Identifier: BSD-2-Clause-Patent
+
+**/
+
+#include <Uefi/UefiSpec.h>
+
+//
+// Entry point of this driver
+//
+EFI_STATUS
+EFIAPI
+LsiScsiEntryPoint (
+ IN EFI_HANDLE ImageHandle,
+ IN EFI_SYSTEM_TABLE *SystemTable
+ )
+{
+ return EFI_UNSUPPORTED;
+}
diff --git a/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
new file mode 100644
index 000000000000..55b483c2fa20
--- /dev/null
+++ b/OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
@@ -0,0 +1,26 @@
+## @file
+# This driver produces Extended SCSI Pass Thru Protocol instances for
+# LSI 53C895A SCSI devices.
+#
+# Copyright (C) 2020, SUSE LLC.
+#
+# SPDX-License-Identifier: BSD-2-Clause-Patent
+#
+##
+
+[Defines]
+ INF_VERSION = 1.29
+ BASE_NAME = LsiScsiDxe
+ FILE_GUID = EB4EB21f-5A3D-40BE-8BD2-F1B0E38E5744
+ MODULE_TYPE = UEFI_DRIVER
+ VERSION_STRING = 1.0
+ ENTRY_POINT = LsiScsiEntryPoint
+
+[Sources]
+ LsiScsi.c
+
+[Packages]
+ MdePkg/MdePkg.dec
+
+[LibraryClasses]
+ UefiDriverEntryPoint
diff --git a/OvmfPkg/OvmfPkgIa32.dsc b/OvmfPkg/OvmfPkgIa32.dsc
index b4ee7376791b..9178ffeb71cb 100644
--- a/OvmfPkg/OvmfPkgIa32.dsc
+++ b/OvmfPkg/OvmfPkgIa32.dsc
@@ -50,6 +50,7 @@ [Defines]
#
DEFINE PVSCSI_ENABLE = TRUE
DEFINE MPT_SCSI_ENABLE = TRUE
+ DEFINE LSI_SCSI_ENABLE = FALSE

#
# Flash size selection. Setting FD_SIZE_IN_KB on the command line directly to
@@ -771,6 +772,9 @@ [Components]
!endif
!if $(MPT_SCSI_ENABLE) == TRUE
OvmfPkg/MptScsiDxe/MptScsiDxe.inf
+!endif
+!if $(LSI_SCSI_ENABLE) == TRUE
+ OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
!endif
MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
diff --git a/OvmfPkg/OvmfPkgIa32.fdf b/OvmfPkg/OvmfPkgIa32.fdf
index e2b759aa8d05..2b9a6b58015f 100644
--- a/OvmfPkg/OvmfPkgIa32.fdf
+++ b/OvmfPkg/OvmfPkgIa32.fdf
@@ -236,6 +236,9 @@ [FV.DXEFV]
!if $(MPT_SCSI_ENABLE) == TRUE
INF OvmfPkg/MptScsiDxe/MptScsiDxe.inf
!endif
+!if $(LSI_SCSI_ENABLE) == TRUE
+INF OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
+!endif

!if $(SECURE_BOOT_ENABLE) == TRUE
INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
diff --git a/OvmfPkg/OvmfPkgIa32X64.dsc b/OvmfPkg/OvmfPkgIa32X64.dsc
index ed68b080f2a2..a665f78f0dc7 100644
--- a/OvmfPkg/OvmfPkgIa32X64.dsc
+++ b/OvmfPkg/OvmfPkgIa32X64.dsc
@@ -49,6 +49,7 @@ [Defines]
#
DEFINE PVSCSI_ENABLE = TRUE
DEFINE MPT_SCSI_ENABLE = TRUE
+ DEFINE LSI_SCSI_ENABLE = FALSE

#
# Flash size selection. Setting FD_SIZE_IN_KB on the command line directly to
@@ -785,6 +786,9 @@ [Components.X64]
!endif
!if $(MPT_SCSI_ENABLE) == TRUE
OvmfPkg/MptScsiDxe/MptScsiDxe.inf
+!endif
+!if $(LSI_SCSI_ENABLE) == TRUE
+ OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
!endif
MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
diff --git a/OvmfPkg/OvmfPkgIa32X64.fdf b/OvmfPkg/OvmfPkgIa32X64.fdf
index bfca1eff9e83..83ff6aef2e8c 100644
--- a/OvmfPkg/OvmfPkgIa32X64.fdf
+++ b/OvmfPkg/OvmfPkgIa32X64.fdf
@@ -237,6 +237,9 @@ [FV.DXEFV]
!if $(MPT_SCSI_ENABLE) == TRUE
INF OvmfPkg/MptScsiDxe/MptScsiDxe.inf
!endif
+!if $(LSI_SCSI_ENABLE) == TRUE
+INF OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
+!endif

!if $(SECURE_BOOT_ENABLE) == TRUE
INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
diff --git a/OvmfPkg/OvmfPkgX64.dsc b/OvmfPkg/OvmfPkgX64.dsc
index cb7e8068a3d8..17f345acf4ee 100644
--- a/OvmfPkg/OvmfPkgX64.dsc
+++ b/OvmfPkg/OvmfPkgX64.dsc
@@ -49,6 +49,7 @@ [Defines]
#
DEFINE PVSCSI_ENABLE = TRUE
DEFINE MPT_SCSI_ENABLE = TRUE
+ DEFINE LSI_SCSI_ENABLE = FALSE

#
# Flash size selection. Setting FD_SIZE_IN_KB on the command line directly to
@@ -781,6 +782,9 @@ [Components]
!endif
!if $(MPT_SCSI_ENABLE) == TRUE
OvmfPkg/MptScsiDxe/MptScsiDxe.inf
+!endif
+!if $(LSI_SCSI_ENABLE) == TRUE
+ OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
!endif
MdeModulePkg/Universal/WatchdogTimerDxe/WatchdogTimer.inf
MdeModulePkg/Universal/MonotonicCounterRuntimeDxe/MonotonicCounterRuntimeDxe.inf
diff --git a/OvmfPkg/OvmfPkgX64.fdf b/OvmfPkg/OvmfPkgX64.fdf
index bfca1eff9e83..83ff6aef2e8c 100644
--- a/OvmfPkg/OvmfPkgX64.fdf
+++ b/OvmfPkg/OvmfPkgX64.fdf
@@ -237,6 +237,9 @@ [FV.DXEFV]
!if $(MPT_SCSI_ENABLE) == TRUE
INF OvmfPkg/MptScsiDxe/MptScsiDxe.inf
!endif
+!if $(LSI_SCSI_ENABLE) == TRUE
+INF OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf
+!endif

!if $(SECURE_BOOT_ENABLE) == TRUE
INF SecurityPkg/VariableAuthenticated/SecureBootConfigDxe/SecureBootConfigDxe.inf
--
2.25.1

[PATCH 00/11] Introduce LsiScsi driver to OvmfPkg

Gary Lin
 

This patch series implement the driver for LSI 53C895A SCSI controller
for OVMF so that the user can access the storage devices connected to
QEMU "lsi" controller. The driver is disabled by default since LSI
53C895A is considered as a legacy device. To enable the driver, please
add "-D LSI_SCSI_ENABLE" when building OvmfPkg.

The patch series is also available in my git branch:
https://github.com/lcp/edk2/tree/ovmf-lsi-v1

Cc: Jordan Justen <jordan.l.justen@...>
Cc: Laszlo Ersek <lersek@...>
Cc: Ard Biesheuvel <ard.biesheuvel@...>

Gary Lin (11):
OvmfPkg/LsiScsiDxe: Create the empty driver
OvmfPkg/LsiScsiDxe: Install the skeleton of driver binding
OvmfPkg/LsiScsiDxe: Report the name of the driver
OvmfPkg/LsiScsiDxe: Probe PCI devices and look for LsiScsi
OvmfPkg/LsiScsiDxe: Install stubbed EXT_SCSI_PASS_THRU
OvmfPkg/LsiScsiDxe: Report Targets and LUNs
OvmfPkg/LsiScsiDxe: Open PciIo protocol and initialize the device
OvmfPkg/LsiScsiDxe: Map DMA buffer
OvmfPkg/LsiScsiDxe: Examine the incoming SCSI Request Packet
OvmfPkg/LsiScsiDxe: Process the SCSI Request Packet
Maintainers.txt: Add myself as the reviewer for LsiScsi driver

Maintainers.txt | 4 +
OvmfPkg/Include/IndustryStandard/LsiScsi.h | 80 ++
OvmfPkg/LsiScsiDxe/LsiScsi.c | 1130 ++++++++++++++++++++
OvmfPkg/LsiScsiDxe/LsiScsi.h | 199 ++++
OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf | 46 +
OvmfPkg/OvmfPkg.dec | 8 +
OvmfPkg/OvmfPkgIa32.dsc | 4 +
OvmfPkg/OvmfPkgIa32.fdf | 3 +
OvmfPkg/OvmfPkgIa32X64.dsc | 4 +
OvmfPkg/OvmfPkgIa32X64.fdf | 3 +
OvmfPkg/OvmfPkgX64.dsc | 4 +
OvmfPkg/OvmfPkgX64.fdf | 3 +
12 files changed, 1488 insertions(+)
create mode 100644 OvmfPkg/Include/IndustryStandard/LsiScsi.h
create mode 100644 OvmfPkg/LsiScsiDxe/LsiScsi.c
create mode 100644 OvmfPkg/LsiScsiDxe/LsiScsi.h
create mode 100644 OvmfPkg/LsiScsiDxe/LsiScsiDxe.inf

--
2.25.1

Re: [PATCH v2 4/4] .azurepipelines: Add DynamicTablesPkg to CI matrix

Zhang, Shenglei
 

Reviewed-by: Shenglei Zhang <shenglei.zhang@...>

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Sami
Mujawar
Sent: Wednesday, July 1, 2020 3:37 AM
To: devel@edk2.groups.io
Cc: Sami Mujawar <sami.mujawar@...>; Alexei.Fedorov@...;
sean.brogan@...; Gao, Liming <liming.gao@...>; Kinney,
Michael D <michael.d.kinney@...>; Bret.Barkelew@...;
ard.biesheuvel@...; Matteo.Carlini@...;
Laura.Moretta@...; nd@...
Subject: [edk2-devel] [PATCH v2 4/4] .azurepipelines: Add DynamicTablesPkg
to CI matrix

Add DynamicTablesPkg to the Core CI matrix.

Signed-off-by: Sami Mujawar <sami.mujawar@...>
Suggested-by: Sean Brogan <sean.brogan@...>
---

Notes:
v2:
- New patch in series to add DynamicTablesPkg to Core CI matrix [Sami]
- Add DynamicTablesPkg to Core CI matrix [Sean]

.azurepipelines/templates/pr-gate-build-job.yml | 3 ++-
1 file changed, 2 insertions(+), 1 deletion(-)

diff --git a/.azurepipelines/templates/pr-gate-build-job.yml
b/.azurepipelines/templates/pr-gate-build-job.yml
index
a9f89aa68451b5f7de6a4163487b267f94a383ad..2683687a1c7b869519dae5183
b7dd2cb8c349272 100644
--- a/.azurepipelines/templates/pr-gate-build-job.yml
+++ b/.azurepipelines/templates/pr-gate-build-job.yml
@@ -4,6 +4,7 @@
# template file used to build supported packages.
#
# Copyright (c) Microsoft Corporation.
+# Copyright (c) 2020, ARM Limited. All rights reserved.<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent
##

@@ -36,7 +37,7 @@ jobs:
Build.Pkgs: 'PcAtChipsetPkg,ShellPkg'
Build.Targets: 'DEBUG,RELEASE,NO-TARGET'
TARGET_FMP_FAT_TEST:
- Build.Pkgs: 'FmpDevicePkg,FatPkg,UnitTestFrameworkPkg'
+ Build.Pkgs:
'FmpDevicePkg,FatPkg,UnitTestFrameworkPkg,DynamicTablesPkg'
Build.Targets: 'DEBUG,RELEASE,NO-TARGET,NOOPT'
TARGET_CRYPTO:
Build.Pkgs: 'CryptoPkg'
--
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'


Re: [PATCH v2 3/3] .pytool: CI Settings to support DynamicTablesPkg

Zhang, Shenglei
 

Reviewed-by: Shenglei Zhang <shenglei.zhang@...>

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Sami
Mujawar
Sent: Wednesday, July 1, 2020 3:37 AM
To: devel@edk2.groups.io
Cc: Sami Mujawar <sami.mujawar@...>; Alexei.Fedorov@...;
sean.brogan@...; Gao, Liming <liming.gao@...>; Kinney,
Michael D <michael.d.kinney@...>; Bret.Barkelew@...;
ard.biesheuvel@...; Matteo.Carlini@...;
Laura.Moretta@...; nd@...
Subject: [edk2-devel] [PATCH v2 3/3] .pytool: CI Settings to support
DynamicTablesPkg

Update pytools configuration to enable DynamicTablesPkg
and update package status in documentation.

Signed-off-by: Sami Mujawar <sami.mujawar@...>
---

Notes:
v2:
- No change, resend patch with v2 series [Sami]

v1:
- Add CI settings to support DynamicTablesPkg [Sami]

.pytool/CISettings.py | 2 ++
.pytool/Readme.md | 2 +-
2 files changed, 3 insertions(+), 1 deletion(-)

diff --git a/.pytool/CISettings.py b/.pytool/CISettings.py
index
bac60ecbaaf51ef4cf2f3ec7616e8ba2caa645ea..0c2dd0181aa2d3b3650e255da9
24d028d872513d 100644
--- a/.pytool/CISettings.py
+++ b/.pytool/CISettings.py
@@ -2,6 +2,7 @@
#
# Copyright (c) Microsoft Corporation.
# Copyright (c) 2020, Hewlett Packard Enterprise Development LP. All rights
reserved.<BR>
+# Copyright (c) 2020, ARM Limited. All rights reserved.<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent
##
import os
@@ -41,6 +42,7 @@ class Settings(CiBuildSettingsManager,
UpdateSettingsManager, SetupSettingsManag
These should be edk2 workspace relative paths '''

return ("ArmVirtPkg",
+ "DynamicTablesPkg",
"EmulatorPkg",
"MdePkg",
"MdeModulePkg",
diff --git a/.pytool/Readme.md b/.pytool/Readme.md
index
c401dba18fbf39a1431c3dbbfa30353de3ecb4b4..2fc905b8674fc217044baa2ff7
21f3c6afa504c9 100644
--- a/.pytool/Readme.md
+++ b/.pytool/Readme.md
@@ -8,7 +8,7 @@
| ArmPlatformPkg |
| ArmVirtPkg | SEE PACKAGE README | SEE PACKAGE README |
| CryptoPkg | :heavy_check_mark: | :heavy_check_mark: | Spell
checking in audit mode
-| DynamicTablesPkg |
+| DynamicTablesPkg | | :heavy_check_mark: |
| EmbeddedPkg |
| EmulatorPkg | SEE PACKAGE README | SEE PACKAGE README | Spell
checking in audit mode
| FatPkg | :heavy_check_mark: | :heavy_check_mark: |
--
'Guid(CE165669-3EF3-493F-B85D-6190EE5B9759)'


Re: [PATCH v6 05/16] CryptoPkg/CryptoPkg.ci.yaml: Add configuration for Ecc check

Wang, Jian J
 

Reviewed-by: Jian J Wang <jian.j.wang@...>

Regards,
Jian

-----Original Message-----
From: Zhang, Shenglei <shenglei.zhang@...>
Sent: Wednesday, July 01, 2020 9:55 AM
To: devel@edk2.groups.io
Cc: Wang, Jian J <jian.j.wang@...>; Lu, XiaoyuX <xiaoyux.lu@...>
Subject: [PATCH v6 05/16] CryptoPkg/CryptoPkg.ci.yaml: Add configuration for
Ecc check

Add configuration ExceptionList and IgnoreFiles for package config
files. So users can rely on this to ignore some Ecc issues.

Cc: Jian J Wang <jian.j.wang@...>
Cc: Xiaoyu Lu <xiaoyux.lu@...>
Signed-off-by: Shenglei Zhang <shenglei.zhang@...>
Reviewed-by: Guomin Jiang <guomin.jiang@...>
---
CryptoPkg/CryptoPkg.ci.yaml | 11 +++++++++++
1 file changed, 11 insertions(+)

diff --git a/CryptoPkg/CryptoPkg.ci.yaml b/CryptoPkg/CryptoPkg.ci.yaml
index f54ebfb22e70..c60d8bac6dee 100644
--- a/CryptoPkg/CryptoPkg.ci.yaml
+++ b/CryptoPkg/CryptoPkg.ci.yaml
@@ -2,9 +2,20 @@
# CI configuration for CryptoPkg
#
# Copyright (c) Microsoft Corporation
+# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent
##
{
+ "EccCheck": {
+ ## Exception sample looks like below:
+ ## "ExceptionList": [
+ ## "<ErrorID>", "<KeyWord>"
+ ## ]
+ "ExceptionList": [
+ ],
+ "IgnoreFiles": [
+ ]
+ },
"CompilerPlugin": {
"DscPath": "CryptoPkg.dsc"
},
--
2.18.0.windows.1

Re: [PATCH v6 13/16] SecurityPkg/SecurityPkg.ci.yaml: Add configuration for Ecc check

Wang, Jian J
 

Reviewed-by: Jian J Wang <jian.j.wang@...>

Regards,
Jian

-----Original Message-----
From: devel@edk2.groups.io <devel@edk2.groups.io> On Behalf Of Zhang,
Shenglei
Sent: Wednesday, July 01, 2020 9:55 AM
To: devel@edk2.groups.io
Cc: Yao, Jiewen <jiewen.yao@...>; Wang, Jian J <jian.j.wang@...>;
Zhang, Chao B <chao.b.zhang@...>
Subject: [edk2-devel] [PATCH v6 13/16] SecurityPkg/SecurityPkg.ci.yaml: Add
configuration for Ecc check

Add configuration ExceptionList and IgnoreFiles for package config
files. So users can rely on this to ignore some Ecc issues.

Cc: Jiewen Yao <jiewen.yao@...>
Cc: Jian J Wang <jian.j.wang@...>
Cc: Chao Zhang <chao.b.zhang@...>
Signed-off-by: Shenglei Zhang <shenglei.zhang@...>
---
SecurityPkg/SecurityPkg.ci.yaml | 11 +++++++++++
1 file changed, 11 insertions(+)

diff --git a/SecurityPkg/SecurityPkg.ci.yaml b/SecurityPkg/SecurityPkg.ci.yaml
index 953219053318..a0e143140875 100644
--- a/SecurityPkg/SecurityPkg.ci.yaml
+++ b/SecurityPkg/SecurityPkg.ci.yaml
@@ -2,9 +2,20 @@
# CI configuration for SecurityPkg
#
# Copyright (c) Microsoft Corporation
+# Copyright (c) 2020, Intel Corporation. All rights reserved.<BR>
# SPDX-License-Identifier: BSD-2-Clause-Patent
##
{
+ "EccCheck": {
+ ## Exception sample looks like below:
+ ## "ExceptionList": [
+ ## "<ErrorID>", "<KeyWord>"
+ ## ]
+ "ExceptionList": [
+ ],
+ "IgnoreFiles": [
+ ]
+ },
"CompilerPlugin": {
"DscPath": "SecurityPkg.dsc"
},
--
2.18.0.windows.1


[PATCH v6 16/16] UnitTestFrameworkPkg: Add configuration for Ecc check in yaml file

Zhang, Shenglei
 

Add configuration ExceptionList and IgnoreFiles for package config
files. So users can rely on this to ignore some Ecc issues.

Cc: Michael D Kinney <michael.d.kinney@...>
Cc: Sean Brogan <sean.brogan@...>
Cc: Bret Barkelew <Bret.Barkelew@...>
Signed-off-by: Shenglei Zhang <shenglei.zhang@...>
Acked-by: Ray Ni <ray.ni@...>
---
UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml | 10 ++++++++++
1 file changed, 10 insertions(+)

diff --git a/UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml b/UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml
index 51e172537f8a..7e9fc5d005fb 100644
--- a/UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml
+++ b/UnitTestFrameworkPkg/UnitTestFrameworkPkg.ci.yaml
@@ -5,6 +5,16 @@
# SPDX-License-Identifier: BSD-2-Clause-Patent
##
{
+ "EccCheck": {
+ ## Exception sample looks like below:
+ ## "ExceptionList": [
+ ## "<ErrorID>", "<KeyWord>"
+ ## ]
+ "ExceptionList": [
+ ],
+ "IgnoreFiles": [
+ ]
+ },
## options defined .pytool/Plugin/CompilerPlugin
"CompilerPlugin": {
"DscPath": "UnitTestFrameworkPkg.dsc"
--
2.18.0.windows.1