84 lines
1.9 KiB
C++
84 lines
1.9 KiB
C++
/*
|
|
* \brief Virtual PCI bus tree for DDE kit
|
|
* \author Christian Helmuth
|
|
* \date 2008-10-22
|
|
*/
|
|
|
|
/*
|
|
* Copyright (C) 2008-2013 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.
|
|
*/
|
|
|
|
#include "pci_tree.h"
|
|
|
|
using namespace Dde_kit;
|
|
|
|
static const bool verbose = false;
|
|
static const bool verbose_access = false;
|
|
|
|
/****************
|
|
** PCI device **
|
|
****************/
|
|
|
|
uint32_t Pci_device::config_read(unsigned char address, Pci::Device::Access_size size)
|
|
{
|
|
uint32_t result = _device.config_read(address, size);
|
|
|
|
if (verbose_access)
|
|
PDBG("PCI read cfg (%d) %x of %02x:%02x.%x -- %x",
|
|
size, address, bus(), dev(), fun(), result);
|
|
|
|
return result;
|
|
}
|
|
|
|
|
|
void Pci_device::config_write(unsigned char address, uint32_t val,
|
|
Pci::Device::Access_size size)
|
|
{
|
|
_device.config_write(address, val, size);
|
|
|
|
if (verbose_access)
|
|
PDBG("PCI write cfg (%d) %x (%x) of %02x:%02x.%x",
|
|
size, address, val, bus(), dev(), fun());
|
|
}
|
|
|
|
|
|
/*************
|
|
** PCI bus **
|
|
*************/
|
|
|
|
Pci_tree::Pci_tree(unsigned device_class, unsigned class_mask)
|
|
{
|
|
/*
|
|
* Iterate through all accessible devices and populate virtual
|
|
* PCI bus tree.
|
|
*/
|
|
Pci::Device_capability prev_device_cap;
|
|
Pci::Device_capability device_cap = _pci_drv.first_device(device_class,
|
|
class_mask);
|
|
while (device_cap.valid()) {
|
|
|
|
Pci_device *device = new (env()->heap()) Pci_device(device_cap);
|
|
|
|
_devices.insert(device);
|
|
|
|
prev_device_cap = device_cap;
|
|
|
|
for (unsigned i = 0; i < 2; i++) {
|
|
try {
|
|
device_cap = _pci_drv.next_device(prev_device_cap, device_class,
|
|
class_mask);
|
|
break;
|
|
} catch (Pci::Device::Quota_exceeded) {
|
|
Genode::env()->parent()->upgrade(_pci_drv.cap(), "ram_quota=4096");
|
|
}
|
|
}
|
|
}
|
|
|
|
if (verbose)
|
|
_show_devices();
|
|
|
|
}
|