2011-12-22 16:19:25 +01:00
|
|
|
/*
|
|
|
|
* \brief PCI-device interface
|
|
|
|
* \author Norman Feske
|
|
|
|
* \date 2008-01-28
|
|
|
|
*/
|
|
|
|
|
|
|
|
/*
|
2017-02-20 13:23:52 +01:00
|
|
|
* Copyright (C) 2008-2017 Genode Labs GmbH
|
2011-12-22 16:19:25 +01:00
|
|
|
*
|
|
|
|
* This file is part of the Genode OS framework, which is distributed
|
2017-02-20 13:23:52 +01:00
|
|
|
* under the terms of the GNU Affero General Public License version 3.
|
2011-12-22 16:19:25 +01:00
|
|
|
*/
|
|
|
|
|
2015-06-08 09:05:32 +02:00
|
|
|
#pragma once
|
2011-12-22 16:19:25 +01:00
|
|
|
|
|
|
|
#include <base/rpc.h>
|
2015-03-27 14:13:46 +01:00
|
|
|
#include <base/signal.h>
|
2015-04-17 14:12:30 +02:00
|
|
|
#include <base/exception.h>
|
2013-02-18 10:06:34 +01:00
|
|
|
#include <io_mem_session/io_mem_session.h>
|
2015-04-17 13:40:32 +02:00
|
|
|
#include <io_port_session/capability.h>
|
2015-03-27 14:13:46 +01:00
|
|
|
#include <irq_session/capability.h>
|
2015-04-17 14:12:30 +02:00
|
|
|
#include <ram_session/ram_session.h>
|
2015-03-27 14:13:46 +01:00
|
|
|
|
|
|
|
/* os includes */
|
2015-09-03 14:55:05 +02:00
|
|
|
#include <platform_device/device.h>
|
2011-12-22 16:19:25 +01:00
|
|
|
|
Streamline exception types
This patch reduces the number of exception types by facilitating
globally defined exceptions for common usage patterns shared by most
services. In particular, RPC functions that demand a session-resource
upgrade not longer reflect this condition via a session-specific
exception but via the 'Out_of_ram' or 'Out_of_caps' types.
Furthermore, the 'Parent::Service_denied', 'Parent::Unavailable',
'Root::Invalid_args', 'Root::Unavailable', 'Service::Invalid_args',
'Service::Unavailable', and 'Local_service::Factory::Denied' types have
been replaced by the single 'Service_denied' exception type defined in
'session/session.h'.
This consolidation eases the error handling (there are fewer exceptions
to handle), alleviates the need to convert exceptions along the
session-creation call chain, and avoids possible aliasing problems
(catching the wrong type with the same name but living in a different
scope).
2017-05-07 22:03:22 +02:00
|
|
|
namespace Platform {
|
2015-04-17 14:12:30 +02:00
|
|
|
|
Streamline exception types
This patch reduces the number of exception types by facilitating
globally defined exceptions for common usage patterns shared by most
services. In particular, RPC functions that demand a session-resource
upgrade not longer reflect this condition via a session-specific
exception but via the 'Out_of_ram' or 'Out_of_caps' types.
Furthermore, the 'Parent::Service_denied', 'Parent::Unavailable',
'Root::Invalid_args', 'Root::Unavailable', 'Service::Invalid_args',
'Service::Unavailable', and 'Local_service::Factory::Denied' types have
been replaced by the single 'Service_denied' exception type defined in
'session/session.h'.
This consolidation eases the error handling (there are fewer exceptions
to handle), alleviates the need to convert exceptions along the
session-creation call chain, and avoids possible aliasing problems
(catching the wrong type with the same name but living in a different
scope).
2017-05-07 22:03:22 +02:00
|
|
|
struct Device;
|
|
|
|
|
|
|
|
using Genode::Out_of_caps;
|
|
|
|
using Genode::Out_of_ram;
|
|
|
|
}
|
2011-12-22 16:19:25 +01:00
|
|
|
|
|
|
|
|
2015-06-08 09:05:32 +02:00
|
|
|
struct Platform::Device : Platform::Abstract_device
|
2015-03-04 21:12:14 +01:00
|
|
|
{
|
2015-04-17 14:12:30 +02:00
|
|
|
/*********************
|
|
|
|
** Exception types **
|
|
|
|
*********************/
|
|
|
|
|
2015-03-04 21:12:14 +01:00
|
|
|
class Resource
|
|
|
|
{
|
|
|
|
private:
|
|
|
|
|
|
|
|
unsigned _bar; /* content of base-address register */
|
|
|
|
unsigned _size; /* resource size */
|
|
|
|
|
|
|
|
public:
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Resource type, either port I/O resource or memory-mapped resource
|
|
|
|
*/
|
|
|
|
enum Type { IO, MEMORY, INVALID };
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Default constructor
|
|
|
|
*/
|
|
|
|
Resource() { }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Constructor
|
|
|
|
*
|
|
|
|
* \param bar content of base-address register
|
|
|
|
* \param size resource size
|
|
|
|
*
|
|
|
|
* This constructor is only used by the PCI bus driver
|
|
|
|
* that implements the server-side of the the PCI session.
|
|
|
|
* If bar is set to zero, the constructed resource description
|
|
|
|
* represents an INVALID resource.
|
|
|
|
*/
|
|
|
|
Resource(unsigned bar, unsigned size)
|
|
|
|
: _bar(bar), _size(size) { }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return base address of resource
|
|
|
|
*/
|
base: avoid use of deprecated base/printf.h
Besides adapting the components to the use of base/log.h, the patch
cleans up a few base headers, i.e., it removes unused includes from
root/component.h, specifically base/heap.h and
ram_session/ram_session.h. Hence, components that relied on the implicit
inclusion of those headers have to manually include those headers now.
While adjusting the log messages, I repeatedly stumbled over the problem
that printing char * arguments is ambiguous. It is unclear whether to
print the argument as pointer or null-terminated string. To overcome
this problem, the patch introduces a new type 'Cstring' that allows the
caller to express that the argument should be handled as null-terminated
string. As a nice side effect, with this type in place, the optional len
argument of the 'String' class could be removed. Instead of supplying a
pair of (char const *, size_t), the constructor accepts a 'Cstring'.
This, in turn, clears the way let the 'String' constructor use the new
output mechanism to assemble a string from multiple arguments (and
thereby getting rid of snprintf within Genode in the near future).
To enforce the explicit resolution of the char * ambiguity, the 'char *'
overload of the 'print' function is marked as deleted.
Issue #1987
2016-07-13 19:07:09 +02:00
|
|
|
unsigned base() const
|
2015-03-04 21:12:14 +01:00
|
|
|
{
|
|
|
|
/*
|
|
|
|
* Mask out the resource-description bits of the base
|
|
|
|
* address register. I/O resources use the lowest 3
|
|
|
|
* bits, memory resources use the lowest 4 bits.
|
2011-12-22 16:19:25 +01:00
|
|
|
*/
|
2015-03-04 21:12:14 +01:00
|
|
|
return _bar & ((type() == IO) ? ~7 : ~15);
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return resource size in bytes
|
|
|
|
*/
|
base: avoid use of deprecated base/printf.h
Besides adapting the components to the use of base/log.h, the patch
cleans up a few base headers, i.e., it removes unused includes from
root/component.h, specifically base/heap.h and
ram_session/ram_session.h. Hence, components that relied on the implicit
inclusion of those headers have to manually include those headers now.
While adjusting the log messages, I repeatedly stumbled over the problem
that printing char * arguments is ambiguous. It is unclear whether to
print the argument as pointer or null-terminated string. To overcome
this problem, the patch introduces a new type 'Cstring' that allows the
caller to express that the argument should be handled as null-terminated
string. As a nice side effect, with this type in place, the optional len
argument of the 'String' class could be removed. Instead of supplying a
pair of (char const *, size_t), the constructor accepts a 'Cstring'.
This, in turn, clears the way let the 'String' constructor use the new
output mechanism to assemble a string from multiple arguments (and
thereby getting rid of snprintf within Genode in the near future).
To enforce the explicit resolution of the char * ambiguity, the 'char *'
overload of the 'print' function is marked as deleted.
Issue #1987
2016-07-13 19:07:09 +02:00
|
|
|
unsigned size() const { return _size; }
|
2015-03-04 21:12:14 +01:00
|
|
|
|
|
|
|
/**
|
|
|
|
* Return true if resource is prefetchable memory
|
|
|
|
*/
|
base: avoid use of deprecated base/printf.h
Besides adapting the components to the use of base/log.h, the patch
cleans up a few base headers, i.e., it removes unused includes from
root/component.h, specifically base/heap.h and
ram_session/ram_session.h. Hence, components that relied on the implicit
inclusion of those headers have to manually include those headers now.
While adjusting the log messages, I repeatedly stumbled over the problem
that printing char * arguments is ambiguous. It is unclear whether to
print the argument as pointer or null-terminated string. To overcome
this problem, the patch introduces a new type 'Cstring' that allows the
caller to express that the argument should be handled as null-terminated
string. As a nice side effect, with this type in place, the optional len
argument of the 'String' class could be removed. Instead of supplying a
pair of (char const *, size_t), the constructor accepts a 'Cstring'.
This, in turn, clears the way let the 'String' constructor use the new
output mechanism to assemble a string from multiple arguments (and
thereby getting rid of snprintf within Genode in the near future).
To enforce the explicit resolution of the char * ambiguity, the 'char *'
overload of the 'print' function is marked as deleted.
Issue #1987
2016-07-13 19:07:09 +02:00
|
|
|
bool prefetchable() const
|
2015-03-04 21:12:14 +01:00
|
|
|
{
|
|
|
|
return type() == MEMORY && (_bar & (1 << 3));
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return resource type
|
|
|
|
*/
|
base: avoid use of deprecated base/printf.h
Besides adapting the components to the use of base/log.h, the patch
cleans up a few base headers, i.e., it removes unused includes from
root/component.h, specifically base/heap.h and
ram_session/ram_session.h. Hence, components that relied on the implicit
inclusion of those headers have to manually include those headers now.
While adjusting the log messages, I repeatedly stumbled over the problem
that printing char * arguments is ambiguous. It is unclear whether to
print the argument as pointer or null-terminated string. To overcome
this problem, the patch introduces a new type 'Cstring' that allows the
caller to express that the argument should be handled as null-terminated
string. As a nice side effect, with this type in place, the optional len
argument of the 'String' class could be removed. Instead of supplying a
pair of (char const *, size_t), the constructor accepts a 'Cstring'.
This, in turn, clears the way let the 'String' constructor use the new
output mechanism to assemble a string from multiple arguments (and
thereby getting rid of snprintf within Genode in the near future).
To enforce the explicit resolution of the char * ambiguity, the 'char *'
overload of the 'print' function is marked as deleted.
Issue #1987
2016-07-13 19:07:09 +02:00
|
|
|
Type type() const
|
2015-03-04 21:12:14 +01:00
|
|
|
{
|
|
|
|
if (_bar == 0)
|
|
|
|
return INVALID;
|
|
|
|
|
|
|
|
return (_bar & 1) ? IO : MEMORY;
|
|
|
|
}
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return raw register content
|
|
|
|
*/
|
|
|
|
unsigned bar() const { return _bar; }
|
2011-12-22 16:19:25 +01:00
|
|
|
};
|
2015-03-04 21:12:14 +01:00
|
|
|
|
|
|
|
enum { NUM_RESOURCES = 6 };
|
|
|
|
|
|
|
|
virtual ~Device() { }
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return bus, device, and function number of the device
|
|
|
|
*/
|
|
|
|
virtual void bus_address(unsigned char *bus, unsigned char *dev,
|
|
|
|
unsigned char *fn) = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return vendor ID obtained from the PCI config space
|
|
|
|
*/
|
|
|
|
virtual unsigned short vendor_id() = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return device ID obtained from the PCI config space
|
|
|
|
*/
|
|
|
|
virtual unsigned short device_id() = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Return device class code from the PCI config space
|
|
|
|
*/
|
|
|
|
virtual unsigned class_code() = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Query PCI-resource information
|
|
|
|
*
|
|
|
|
* \param resource_id index of according PCI resource of the device
|
|
|
|
*
|
|
|
|
* \return resource description
|
|
|
|
* \retval INVALID the supplied resource ID is invalid
|
|
|
|
*/
|
|
|
|
virtual Resource resource(int resource_id) = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Access size for operations directly accessing the config space
|
|
|
|
*/
|
|
|
|
enum Access_size { ACCESS_8BIT, ACCESS_16BIT, ACCESS_32BIT };
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Read configuration space
|
|
|
|
*/
|
|
|
|
virtual unsigned config_read(unsigned char address, Access_size size) = 0;
|
|
|
|
|
|
|
|
/**
|
|
|
|
* Write configuration space
|
Streamline exception types
This patch reduces the number of exception types by facilitating
globally defined exceptions for common usage patterns shared by most
services. In particular, RPC functions that demand a session-resource
upgrade not longer reflect this condition via a session-specific
exception but via the 'Out_of_ram' or 'Out_of_caps' types.
Furthermore, the 'Parent::Service_denied', 'Parent::Unavailable',
'Root::Invalid_args', 'Root::Unavailable', 'Service::Invalid_args',
'Service::Unavailable', and 'Local_service::Factory::Denied' types have
been replaced by the single 'Service_denied' exception type defined in
'session/session.h'.
This consolidation eases the error handling (there are fewer exceptions
to handle), alleviates the need to convert exceptions along the
session-creation call chain, and avoids possible aliasing problems
(catching the wrong type with the same name but living in a different
scope).
2017-05-07 22:03:22 +02:00
|
|
|
*
|
|
|
|
* \throw Out_of_ram
|
|
|
|
* \throw Out_of_caps
|
2015-03-04 21:12:14 +01:00
|
|
|
*/
|
|
|
|
virtual void config_write(unsigned char address, unsigned value,
|
|
|
|
Access_size size) = 0;
|
|
|
|
|
2015-04-17 13:40:32 +02:00
|
|
|
/**
|
|
|
|
* Query Io_port of specified bar
|
|
|
|
*
|
|
|
|
* \param id index of according PCI resource of the device
|
Streamline exception types
This patch reduces the number of exception types by facilitating
globally defined exceptions for common usage patterns shared by most
services. In particular, RPC functions that demand a session-resource
upgrade not longer reflect this condition via a session-specific
exception but via the 'Out_of_ram' or 'Out_of_caps' types.
Furthermore, the 'Parent::Service_denied', 'Parent::Unavailable',
'Root::Invalid_args', 'Root::Unavailable', 'Service::Invalid_args',
'Service::Unavailable', and 'Local_service::Factory::Denied' types have
been replaced by the single 'Service_denied' exception type defined in
'session/session.h'.
This consolidation eases the error handling (there are fewer exceptions
to handle), alleviates the need to convert exceptions along the
session-creation call chain, and avoids possible aliasing problems
(catching the wrong type with the same name but living in a different
scope).
2017-05-07 22:03:22 +02:00
|
|
|
*
|
|
|
|
* \throw Out_of_ram
|
|
|
|
* \throw Out_of_caps
|
2015-04-17 13:40:32 +02:00
|
|
|
*/
|
|
|
|
virtual Genode::Io_port_session_capability io_port(Genode::uint8_t id) = 0;
|
2015-03-04 21:12:14 +01:00
|
|
|
|
|
|
|
/*
|
|
|
|
* The base classes are defined as follows:
|
|
|
|
*
|
|
|
|
* 0x00 | legacy device
|
|
|
|
* 0x01 | mass-storage controller
|
|
|
|
* 0x02 | network controller
|
|
|
|
* 0x03 | display controller
|
|
|
|
* 0x04 | multimedia device
|
|
|
|
* 0x05 | memory controller
|
|
|
|
* 0x06 | bridge device
|
|
|
|
* 0x07 | simple-communication controller
|
|
|
|
* 0x08 | base-system peripheral
|
|
|
|
* 0x09 | input device
|
|
|
|
* 0x0a | docking station
|
|
|
|
* 0x0b | processor
|
|
|
|
* 0x0c | serial bus controller
|
|
|
|
* 0x0d | wireless controller
|
|
|
|
* 0x0e | intelligent I/O controller
|
|
|
|
* 0x0f | satellite-communications controller
|
|
|
|
* 0x10 | encryption/decryption controller
|
|
|
|
* 0x11 | data-acquisition and signal-processing controller
|
|
|
|
* 0x12 | reserved
|
|
|
|
* ... |
|
|
|
|
* 0xff | device does not fit in any of the defined classes
|
|
|
|
*/
|
|
|
|
|
|
|
|
unsigned base_class() { return class_code() >> 16; }
|
|
|
|
unsigned sub_class() { return (class_code() >> 8) & 0xff; }
|
|
|
|
|
2015-04-24 13:33:10 +02:00
|
|
|
/**
|
|
|
|
* Convenience method to translate a PCI physical BAR id to a Genode
|
|
|
|
* virtual one usable with the io_port and io_mem methods. The virtual id
|
|
|
|
* is solely valid for the specific BAR type.
|
|
|
|
*/
|
|
|
|
Genode::uint8_t phys_bar_to_virt(Genode::uint8_t phys_bar)
|
|
|
|
{
|
|
|
|
Genode::uint8_t virt_io_port = 0, virt_io_mem = 0;
|
|
|
|
|
|
|
|
for (unsigned i = 0; i < phys_bar; i++) {
|
|
|
|
Resource::Type type = resource(i).type();
|
|
|
|
if (type == Resource::Type::IO)
|
|
|
|
virt_io_port ++;
|
|
|
|
else if (type == Resource::Type::MEMORY)
|
|
|
|
virt_io_mem ++;
|
|
|
|
}
|
|
|
|
|
|
|
|
Resource::Type type = resource(phys_bar).type();
|
|
|
|
return type == Resource::Type::IO ? virt_io_port : virt_io_mem;
|
|
|
|
}
|
2015-03-04 21:12:14 +01:00
|
|
|
|
|
|
|
/*********************
|
|
|
|
** RPC declaration **
|
|
|
|
*********************/
|
|
|
|
|
|
|
|
GENODE_RPC(Rpc_bus_address, void, bus_address,
|
|
|
|
unsigned char *, unsigned char *, unsigned char *);
|
|
|
|
GENODE_RPC(Rpc_vendor_id, unsigned short, vendor_id);
|
|
|
|
GENODE_RPC(Rpc_device_id, unsigned short, device_id);
|
|
|
|
GENODE_RPC(Rpc_class_code, unsigned, class_code);
|
|
|
|
GENODE_RPC(Rpc_resource, Resource, resource, int);
|
|
|
|
GENODE_RPC(Rpc_config_read, unsigned, config_read,
|
|
|
|
unsigned char, Access_size);
|
2015-11-16 14:04:04 +01:00
|
|
|
GENODE_RPC_THROW(Rpc_config_write, void, config_write,
|
Streamline exception types
This patch reduces the number of exception types by facilitating
globally defined exceptions for common usage patterns shared by most
services. In particular, RPC functions that demand a session-resource
upgrade not longer reflect this condition via a session-specific
exception but via the 'Out_of_ram' or 'Out_of_caps' types.
Furthermore, the 'Parent::Service_denied', 'Parent::Unavailable',
'Root::Invalid_args', 'Root::Unavailable', 'Service::Invalid_args',
'Service::Unavailable', and 'Local_service::Factory::Denied' types have
been replaced by the single 'Service_denied' exception type defined in
'session/session.h'.
This consolidation eases the error handling (there are fewer exceptions
to handle), alleviates the need to convert exceptions along the
session-creation call chain, and avoids possible aliasing problems
(catching the wrong type with the same name but living in a different
scope).
2017-05-07 22:03:22 +02:00
|
|
|
GENODE_TYPE_LIST(Out_of_ram, Out_of_caps),
|
2015-11-16 14:04:04 +01:00
|
|
|
unsigned char, unsigned, Access_size);
|
2015-03-27 14:13:46 +01:00
|
|
|
GENODE_RPC(Rpc_irq, Genode::Irq_session_capability, irq, Genode::uint8_t);
|
2015-04-17 13:40:32 +02:00
|
|
|
GENODE_RPC_THROW(Rpc_io_port, Genode::Io_port_session_capability, io_port,
|
Streamline exception types
This patch reduces the number of exception types by facilitating
globally defined exceptions for common usage patterns shared by most
services. In particular, RPC functions that demand a session-resource
upgrade not longer reflect this condition via a session-specific
exception but via the 'Out_of_ram' or 'Out_of_caps' types.
Furthermore, the 'Parent::Service_denied', 'Parent::Unavailable',
'Root::Invalid_args', 'Root::Unavailable', 'Service::Invalid_args',
'Service::Unavailable', and 'Local_service::Factory::Denied' types have
been replaced by the single 'Service_denied' exception type defined in
'session/session.h'.
This consolidation eases the error handling (there are fewer exceptions
to handle), alleviates the need to convert exceptions along the
session-creation call chain, and avoids possible aliasing problems
(catching the wrong type with the same name but living in a different
scope).
2017-05-07 22:03:22 +02:00
|
|
|
GENODE_TYPE_LIST(Out_of_ram, Out_of_caps),
|
2015-04-17 13:40:32 +02:00
|
|
|
Genode::uint8_t);
|
2015-04-12 13:01:19 +02:00
|
|
|
GENODE_RPC_THROW(Rpc_io_mem, Genode::Io_mem_session_capability, io_mem,
|
Streamline exception types
This patch reduces the number of exception types by facilitating
globally defined exceptions for common usage patterns shared by most
services. In particular, RPC functions that demand a session-resource
upgrade not longer reflect this condition via a session-specific
exception but via the 'Out_of_ram' or 'Out_of_caps' types.
Furthermore, the 'Parent::Service_denied', 'Parent::Unavailable',
'Root::Invalid_args', 'Root::Unavailable', 'Service::Invalid_args',
'Service::Unavailable', and 'Local_service::Factory::Denied' types have
been replaced by the single 'Service_denied' exception type defined in
'session/session.h'.
This consolidation eases the error handling (there are fewer exceptions
to handle), alleviates the need to convert exceptions along the
session-creation call chain, and avoids possible aliasing problems
(catching the wrong type with the same name but living in a different
scope).
2017-05-07 22:03:22 +02:00
|
|
|
GENODE_TYPE_LIST(Out_of_ram, Out_of_caps),
|
2015-09-09 11:06:36 +02:00
|
|
|
Genode::uint8_t, Genode::Cache_attribute,
|
|
|
|
Genode::addr_t, Genode::size_t);
|
2015-04-17 13:40:32 +02:00
|
|
|
|
2016-05-11 17:23:51 +02:00
|
|
|
GENODE_RPC_INTERFACE(Rpc_bus_address, Rpc_vendor_id, Rpc_device_id,
|
|
|
|
Rpc_class_code, Rpc_resource, Rpc_config_read,
|
|
|
|
Rpc_config_write, Rpc_irq, Rpc_io_port, Rpc_io_mem);
|
2015-03-04 21:12:14 +01:00
|
|
|
};
|