--- nono/vm/scsibus.h 2026/04/29 17:04:29 1.1 +++ nono/vm/scsibus.h 2026/04/29 17:05:43 1.1.1.11 @@ -1,112 +1,54 @@ // // nono -// Copyright (C) 2020 isaki@NetBSD.org +// Copyright (C) 2020 nono project +// Licensed under nono-license.txt // +// // SCSI バス +// #pragma once -#include "device.h" -#include "scheduler.h" +#include "event.h" #include "scsi.h" +#include -// フェーズ遷移についてのメモ。 -// -// イニシエータ(この時点ではまだ候補だが)が BSY を立てることで -// (バスフリーフェーズから) アービトレーションフェーズに移る。 -// 現行では規定時間後に自動的にイニシエータが勝利する(バスは何もしない)。 -// イニシエータが SEL 立てて BSY を下ろすことで、セレクションフェーズに移る。 -// この間の遷移は以下の通り。 -// BSY SEL -// 0 0 BusFree -// ↓ イニシエータ(候補)が BSY を立てる -// 1 0 Arbitration (バスは何もしない) -// ↓ イニシエータが SEL を立てる -// 1 1 Arbitration -// ↓ イニシエータがデータバスにターゲットをセットして BSY を下ろす -// 0 1 Selection -// -// バスはセレクションフェーズ遷移後、規定時間でターゲットに通知。 -// ターゲットは即 BSY を立てるのでバスはこれをイニシエータに通知。 -// イニシエータは SEL を下げるのでバスはこれをターゲットに通知。 -// この間の遷移は以下の通り。 -// BSY SEL -// 0 1 Selection (ターゲットに通知) -// ↓ ターゲットが BSY を立てる -// 1 1 Selection (イニシエータに通知) -// ↓ イニシエータがデータバスと SEL を下げる -// 1 0 Transfer (ターゲットに通知) -// -// バスは Transfer 後、規定時間でターゲットに通知。 -// ターゲットは転送フェーズ(の最初のコマンドフェーズ) に移行する。 - -// 転送フェーズについてのメモ。 -// -// -----> (実線) は関数呼び出し -// - - -> (破線) は関数からの戻り -// 〜〜-> (波線) はイベントコールバックによる呼び出し -// -// マニュアル転送は以下のようになる。 -// 基本的にはターゲットが REQ を上げたことをイベントでイニシエータに通知し、 -// イニシエータは基本的に関数呼び出しでターゲットを操作することにする。 -// -// 非同期転送時の REQ/ACK シーケンスに時間規定はないが、時間を考慮せずに -// 実行してしまうと現実より速い転送が出来てしまう可能性があるので、ここでは -// AssertREQ が TransferReqCB を呼び出すところでタイミングを調整する。 -// 具体的には前回の TransferReqCB から 1usec 以上空けるというのはどうか。 -// -// イニシエータ ターゲット -// ------------ ---------- -// Event 〜〜-> StartTransferCB -// ↓ -// REQ を上げる -// TransferReqCB <-〜〜〜 Event 〜〜〜 -// ACK を上げる -// +------ AssertACK() ---> TransferCB -// 1バイト送受信 -// REQ を下げる -// < - - - - - - - - - - - return; -// (誰かが) -// ACK を下げる -// +------ NegateACK() ---> TransferAckCB -// REQ を上げる 〜〜+ -// < - - - - - - - - - - - return; : -// : -// TransferReqCB <-〜〜〜 Event 〜〜〜〜〜〜〜〜〜〜〜〜+ -// -// ハードウェア転送の場合は ACK 一往復を省略して以下のようにする。 -// Transfer() (TransferCB()) は ACK が立っていなければハードウェア転送と -// 判断する。 -// -// イニシエータ ターゲット -// ------------ ---------- -// Event 〜〜-> StartTransferCB -// ↓ -// REQ を上げる -// TransferReqCB <-〜〜〜 Event 〜〜〜 -// | -// +------- Transfer() ---> TransferCB -// 1バイト送受信 -// REQ を下げる -// REQ を上げる 〜〜+ -// < - - - - - - - - - - - return; : -// : -// TransferReqCB <-〜〜〜 Event 〜〜〜〜〜〜〜〜〜〜〜〜+ -// - +class SCSIDevice; +class SCSIDisk; +class SCSIDomain; +class SCSIHostDevice; +class SCSITarget; // // SCSI バス // class SCSIBus : public Device { + using inherited = Device; + + public: + // (1< device {}; // イベント - Event event {}; + Event event { this }; }; - -// (1<