diff options
Diffstat (limited to 'src/devices/machine/pci.h')
-rw-r--r-- | src/devices/machine/pci.h | 50 |
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) |