summaryrefslogtreecommitdiffstatshomepage
path: root/src/devices/machine/pci.h
diff options
context:
space:
mode:
Diffstat (limited to 'src/devices/machine/pci.h')
-rw-r--r--src/devices/machine/pci.h50
1 files changed, 32 insertions, 18 deletions
diff --git a/src/devices/machine/pci.h b/src/devices/machine/pci.h
index e6acc255802..3d2173de545 100644
--- a/src/devices/machine/pci.h
+++ b/src/devices/machine/pci.h
@@ -29,7 +29,7 @@ public:
void map_config(uint8_t device, address_space *config_space);
- virtual void config_map(address_map &map);
+ virtual void config_map(address_map &map) ATTR_COLD;
uint32_t unmapped_r(offs_t offset, uint32_t mem_mask, int bank);
void unmapped_w(offs_t offset, uint32_t data, uint32_t mem_mask, int bank);
@@ -113,8 +113,8 @@ protected:
bool is_multifunction_device;
uint8_t intr_line, intr_pin;
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
void skip_map_regs(int count);
void add_map(uint64_t size, int flags, const address_map_constructor &map, device_t *relative_to = nullptr);
@@ -133,14 +133,16 @@ protected:
void set_map_address(int id, uint64_t adr);
void set_map_size(int id, uint64_t size);
void set_map_flags(int id, int flags);
+
+ inline address_space *get_pci_busmaster_space() const;
};
class agp_device : public pci_device {
protected:
agp_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
};
class pci_bridge_device : public pci_device, public device_memory_interface {
@@ -159,7 +161,7 @@ public:
virtual uint8_t header_type_r() override;
- virtual void config_map(address_map &map) override;
+ virtual void config_map(address_map &map) override ATTR_COLD;
uint32_t b_address_base_r(offs_t offset);
void b_address_base_w(offs_t offset, uint32_t data);
@@ -204,8 +206,8 @@ protected:
pci_bridge_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
virtual void interface_post_reset() override;
virtual space_config_vector memory_space_config() const override;
@@ -235,13 +237,15 @@ class agp_bridge_device : public pci_bridge_device {
protected:
agp_bridge_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
};
class pci_host_device : public pci_bridge_device {
public:
- void io_configuration_access_map(address_map &map);
+ void io_configuration_access_map(address_map &map) ATTR_COLD;
+
+ void set_spaces(address_space *memory, address_space *io = nullptr, address_space *busmaster = nullptr);
protected:
pci_host_device(const machine_config &mconfig, device_type type, const char *tag, device_t *owner, uint32_t clock);
@@ -253,8 +257,8 @@ protected:
uint32_t config_data_ex_r(offs_t offset, uint32_t mem_mask = ~0);
void config_data_ex_w(offs_t offset, uint32_t data, uint32_t mem_mask = ~0);
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
virtual void interface_post_reset() override;
virtual device_t *bus_root() override;
@@ -264,12 +268,13 @@ protected:
void regenerate_mapping();
- address_space *memory_space, *io_space;
-
uint64_t memory_window_start, memory_window_end, memory_offset;
uint64_t io_window_start, io_window_end, io_offset;
uint32_t config_address;
+
+private:
+ address_space *memory_space, *io_space;
};
using pci_pin_mapper = device_delegate<int (int)>;
@@ -285,16 +290,25 @@ public:
void set_pin_mapper(pci_pin_mapper &&mapper) { m_pin_mapper = std::move(mapper); }
void set_irq_handler(pci_irq_handler &&handler) { m_irq_handler = std::move(handler); }
+ address_space *get_pci_busmaster_space() const { return m_pci_busmaster_space; }
+
+ void set_pci_busmaster_space(address_space *space) { m_pci_busmaster_space = space; }
+
protected:
- virtual void device_start() override;
- virtual void device_reset() override;
+ virtual void device_start() override ATTR_COLD;
+ virtual void device_reset() override ATTR_COLD;
private:
pci_pin_mapper m_pin_mapper;
pci_irq_handler m_irq_handler;
-
+ address_space *m_pci_busmaster_space;
};
+address_space *pci_device::get_pci_busmaster_space() const
+{
+ return m_pci_root->get_pci_busmaster_space();
+}
+
DECLARE_DEVICE_TYPE(PCI_ROOT, pci_root_device)
DECLARE_DEVICE_TYPE(PCI_BRIDGE, pci_bridge_device)