Closed lemolatoon closed 1 year ago
pciデバイスをすべて探索し、Vec<PciDevice>
につめる
crate::pci::register::scan_all_bus
が該当の処理crate::pci::register::PciDevice
の構造体は、
vendor_id
, device_id
, class_code
, header_type
というデバイスの情報bus
, device
, function
の情報を持たせている。pciデバイスを探索し、class_codeが(0x0c, 0x03, 0x30)
のものを探す。
crate::pci::register::ClassCode::is_xhci_controller
の呼び出しで判別0x800_000_000
となっているのでこれは合ってそう。PciDevice::read_bar
を呼び出し、BAR0とBAR1を結合したアドレスの下位4bitをマスクしたものがベースアドレスになる。0x800_000_000
がベースアドレスになったのであっていそう。crate::xhci::controller::XhciController
の各メンバを埋めていく。
XhciController::new
メソッドでやっている以下、より詳細な手順
xhci::Registers::new
で返される xhci::Registers
の各メンバのメソッドから、mmioの各レジスタ値にアクセスできる。
Mapper
としては、同じアドレスをそのまま返すものを使用。extendedCapabilitiesListの中で、もしUsbLegacySupport
があれば、XhciController::request_hc_ownership
を呼ぶ
UsbLegacySupport
がないため呼ばれない -operational.usbcmd
の内、interrupter_enable
, host_system_error_enable
, enable_wrap_event
をfalseにする。
XhciController::reset_controller
を呼ぶ
operational.usbsts.hc_halted
を見て、1 (true) であることを確認operational.usbcmd.host_controller_reset
に 1 (true) を書き込む。operational.usbcmd.host_controller_reset
が 0 (false) になるまで待つoperational.usbsts.controller_not_ready
が 0 (false) になるまで待つcapability.hcsparams1.MaxSlotsEn
(number_of_device_slots)を読み、10との最小値を扱うスロットの数にする。
operational.config.max_device_slots_enabled
を決めたスロットの数にする。(10)DeviceContextBaseAddressArrayPointer
を初期化する。
max_slots + 1
, 64 byte alignment, 4096 byte の倍数をまたがないような配列(DeviceContextBaseAddressArray
)を確保する。*mut [u8; 4096]
が要素である、64 bytes alignment, 長さが、capability.hcsparams2.max_scratchpad_buffer
の、4096byte の倍数をまたがないような配列Aを確保する。(A: Box<[*mut [u8; 4096]>
)[u8; 4096]
へのポインタで初期化する。DeviceContextBaseAddressArray
の 0 番目の要素として、 ↑の配列Aへのポインタを代入する。operational.dcbaap
に、DeviceContexBaseAddress
の領域の先頭へのポインタをsetする。とりあえず #11 で動くようになったのでclose
relates #7 https://github.com/lemolatoon/lemola_osv2/pull/7/commits/89acec103acdc9f5139f0f1cdeb44f38f155bbde 時点