From f809124a2ecbde04a8f9daba16eed561ba8776ae Mon Sep 17 00:00:00 2001 From: Maxim Poliakovski Date: Tue, 30 May 2023 19:46:27 +0200 Subject: [PATCH] Improve SCSI bus registration. --- devices/common/scsi/mesh.cpp | 2 +- devices/common/scsi/sc53c94.cpp | 2 +- devices/common/scsi/scsi.h | 10 +++++++++- .../common/scsi/{scsi_bus.cpp => scsibus.cpp} | 17 +++++++++++++++-- devices/ioctrl/amic.cpp | 2 +- devices/ioctrl/grandcentral.cpp | 2 +- devices/ioctrl/heathrow.cpp | 2 +- devices/ioctrl/ohare.cpp | 2 +- machines/machinecatalyst.cpp | 4 ---- machines/machinegossamer.cpp | 3 --- machines/machinepdm.cpp | 5 ++--- machines/machinetnt.cpp | 4 ---- machines/machineyosemite.cpp | 4 ---- 13 files changed, 32 insertions(+), 27 deletions(-) rename devices/common/scsi/{scsi_bus.cpp => scsibus.cpp} (94%) diff --git a/devices/common/scsi/mesh.cpp b/devices/common/scsi/mesh.cpp index 78518b5..7f22ad8 100644 --- a/devices/common/scsi/mesh.cpp +++ b/devices/common/scsi/mesh.cpp @@ -34,7 +34,7 @@ using namespace MeshScsi; int MeshController::device_postinit() { - this->bus_obj = dynamic_cast(gMachineObj->get_comp_by_name("SCSI0")); + this->bus_obj = dynamic_cast(gMachineObj->get_comp_by_name("Scsi0")); this->int_ctrl = dynamic_cast( gMachineObj->get_comp_by_type(HWCompType::INT_CTRL)); diff --git a/devices/common/scsi/sc53c94.cpp b/devices/common/scsi/sc53c94.cpp index 481b26e..b88fa01 100644 --- a/devices/common/scsi/sc53c94.cpp +++ b/devices/common/scsi/sc53c94.cpp @@ -42,7 +42,7 @@ Sc53C94::Sc53C94(uint8_t chip_id, uint8_t my_id) : ScsiDevice(my_id) int Sc53C94::device_postinit() { - this->bus_obj = dynamic_cast(gMachineObj->get_comp_by_name("SCSI0")); + this->bus_obj = dynamic_cast(gMachineObj->get_comp_by_name("Scsi0")); this->bus_obj->register_device(7, static_cast(this)); this->int_ctrl = dynamic_cast( diff --git a/devices/common/scsi/scsi.h b/devices/common/scsi/scsi.h index 1fb010a..ba4d50e 100644 --- a/devices/common/scsi/scsi.h +++ b/devices/common/scsi/scsi.h @@ -196,9 +196,17 @@ protected: /** This class provides a higher level abstraction for the SCSI bus. */ class ScsiBus : public HWComponent { public: - ScsiBus(); + ScsiBus(const std::string name); ~ScsiBus() = default; + static std::unique_ptr create_first() { + return std::unique_ptr(new ScsiBus("SCSIO")); + } + + static std::unique_ptr create_second() { + return std::unique_ptr(new ScsiBus("SCSI1")); + } + // low-level state management void register_device(int id, ScsiDevice* dev_obj); int current_phase() { return this->cur_phase; }; diff --git a/devices/common/scsi/scsi_bus.cpp b/devices/common/scsi/scsibus.cpp similarity index 94% rename from devices/common/scsi/scsi_bus.cpp rename to devices/common/scsi/scsibus.cpp index 0079fa9..01b4144 100644 --- a/devices/common/scsi/scsi_bus.cpp +++ b/devices/common/scsi/scsibus.cpp @@ -1,6 +1,6 @@ /* DingusPPC - The Experimental PowerPC Macintosh emulator -Copyright (C) 2018-22 divingkatae and maximum +Copyright (C) 2018-23 divingkatae and maximum (theweirdo) spatium (Contact divingkatae#1017 or powermax#2286 on Discord for more info) @@ -23,12 +23,14 @@ along with this program. If not, see . #include #include +#include #include #include -ScsiBus::ScsiBus() +ScsiBus::ScsiBus(const std::string name) { + this->set_name(name); supports_types(HWCompType::SCSI_BUS); for(int i = 0; i < SCSI_MAX_DEVS; i++) { @@ -273,3 +275,14 @@ void ScsiBus::disconnect(int dev_id) change_bus_phase(dev_id); } } + +static const DeviceDescription Scsi0_Descriptor = { + ScsiBus::create_first, {}, {} +}; + +static const DeviceDescription Scsi1_Descriptor = { + ScsiBus::create_second, {}, {} +}; + +REGISTER_DEVICE(Scsi0, Scsi0_Descriptor); +REGISTER_DEVICE(Scsi1, Scsi1_Descriptor); diff --git a/devices/ioctrl/amic.cpp b/devices/ioctrl/amic.cpp index ac051e0..74b4207 100644 --- a/devices/ioctrl/amic.cpp +++ b/devices/ioctrl/amic.cpp @@ -625,7 +625,7 @@ DmaPullResult AmicScsiDma::pull_data(uint32_t req_len, uint32_t *avail_len, } static vector Amic_Subdevices = { - "Sc53C94", "Escc", "Mace", "ViaCuda", "Swim3" + "Scsi0", "Sc53C94", "Escc", "Mace", "ViaCuda", "Swim3" }; static const DeviceDescription Amic_Descriptor = { diff --git a/devices/ioctrl/grandcentral.cpp b/devices/ioctrl/grandcentral.cpp index 79008f3..e3e080f 100644 --- a/devices/ioctrl/grandcentral.cpp +++ b/devices/ioctrl/grandcentral.cpp @@ -323,7 +323,7 @@ void GrandCentral::ack_dma_int(uint32_t irq_id, uint8_t irq_line_state) } static const vector GCSubdevices = { - "NVRAM", "ViaCuda", "Escc", "Sc53C94", "Mace", "Swim3" + "NVRAM", "ViaCuda", "Escc", "Scsi0", "Sc53C94", "Mace", "Swim3" }; static const DeviceDescription GC_Descriptor = { diff --git a/devices/ioctrl/heathrow.cpp b/devices/ioctrl/heathrow.cpp index bacc99c..11668e4 100644 --- a/devices/ioctrl/heathrow.cpp +++ b/devices/ioctrl/heathrow.cpp @@ -425,7 +425,7 @@ void HeathrowIC::clear_cpu_int() } static const vector Heathrow_Subdevices = { - "NVRAM", "ViaCuda", "Mesh", "Escc", "Swim3", "Ide0", "Ide1"}; + "NVRAM", "ViaCuda", "Scsi0", "Mesh", "Escc", "Swim3", "Ide0", "Ide1"}; static const DeviceDescription Heathrow_Descriptor = { HeathrowIC::create, Heathrow_Subdevices, {} diff --git a/devices/ioctrl/ohare.cpp b/devices/ioctrl/ohare.cpp index abc1687..4695530 100644 --- a/devices/ioctrl/ohare.cpp +++ b/devices/ioctrl/ohare.cpp @@ -226,7 +226,7 @@ void OHare::ack_dma_int(uint32_t irq_id, uint8_t irq_line_state) } static const vector OHare_Subdevices = { - "NVRAM", "ViaCuda", "Mesh", "Escc", "Swim3" + "NVRAM", "ViaCuda", "Scsi0", "Mesh", "Escc", "Swim3" }; static const DeviceDescription OHare_Descriptor = { diff --git a/machines/machinecatalyst.cpp b/machines/machinecatalyst.cpp index 474931a..7958359 100644 --- a/machines/machinecatalyst.cpp +++ b/machines/machinecatalyst.cpp @@ -23,7 +23,6 @@ along with this program. If not, see . #include #include -#include #include #include #include @@ -61,9 +60,6 @@ int initialize_catalyst(std::string& id) // allocate and map physical RAM platinum_obj->map_phys_ram(); - // add single SCSI bus - gMachineObj->add_device("SCSI0", std::unique_ptr(new ScsiBus())); - // init virtual CPU and request MPC601 ppc_cpu_init(platinum_obj, PPC_VER::MPC601, 7833600ULL); diff --git a/machines/machinegossamer.cpp b/machines/machinegossamer.cpp index 4c638a2..dd65f05 100644 --- a/machines/machinegossamer.cpp +++ b/machines/machinegossamer.cpp @@ -28,7 +28,6 @@ along with this program. If not, see . #include #include #include -#include #include #include #include @@ -126,8 +125,6 @@ int initialize_gossamer(std::string& id) grackle_obj->pci_register_device( DEV_FUN(0x12,0), dynamic_cast(gMachineObj->get_comp_by_name(id == "pmg3twr" ? "AtiRagePro" : "AtiRageGT"))); - gMachineObj->add_device("SCSI0", std::unique_ptr(new ScsiBus())); - // add Athens clock generator device and register it with the I2C host gMachineObj->add_device("Athens", std::unique_ptr(new AthensClocks(0x28))); I2CBus* i2c_bus = dynamic_cast(gMachineObj->get_comp_by_type(HWCompType::I2C_HOST)); diff --git a/machines/machinepdm.cpp b/machines/machinepdm.cpp index a7f3b59..d2de4eb 100644 --- a/machines/machinepdm.cpp +++ b/machines/machinepdm.cpp @@ -82,9 +82,8 @@ int initialize_pdm(std::string& id) return -1; } - // add internal SCSI bus - gMachineObj->add_device("SCSI0", std::unique_ptr(new ScsiBus())); - auto scsi_bus = dynamic_cast(gMachineObj->get_comp_by_name("SCSI0")); + // get internal SCSI bus object + auto scsi_bus = dynamic_cast(gMachineObj->get_comp_by_name("Scsi0")); std::string hd_image_path = GET_STR_PROP("hdd_img"); if (!hd_image_path.empty()) { diff --git a/machines/machinetnt.cpp b/machines/machinetnt.cpp index e1a2648..36a8e42 100644 --- a/machines/machinetnt.cpp +++ b/machines/machinetnt.cpp @@ -23,7 +23,6 @@ along with this program. If not, see . #include #include -#include #include #include #include @@ -68,9 +67,6 @@ int initialize_tnt(std::string& id) // allocate and map physical RAM memctrl_obj->map_phys_ram(); - // add single SCSI bus - gMachineObj->add_device("SCSI0", std::unique_ptr(new ScsiBus())); - // init virtual CPU and request MPC601 ppc_cpu_init(memctrl_obj, PPC_VER::MPC601, 7833600ULL); diff --git a/machines/machineyosemite.cpp b/machines/machineyosemite.cpp index ca017f0..406b0d2 100644 --- a/machines/machineyosemite.cpp +++ b/machines/machineyosemite.cpp @@ -23,7 +23,6 @@ along with this program. If not, see . #include #include -#include #include #include #include @@ -65,9 +64,6 @@ int initialize_yosemite(std::string& id) return -1; } - // add internal SCSI bus - gMachineObj->add_device("SCSI0", std::unique_ptr(new ScsiBus())); - // configure RAM slots setup_ram_slot("RAM_DIMM_1", 0x50, GET_INT_PROP("rambank1_size")); setup_ram_slot("RAM_DIMM_2", 0x51, GET_INT_PROP("rambank2_size"));