|
|
1.1 ! root 1: // ! 2: // nono ! 3: // Copyright (C) 2025 nono project ! 4: // Licensed under nono-license.txt ! 5: // ! 6: ! 7: // ! 8: // SCSI ドメイン ! 9: // ! 10: ! 11: #pragma once ! 12: ! 13: #include "device.h" ! 14: #include <array> ! 15: ! 16: class SCSIBus; ! 17: class SCSIDevice; ! 18: class SCSIHostDevice; ! 19: class SCSITarget; ! 20: ! 21: // ! 22: // 一つの SCSI イニシエータとそのターゲットデバイス一式の管理構造。 ! 23: // 設定周りとインスタンスの所有。 ! 24: // バスは含まない (VirtIO SCSI だとバスという構造が存在しないため)。 ! 25: // ! 26: class SCSIDomain : public Device ! 27: { ! 28: using inherited = Device; ! 29: ! 30: public: ! 31: // このドメインで扱うデバイス数。 ! 32: static constexpr size_t MaxDevices = 8; ! 33: ! 34: public: ! 35: SCSIDomain(IODevice *parent_, const char *config_name_); ! 36: ~SCSIDomain() override; ! 37: ! 38: bool Create() override; ! 39: bool Init() override; ! 40: ! 41: // 設定ファイル上のこのホストデバイスを示す接頭語を返す ! 42: const char *GetConfigName() const noexcept { return config_name; } ! 43: ! 44: // イニシエータを返す。ないことはないはず。 ! 45: SCSIHostDevice *GetInitiator() const noexcept { return initiator.get(); } ! 46: ! 47: // すべてのターゲットをバスに参加させる。 ! 48: void AttachTargets(SCSIBus *bus_); ! 49: ! 50: // イニシエータに ID を付与してバスに参加させる。 ! 51: bool AttachInitiator(SCSIBus *bus_, uint id); ! 52: ! 53: // 指定 id のターゲットデバイスを返す。なければ NULL を返す。 ! 54: SCSITarget *GetTarget(uint id) const noexcept { return target[id].get(); } ! 55: ! 56: // デバイス (イニシエータ+ターゲット) 配列のコピーを返す。 ! 57: void GetDevices(std::array<SCSIDevice *, MaxDevices> *dst) const { ! 58: *dst = device; ! 59: } ! 60: ! 61: // 指定 id のデバイスを返す。なければ NULL を返す。 ! 62: SCSIDevice *GetDevice(uint id) const { return device[id]; } ! 63: ! 64: // (イニシエータを除く) デバイス数を返す。 ! 65: uint GetTargetCount() const; ! 66: ! 67: // (イニシエータがあれば含む) すべてのデバイスのリストを返す。 ! 68: const std::vector<SCSIDevice*>& GetConnectedDevices() const noexcept { ! 69: return connected_devices; ! 70: } ! 71: ! 72: private: ! 73: DECLARE_MONITOR_CALLBACK(MonitorUpdate); ! 74: ! 75: // device[] と connected_devices を更新する。 ! 76: bool RefreshDevices(); ! 77: ! 78: // 設定ファイルに使われるこのホストデバイスを示す接頭語。 ! 79: // ("spc0" とか) ! 80: const char *config_name {}; ! 81: ! 82: // SCSI イニシエータ (所有) ! 83: std::unique_ptr<SCSIHostDevice> initiator /*{}*/; ! 84: ! 85: // SCSI ターゲット (所有)。イニシエータは含まない。 ! 86: std::array<std::unique_ptr<SCSITarget>, MaxDevices> target /*{}*/; ! 87: ! 88: // SCSI デバイス (イニシエータ+ターゲット) のポインタ。 ! 89: std::array<SCSIDevice *, MaxDevices> device {}; ! 90: ! 91: // 接続中のデバイス(イニシエータ含む)を ID 順に詰めたリスト。 ! 92: std::vector<SCSIDevice*> connected_devices {}; ! 93: ! 94: IODevice *parent {}; ! 95: ! 96: Monitor *monitor {}; ! 97: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.