|
|
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.