diff --git a/os/include/pci_session/client.h b/os/include/pci_session/client.h index 4c76c0232b..667fccdfe6 100644 --- a/os/include/pci_session/client.h +++ b/os/include/pci_session/client.h @@ -25,12 +25,12 @@ namespace Pci { : Genode::Rpc_client(session) { } Device_capability first_device(unsigned device_class = 0, - unsigned class_mask = 0) { + unsigned class_mask = 0) { return call(device_class, class_mask); } Device_capability next_device(Device_capability prev_device, unsigned device_class = 0, - unsigned class_mask = 0) { + unsigned class_mask = 0) { return call(prev_device, device_class, class_mask); } void release_device(Device_capability device) { @@ -42,6 +42,10 @@ namespace Pci { Genode::Ram_dataspace_capability alloc_dma_buffer(Device_capability device_cap, Genode::size_t size) { return call(device_cap, size); } + + void free_dma_buffer(Device_capability device_cap, + Genode::Ram_dataspace_capability cap) { + call(device_cap, cap); } }; } diff --git a/os/include/pci_session/pci_session.h b/os/include/pci_session/pci_session.h index c85646878a..7d51910923 100644 --- a/os/include/pci_session/pci_session.h +++ b/os/include/pci_session/pci_session.h @@ -62,6 +62,13 @@ namespace Pci { */ virtual Genode::Ram_dataspace_capability alloc_dma_buffer(Device_capability, Genode::size_t) = 0; + + /** + * Free previously allocated DMA memory + */ + virtual void free_dma_buffer(Device_capability, + Genode::Ram_dataspace_capability) = 0; + /********************* ** RPC declaration ** *********************/ @@ -77,10 +84,12 @@ namespace Pci { alloc_dma_buffer, GENODE_TYPE_LIST(Genode::Ram_session::Quota_exceeded), Device_capability, Genode::size_t); + GENODE_RPC(Rpc_free_dma_buffer, void, free_dma_buffer, + Device_capability, Genode::Ram_dataspace_capability); GENODE_RPC_INTERFACE(Rpc_first_device, Rpc_next_device, Rpc_release_device, Rpc_config_extended, - Rpc_alloc_dma_buffer); + Rpc_alloc_dma_buffer, Rpc_free_dma_buffer); }; } diff --git a/os/src/drivers/pci/pci_session_component.h b/os/src/drivers/pci/pci_session_component.h index d770c8a772..4c442e65fd 100644 --- a/os/src/drivers/pci/pci_session_component.h +++ b/os/src/drivers/pci/pci_session_component.h @@ -149,7 +149,7 @@ namespace Pci { Config_space *e = config_space_list().first(); for (; e && (config_space == ~0UL); e = e->next()) config_space = e->lookup_config_space(bdf); - + return config_space; } @@ -321,6 +321,13 @@ namespace Pci { return ram; } + + void free_dma_buffer(Device_capability device_cap, + Genode::Ram_dataspace_capability cap) + { + if (cap.valid()) + Genode::env()->ram_session()->free(cap); + } };