From 31faee3b5c0de1abe70d41e5ff0c6e72e35f1e6b Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Fri, 27 Mar 2015 14:13:46 +0100 Subject: [PATCH] pci: provide irq capability via device interface Issue #1471 --- repos/os/include/pci_device/client.h | 3 +++ repos/os/include/pci_device/pci_device.h | 10 +++++-- repos/os/include/platform/device.h | 26 +++++++++++++++++++ repos/os/src/drivers/acpi/main.cc | 2 +- .../os/src/drivers/pci/pci_device_component.h | 17 +++++++++++- 5 files changed, 54 insertions(+), 4 deletions(-) create mode 100644 repos/os/include/platform/device.h 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(); + } }; }