From 6fa85dfd45a5507b3c2586537e66f01cd6baedc4 Mon Sep 17 00:00:00 2001 From: Alexander Boettcher Date: Fri, 24 Apr 2015 16:09:42 +0200 Subject: [PATCH] ahci: upgrade memory --- repos/os/src/drivers/ahci/x86/ahci_device.h | 32 +++++++++++++++++---- 1 file changed, 26 insertions(+), 6 deletions(-) diff --git a/repos/os/src/drivers/ahci/x86/ahci_device.h b/repos/os/src/drivers/ahci/x86/ahci_device.h index ae74cc926..c47fd4a07 100644 --- a/repos/os/src/drivers/ahci/x86/ahci_device.h +++ b/repos/os/src/drivers/ahci/x86/ahci_device.h @@ -47,9 +47,17 @@ class Ahci_device : public Ahci_device_base static Pci::Device_capability _scan_pci(Pci::Connection &pci, Pci::Device_capability prev_device_cap) { Pci::Device_capability device_cap; - device_cap = pci.next_device(prev_device_cap, - CLASS_MASS_STORAGE | SUBCLASS_AHCI, - CLASS_MASK); + + for (unsigned i = 0; i < 2; i++) { + try { + device_cap = pci.next_device(prev_device_cap, + CLASS_MASS_STORAGE | SUBCLASS_AHCI, + CLASS_MASK); + break; + } catch (Pci::Device::Quota_exceeded) { + Genode::env()->parent()->upgrade(pci.cap(), "ram_quota=4096"); + } + } if (prev_device_cap.valid()) pci.release_device(prev_device_cap); @@ -189,7 +197,12 @@ class Ahci_device : public Ahci_device_base device->_pci_device = pci_device; /* trigger assignment of pci device to the ahci driver */ - pci.config_extended(device_cap); + try { + pci.config_extended(device_cap); + } catch (Pci::Device::Quota_exceeded) { + Genode::env()->parent()->upgrade(pci.cap(), "ram_quota=4096"); + pci.config_extended(device_cap); + } /* get device ready */ device->_init(pci_device); @@ -204,8 +217,15 @@ class Ahci_device : public Ahci_device_base return 0; } - Ram_dataspace_capability alloc_dma_buffer(size_t size) { - return _pci.alloc_dma_buffer(size); } + Ram_dataspace_capability alloc_dma_buffer(size_t size) + { + /* transfer quota to pci driver, otherwise we get a exception */ + char quota[32]; + Genode::snprintf(quota, sizeof(quota), "ram_quota=%zd", size); + Genode::env()->parent()->upgrade(_pci.cap(), quota); + + return _pci.alloc_dma_buffer(size); + } void free_dma_buffer(Ram_dataspace_capability cap) { return _pci.free_dma_buffer(cap); }