helenos-nicf team mailing list archive
-
helenos-nicf team
-
Mailing list archive
-
Message #00174
Refaktorovane zakladni DMA rozhrani
Ahoj,
dovolil jsem si upravit rozhrani DMA alokatoru. Bylo vsak nutne upravit i kod ostatnich clenu. Proto posilam diff, abyste ho mohli schvalit a zkontrolovat, jestli nejak neposkodil funkcnost (i kdyz o tom pochybuji).
Honza
=== modified file 'kernel/generic/src/dma/dma_memory.c'
--- kernel/generic/src/dma/dma_memory.c 2011-08-25 11:24:25 +0000
+++ kernel/generic/src/dma/dma_memory.c 2011-08-25 12:10:01 +0000
@@ -225,11 +225,17 @@
return EINVAL;
}
+ /*
+ * Try to find mapping again
+ */
page_table_lock(AS, false);
p = page_mapping_find(AS, vaddr);
page_table_unlock(AS, false);
current = PTE_GET_FRAME(p);
+ /*
+ * If it is unsuccessful, fail
+ */
if ((void*) current == NULL || !PTE_VALID(p) || !PTE_PRESENT(p)) {
mutex_unlock(&area->lock);
mutex_unlock(&AS->lock);
=== modified file 'uspace/app/dma_test/dma_test.c'
--- uspace/app/dma_test/dma_test.c 2011-08-25 08:08:18 +0000
+++ uspace/app/dma_test/dma_test.c 2011-08-25 18:36:08 +0000
@@ -68,14 +68,13 @@
dma_cli_register("dma_test/server");
dma_cli_cleanup();
getchar();
- int handle;
unsigned i = 0;
unsigned int * virt, *v;
dma_mem_t dmt;
void * phys;
virt = as_get_mappable_page(10 * PAGE_SIZE);
v = virt;
- printf("%d\n", dma_allocate(&phys, virt, &handle, 10, AS_AREA_READ
+ printf("%d\n", dma_allocate(&phys, virt, 10, AS_AREA_READ
| AS_AREA_WRITE, 0));
printf("virt: %p, phys %p\n", virt, phys);
@@ -94,7 +93,7 @@
printf("unmapped\n");
- dma_unmap(v, 0);
+ dma_unmap(v);
getchar();
printf("Before clear\n");
@@ -116,7 +115,7 @@
getchar();
printf("test\n");
- dma_unmap(dmt.virtual, 0);
+ dma_unmap(dmt.virtual);
printf("Server stage\n");
async_set_client_connection(dma_connection);
=== modified file 'uspace/doc/helnet.txt'
--- uspace/doc/helnet.txt 2011-08-06 21:58:25 +0000
+++ uspace/doc/helnet.txt 2011-08-25 18:26:07 +0000
@@ -136,6 +136,26 @@
DMA interface
~~~~~~~~~~~~~
+Introduction
+^^^^^^^^^^^^
+DMA interface is newly introduced set of syscalls procedures closely bound to them, DMA server with communication framework and DMA driver interface. Syscalls are closely bound to kernel changes partially described here and partially in kernel documentation.
+
+New syscalls and related procedures
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+For allocking continguos memory areas usable for basic DMA transfer we introduced basic syscall
+* $dma_allocate('out' pphys_addr, 'in' virt_addr,
+
+DMA memory server
+^^^^^^^^^^^^^^^^^
+[red]#TODO#
+DMA device framework
+^^^^^^^^^^^^^^^^^^^^
+[red]#TODO#
+Howto write basic driver using DMA/busmastering
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
+[red]#TODO#
+Howto write driver using scater/gather memory access
+^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
[red]#TODO#
Implemented NIC drivers
=== modified file 'uspace/drv/e1000/e1000.c'
--- uspace/drv/e1000/e1000.c 2011-08-25 08:18:01 +0000
+++ uspace/drv/e1000/e1000.c 2011-08-25 18:42:06 +0000
@@ -1417,12 +1417,12 @@
//Get virt and phys addresses for ring structure
//printf("%d\n", dma_allocator_init());
- int handle;
+
unsigned int * virt;
void * phys;
virt = as_get_mappable_page(PAGE_SIZE);
//FIXME return value
- dma_allocate(&phys, virt, &handle, 1, AS_AREA_READ|AS_AREA_WRITE, 0);
+ dma_allocate(&phys, virt, 1, AS_AREA_READ|AS_AREA_WRITE, 0);
//FIXME 64bit address
E1000_REG_WRITE(e1000_data, E1000_RDBAH(0),
@@ -1579,12 +1579,12 @@
fibril_mutex_lock(&e1000_data->tx_lock);
printf("%d\n", dma_allocator_init());
- int handle;
+
unsigned int * virt;
void * phys;
virt = as_get_mappable_page(PAGE_SIZE);
//FIXME return value
- dma_allocate(&phys, virt, &handle, 1, AS_AREA_READ|AS_AREA_WRITE, 0);
+ dma_allocate(&phys, virt, 1, AS_AREA_READ|AS_AREA_WRITE, 0);
bzero(virt, E1000_TX_PACKETS_COUNT * sizeof(e1000_tx_descriptor_t));
E1000_REG_WRITE(e1000_data, E1000_TDBAH(0),
=== modified file 'uspace/lib/c/generic/dma.c'
--- uspace/lib/c/generic/dma.c 2011-08-25 08:08:18 +0000
+++ uspace/lib/c/generic/dma.c 2011-08-25 18:28:06 +0000
@@ -52,7 +52,7 @@
*/
static int _dma_allocate_wrap(dma_alloc_params_t * args)
{
- return (int)__SYSCALL1((sysarg_t) SYS_DMA_ALLOC_MEM, (sysarg_t) args);
+ return (int) __SYSCALL1((sysarg_t) SYS_DMA_ALLOC_MEM, (sysarg_t) args);
}
/**
* Highlevel interface of DMA allocator
@@ -67,19 +67,18 @@
*
* @return on success EOK, otherwise proper errno value
*/
-int dma_allocate(void ** pphys_addr, void * virt_addr, int * handle,
- unsigned long pages, int flags1, int flags2)
+int dma_allocate(void ** pphys_addr, void * virt_addr, unsigned long pages,
+ int flags1, int flags2)
{
- dma_alloc_params_t params = {
- .vaddr = (sysarg_t)virt_addr,
- .size_in = (sysarg_t)pages,
- .mapping_flags = (sysarg_t)flags1,
- .allocator_flags = (sysarg_t)flags2
- };
-
+ dma_alloc_params_t params =
+ {
+ .vaddr = (sysarg_t)virt_addr,
+ .size_in = (sysarg_t)pages,
+ .mapping_flags = (sysarg_t)flags1,
+ .allocator_flags = (sysarg_t)flags2 };
int rc = _dma_allocate_wrap(¶ms);
- (*pphys_addr) = (void*)params.paddr;
+ (*pphys_addr) = (void*) params.paddr;
return rc;
}
/**
@@ -186,11 +185,10 @@
/**
* Unmaps and destroys DMA memory area.
* @param virt_addr pointer to begin of the memory area.
- * @param handle handle to memory area (unused yet).
*
* @return EOK on success or a value from @ref errno.h on failure.
*/
-int dma_unmap(void * virt_addr, int handle)
+int dma_unmap(void * virt_addr)
{
return as_area_destroy(virt_addr);
}
@@ -209,7 +207,7 @@
{
mem_desc->virtual = as_get_mappable_page(mem_desc->size * PAGE_SIZE);
return dma_allocate(&(mem_desc->physical), mem_desc->virtual,
- &mem_desc->handle, mem_desc->size, mem_desc->mapping_flags, dma_flags);
+ mem_desc->size, mem_desc->mapping_flags, dma_flags);
}
@@ -222,7 +220,7 @@
int dma_free(dma_mem_t * mem)
{
- return dma_unmap(mem->virtual, mem->handle);
+ return dma_unmap(mem->virtual);
}
/**
@@ -230,7 +228,7 @@
*/
static int _dma_lock_wrap(dma_lock_params_t * args)
{
- return (int)__SYSCALL1((sysarg_t) SYS_DMA_LOCK_MEM, (sysarg_t) args);
+ return (int) __SYSCALL1((sysarg_t) SYS_DMA_LOCK_MEM, (sysarg_t) args);
}
/**
@@ -248,25 +246,21 @@
int dma_lock(void * vaddr, void ** faddr, size_t size_in, size_t * size_out)
{
- dma_lock_params_t params = {
- .vaddr = (sysarg_t)vaddr,
- .size_in = (sysarg_t)size_in,
- };
-
+ dma_lock_params_t params =
+ { .vaddr = (sysarg_t)vaddr, .size_in = (sysarg_t)size_in, };
int rc = _dma_lock_wrap(¶ms);
- (*faddr) = (void*)params.paddr;
- (*size_out) = (size_t)params.size_out;
+ (*faddr) = (void*) params.paddr;
+ (*size_out) = (size_t) params.size_out;
return rc;
}
-
/**
* Syscall wrapper for unlocking memory
*/
static int _dma_unlock_wrap(dma_unlock_params_t * args)
{
- return (int)__SYSCALL1((sysarg_t) SYS_DMA_UNLOCK_MEM, (sysarg_t) args);
+ return (int) __SYSCALL1((sysarg_t) SYS_DMA_UNLOCK_MEM, (sysarg_t) args);
}
/**
@@ -282,14 +276,12 @@
int dma_unlock(void * vaddr, size_t size_in, size_t * size_out)
{
- dma_unlock_params_t params = {
- .vaddr = (sysarg_t)vaddr,
- .size_in = (sysarg_t)size_in,
- };
+ dma_unlock_params_t params =
+ { .vaddr = (sysarg_t)vaddr, .size_in = (sysarg_t)size_in, };
int rc = _dma_unlock_wrap(¶ms);
- (*size_out) = (size_t)params.size_out;
+ (*size_out) = (size_t) params.size_out;
return rc;
}
=== modified file 'uspace/lib/c/include/dma.h'
--- uspace/lib/c/include/dma.h 2011-08-25 08:08:18 +0000
+++ uspace/lib/c/include/dma.h 2011-08-25 18:27:28 +0000
@@ -71,10 +71,6 @@
*/
unsigned long size;
/**
- * Handle to memory
- */
- int handle;
- /**
* Flags describing type of mapping
*/
int mapping_flags;
@@ -174,10 +170,10 @@
#define DMA_SRV_CLEAR_OWNERSHIP 104
-extern int dma_allocate(void **, void*, int *, unsigned long, int, int);
+extern int dma_allocate(void **, void*, unsigned long, int, int);
extern int dma_allocate_anonymous(dma_mem_t *, int);
extern int dma_allocator_init(void);
-extern int dma_unmap(void *, int);
+extern int dma_unmap(void *);
extern int dma_free(dma_mem_t *);
extern int dma_lock(void * vaddr, void ** faddr, size_t size_in,
size_t * size_out);
=== modified file 'uspace/srv/net/net/packet_server.c'
--- uspace/srv/net/net/packet_server.c 2011-07-18 13:18:12 +0000
+++ uspace/srv/net/net/packet_server.c 2011-08-25 18:39:18 +0000
@@ -139,7 +139,7 @@
static void packet_dealloc(packet_t *packet)
{
pm_remove(packet);
- dma_unmap(packet, 0);
+ dma_unmap(packet);
}
/** Creates a new packet of dimensions at least as given.
@@ -171,8 +171,8 @@
return NULL;
}
void *phys_addr;
- int dummy_handle;
- rc = dma_allocate(&phys_addr, packet, &dummy_handle, length/PAGE_SIZE,
+
+ rc = dma_allocate(&phys_addr, packet, length/PAGE_SIZE,
AS_AREA_READ | AS_AREA_WRITE, 0);
if (rc != EOK) {
nlog_warning_p(PACKET_SERVER_PROFILE,