From 0cf8d753467657734484e8708c1130d8a23cf9f0 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Thu, 9 Apr 2015 16:50:36 +0200 Subject: [PATCH] dde_kit: upgrade ram support for device iteration Issue #755 --- repos/os/src/lib/dde_kit/pci_tree.cc | 14 +++++++++++--- repos/os/src/lib/dde_kit/pci_tree.h | 28 ++++++++++++++++++++++++++-- 2 files changed, 37 insertions(+), 5 deletions(-) diff --git a/repos/os/src/lib/dde_kit/pci_tree.cc b/repos/os/src/lib/dde_kit/pci_tree.cc index 2227470a1..4ea30cd3e 100644 --- a/repos/os/src/lib/dde_kit/pci_tree.cc +++ b/repos/os/src/lib/dde_kit/pci_tree.cc @@ -58,7 +58,6 @@ Pci_tree::Pci_tree(unsigned device_class, unsigned class_mask) 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); @@ -66,10 +65,19 @@ Pci_tree::Pci_tree(unsigned device_class, unsigned class_mask) _devices.insert(device); prev_device_cap = device_cap; - device_cap = _pci_drv.next_device(prev_device_cap, device_class, - class_mask); + + 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(); + } diff --git a/repos/os/src/lib/dde_kit/pci_tree.h b/repos/os/src/lib/dde_kit/pci_tree.h index 8498f4829..52ae6c154 100644 --- a/repos/os/src/lib/dde_kit/pci_tree.h +++ b/repos/os/src/lib/dde_kit/pci_tree.h @@ -125,8 +125,32 @@ namespace Dde_kit { size_t size) { /* trigger that the device gets assigned to this driver */ - pci_drv.config_extended(_device); - return pci_drv.alloc_dma_buffer(size); + for (unsigned i = 0; i < 2; i++) { + try { + pci_drv.config_extended(_device); + break; + } catch (Pci::Device::Quota_exceeded) { + if (i == 1) + return Ram_dataspace_capability(); + Genode::env()->parent()->upgrade(pci_drv.cap(), "ram_quota=4096"); + } + } + + for (unsigned i = 0; i < 2; i++) { + try { + return pci_drv.alloc_dma_buffer(size); + } catch (Pci::Device::Quota_exceeded) { + if (i == 0) { + char buf[32]; + Genode::snprintf(buf, sizeof(buf), "ram_quota=%zd", + size); + Genode::env()->parent()->upgrade(pci_drv.cap(), + buf); + } + } + } + + return Ram_dataspace_capability(); } };