|
|
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:
1.1.1.2 ! root 35: SCSIDomain(IODevice *parent_,
! 36: const char *domain_name_, const char *config_name_);
1.1 root 37: ~SCSIDomain() override;
38:
39: bool Create() override;
40: bool Init() override;
41:
1.1.1.2 ! root 42: // このホストデバイス名を返す。
! 43: const char *GetDomainName() const noexcept { return domain_name; }
! 44:
1.1 root 45: // 設定ファイル上のこのホストデバイスを示す接頭語を返す
46: const char *GetConfigName() const noexcept { return config_name; }
47:
48: // イニシエータを返す。ないことはないはず。
49: SCSIHostDevice *GetInitiator() const noexcept { return initiator.get(); }
50:
51: // すべてのターゲットをバスに参加させる。
52: void AttachTargets(SCSIBus *bus_);
53:
54: // イニシエータに ID を付与してバスに参加させる。
55: bool AttachInitiator(SCSIBus *bus_, uint id);
56:
57: // 指定 id のターゲットデバイスを返す。なければ NULL を返す。
58: SCSITarget *GetTarget(uint id) const noexcept { return target[id].get(); }
59:
60: // デバイス (イニシエータ+ターゲット) 配列のコピーを返す。
61: void GetDevices(std::array<SCSIDevice *, MaxDevices> *dst) const {
62: *dst = device;
63: }
64:
65: // 指定 id のデバイスを返す。なければ NULL を返す。
66: SCSIDevice *GetDevice(uint id) const { return device[id]; }
67:
68: // (イニシエータを除く) デバイス数を返す。
69: uint GetTargetCount() const;
70:
71: // (イニシエータがあれば含む) すべてのデバイスのリストを返す。
72: const std::vector<SCSIDevice*>& GetConnectedDevices() const noexcept {
73: return connected_devices;
74: }
75:
76: private:
1.1.1.2 ! root 77: DECLARE_MONITOR_SCREEN(MonitorScreen);
1.1 root 78:
79: // device[] と connected_devices を更新する。
80: bool RefreshDevices();
81:
1.1.1.2 ! root 82: // デバイスのログ表示名用 (コントローラ名)。
! 83: // "SPC0", "VIOSCSI" とか (VirtIO-SCSI では長いので縮める)。
! 84: const char *domain_name {};
! 85:
1.1 root 86: // 設定ファイルに使われるこのホストデバイスを示す接頭語。
1.1.1.2 ! root 87: // "spc0", "virtio-scsi" とか (こっちはもう気軽に変更できないので)。
1.1 root 88: const char *config_name {};
89:
90: // SCSI イニシエータ (所有)
91: std::unique_ptr<SCSIHostDevice> initiator /*{}*/;
92:
93: // SCSI ターゲット (所有)。イニシエータは含まない。
94: std::array<std::unique_ptr<SCSITarget>, MaxDevices> target /*{}*/;
95:
96: // SCSI デバイス (イニシエータ+ターゲット) のポインタ。
97: std::array<SCSIDevice *, MaxDevices> device {};
98:
99: // 接続中のデバイス(イニシエータ含む)を ID 順に詰めたリスト。
100: std::vector<SCSIDevice*> connected_devices {};
101:
102: IODevice *parent {};
103:
104: Monitor *monitor {};
105: };
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.