summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/bus/pci/pci_slot.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/bus/pci/pci_slot.cpp')
-rw-r--r--src/devices/bus/pci/pci_slot.cpp186
1 files changed, 186 insertions, 0 deletions
diff --git a/src/devices/bus/pci/pci_slot.cpp b/src/devices/bus/pci/pci_slot.cpp
new file mode 100644
index 00000000000..ae9d42afc63
--- /dev/null
+++ b/src/devices/bus/pci/pci_slot.cpp
@@ -0,0 +1,186 @@
+// license:BSD-3-Clause
+// copyright-holders:Olivier Galibert
+
+// Generic PCI card port
+
+#include "emu.h"
+#include "pci_slot.h"
+
+#include "aha2940au.h"
+#include "audiowerk2.h"
+#include "clgd5446.h"
+#include "clgd546x_laguna.h"
+#include "ds2416.h"
+#include "ess_maestro.h"
+#include "geforce.h"
+#include "mga2064w.h"
+#include "ncr53c825.h"
+#include "neon250.h"
+#include "opti82c861.h"
+#include "oti_spitfire.h"
+#include "pdc20262.h"
+#include "promotion.h"
+#include "riva128.h"
+#include "rivatnt.h"
+#include "rtl8029as_pci.h"
+#include "rtl8139_pci.h"
+#include "sis6326.h"
+#include "sonicvibes.h"
+#include "sw1000xg.h"
+#include "virge_pci.h"
+#include "vision.h"
+#include "vt6306.h"
+#include "wd9710_pci.h"
+#include "zr36057.h"
+
+
+DEFINE_DEVICE_TYPE(PCI_SLOT, pci_slot_device, "pci_slot", "PCI extension motherboard port")
+
+pci_slot_device::pci_slot_device(const machine_config &mconfig, const char *tag, device_t *owner, uint32_t clock) :
+ device_t(mconfig, PCI_SLOT, tag, owner, clock),
+ device_single_card_slot_interface<pci_card_interface>(mconfig, *this)
+{
+}
+
+pci_slot_device::~pci_slot_device()
+{
+}
+
+void pci_slot_device::device_start()
+{
+}
+
+u8 pci_slot_device::get_slot() const
+{
+ return m_slot;
+}
+
+pci_card_device *pci_slot_device::get_card() const
+{
+ return dynamic_cast<pci_card_device *>(get_card_device());
+}
+
+pci_card_interface::pci_card_interface(const machine_config &mconfig, device_t &device) :
+ device_interface(device, "pci_card"),
+ m_pci_slot(dynamic_cast<pci_slot_device *>(device.owner())) // Beware, the owner may not be a pci_slot_device, in which case the cast returns nullptr
+{
+}
+
+pci_card_device::pci_card_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock) :
+ pci_device(mconfig, type, tag, owner, clock),
+ pci_card_interface(mconfig, *this)
+{
+}
+
+pci_card_device::~pci_card_device()
+{
+}
+
+void pci_card_device::device_start()
+{
+ pci_device::device_start();
+
+ if(m_pci_slot)
+ m_pci_slot->get_irq_map(m_irq_map);
+
+ m_pin_state = 0;
+ save_item(NAME(m_pin_state));
+}
+
+void pci_card_device::device_reset()
+{
+ pci_device::device_reset();
+
+ for(int i=0; i != 4; i++)
+ if(m_pin_state & (1 << i))
+ m_pci_root->irq_pin_w(m_irq_map[i], 0);
+ m_pin_state = 0;
+}
+
+void pci_card_device::irq_pin_w(offs_t line, int state)
+{
+ state = state != 0;
+ int pstate = (m_pin_state >> line) & 1;
+ if(pstate == state)
+ return;
+ m_pin_state = (m_pin_state & ~(1 << line)) | (state << line);
+
+ m_pci_root->irq_pin_w(m_irq_map[line], state);
+}
+
+void pci_cards(device_slot_interface &device)
+{
+ // 0x00 - backward compatible pre-class code
+// device.option_add("voodoo1", VOODOO_1_PCI);
+ device.option_add("vision864", VISION864_PCI);
+ device.option_add("vision964", VISION964_PCI);
+
+ // 0x01 - mass storage controllers
+ device.option_add("aha2940au", AHA2940AU);
+ device.option_add("ncr53c825", NCR53C825_PCI);
+ device.option_add("pdc20262", PDC20262);
+
+ // 0x02 - network controllers
+ device.option_add("rtl8029as", RTL8029AS_PCI);
+ device.option_add("rtl8139", RTL8139_PCI);
+
+ // 0x03 - display controllers
+ device.option_add("vision968", VISION968_PCI);
+ device.option_add("virge", VIRGE_PCI);
+ device.option_add("virgedx", VIRGEDX_PCI);
+ device.option_add("virgevx", VIRGEVX_PCI);
+ device.option_add("mga2064w", MGA2064W);
+ device.option_add("promotion3210", PROMOTION3210);
+ device.option_add("gd5446", GD5446_PCI);
+ device.option_add("oti64111", OTI64111_PCI);
+ device.option_add("wd9710", WD9710_PCI);
+
+ // 0x04 - multimedia controllers
+ device.option_add("sw1000xg", SW1000XG);
+ device.option_add("ds2416", DS2416);
+ device.option_add("sonicvibes", SONICVIBES);
+ device.option_add("ess_solo1", ES1946_SOLO1E);
+ device.option_add("zr36057", ZR36057_PCI);
+ device.option_add("audiowerk2", AUDIOWERK2);
+
+ // 0x05 - memory controllers
+ // 0x06 - bridge devices
+ // 0x07 - simple communication controllers
+ // 0x08 - generic system peripherals
+ // 0x09 - input devices
+ // 0x0a - docking stations
+ // 0x0b - processors
+ // 0x0c - Serial Bus controllers
+ device.option_add("vt6306", VT6306_PCI);
+ device.option_add("opti82c861", OPTI_82C861);
+
+ // 0x0d - wireless controllers
+ // 0x0e - Intelligent I/O controllers
+ // 0x0f - Satellite Communication controllers
+ // 0x10 - Encryption/Decryption controllers
+ // 0x11 - Data acquisition and signal processing controllers
+ // 0x12 - Processing accelerators
+ // 0x13 - Debug
+}
+
+// assume all natively with class code 03
+void agp_cards(device_slot_interface &device)
+{
+ // nVidia
+ device.option_add("riva128", RIVA128);
+ device.option_add("riva128zx", RIVA128ZX);
+ device.option_add("rivatnt", RIVATNT);
+ device.option_add("rivatnt2", RIVATNT2);
+ device.option_add("rivatnt2_ultra", RIVATNT2_ULTRA);
+ device.option_add("vanta", VANTA);
+ device.option_add("rivatnt2_m64", RIVATNT2_M64);
+ device.option_add("geforce256", GEFORCE256);
+ device.option_add("geforce256_ddr", GEFORCE256_DDR);
+ device.option_add("quadro", QUADRO);
+ // Cirrus Logic
+ device.option_add("laguna3d", GD5465_LAGUNA3D);
+ // PowerVR VideoLogic
+ device.option_add("neon250", NEON250);
+ // SiS
+ device.option_add("sis6326_agp", SIS6326_AGP);
+}