diff --git a/repos/os/include/pci_device/client.h b/repos/os/include/pci_device/client.h index 8244955d7..9cf24c298 100644 --- a/repos/os/include/pci_device/client.h +++ b/repos/os/include/pci_device/client.h @@ -47,6 +47,9 @@ struct Pci::Device_client : public Genode::Rpc_client void config_write(unsigned char address, unsigned value, Access_size size) override { call(address, value, size); } + + Genode::Irq_session_capability irq(Genode::uint8_t id) override { + return call(id); } }; #endif /* _INCLUDE__PCI_DEVICE__CLIENT_H_ */ diff --git a/repos/os/include/pci_device/pci_device.h b/repos/os/include/pci_device/pci_device.h index 715caa877..3d7637662 100644 --- a/repos/os/include/pci_device/pci_device.h +++ b/repos/os/include/pci_device/pci_device.h @@ -15,12 +15,17 @@ #define _INCLUDE__PCI_DEVICE__PCI_DEVICE_H_ #include +#include #include +#include + +/* os includes */ +#include namespace Pci { struct Device; } -struct Pci::Device +struct Pci::Device : Platform::Device { class Resource { @@ -194,10 +199,11 @@ struct Pci::Device unsigned char, Access_size); GENODE_RPC(Rpc_config_write, void, config_write, unsigned char, unsigned, Access_size); + GENODE_RPC(Rpc_irq, Genode::Irq_session_capability, irq, Genode::uint8_t); GENODE_RPC_INTERFACE(Rpc_bus_address, Rpc_vendor_id, Rpc_device_id, Rpc_class_code, Rpc_resource, Rpc_config_read, - Rpc_config_write); + Rpc_config_write, Rpc_irq); }; #endif /* _INCLUDE__PCI_DEVICE__PCI_DEVICE_H_ */ diff --git a/repos/os/include/platform/device.h b/repos/os/include/platform/device.h new file mode 100644 index 000000000..4848ad810 --- /dev/null +++ b/repos/os/include/platform/device.h @@ -0,0 +1,26 @@ +/* + * \brief Abstract platform device interface + * \author Alexander Boettcher + * \date 2015-03-15 + */ + +/* + * Copyright (C) 2015 Genode Labs GmbH + * + * This file is part of the Genode OS framework, which is distributed + * under the terms of the GNU General Public License version 2. + */ + +#pragma once + +#include + +namespace Platform { class Device; } + +struct Platform::Device +{ + /** + * Get IRQ session capability + */ + virtual Genode::Irq_session_capability irq(Genode::uint8_t) = 0; +}; diff --git a/repos/os/src/drivers/acpi/main.cc b/repos/os/src/drivers/acpi/main.cc index bbf21393d..9a4ae7c7a 100644 --- a/repos/os/src/drivers/acpi/main.cc +++ b/repos/os/src/drivers/acpi/main.cc @@ -168,7 +168,7 @@ class Pci_policy : public Genode::Slave_policy, public Pci::Provider static char const *permitted_services[] = { "CPU", "CAP", "RM", "LOG", "IO_PORT", "PD", "ROM", "RAM", "SIGNAL", - "IO_MEM", 0 }; + "IO_MEM", "IRQ", 0 }; return permitted_services; }; diff --git a/repos/os/src/drivers/pci/pci_device_component.h b/repos/os/src/drivers/pci/pci_device_component.h index 010b1a598..878618405 100644 --- a/repos/os/src/drivers/pci/pci_device_component.h +++ b/repos/os/src/drivers/pci/pci_device_component.h @@ -20,6 +20,7 @@ #include #include +#include #include "pci_device_config.h" @@ -33,6 +34,10 @@ namespace Pci { Device_config _device_config; Genode::addr_t _config_space; Genode::Io_mem_connection *_io_mem; + Config_access _config_access; + Genode::Irq_connection _irq; + + enum { PCI_IRQ = 0x3c }; public: @@ -42,7 +47,10 @@ namespace Pci { Device_component(Device_config device_config, Genode::addr_t addr) : _device_config(device_config), _config_space(addr), - _io_mem(0) { } + _io_mem(0), + _irq(_device_config.read(&_config_access, PCI_IRQ, + Pci::Device::ACCESS_8BIT)) + { } /**************************************** ** Methods used solely by pci session ** @@ -104,6 +112,13 @@ namespace Pci { _device_config.write(&config_access, address, value, size); } + + Genode::Irq_session_capability irq(Genode::uint8_t id) override + { + if (id != 0) + return Genode::Irq_session_capability(); + return _irq_session.cap(); + } }; }