From 404325b19380fbac70336b84aef264d5cfb9a6db Mon Sep 17 00:00:00 2001 From: Philip Homburg Date: Mon, 25 Feb 2008 10:19:29 +0000 Subject: [PATCH] Support for I/O MMU. --- drivers/rtl8139/rtl8139.c | 57 ++++++++++++++++++++++++++++++++++++--- 1 file changed, 53 insertions(+), 4 deletions(-) diff --git a/drivers/rtl8139/rtl8139.c b/drivers/rtl8139/rtl8139.c index d3f082c1b..47512a411 100755 --- a/drivers/rtl8139/rtl8139.c +++ b/drivers/rtl8139/rtl8139.c @@ -290,6 +290,8 @@ _PROTOTYPE( static void dump_phy, (re_t *rep) ); #endif _PROTOTYPE( static int rl_handler, (re_t *rep) ); _PROTOTYPE( static void rl_watchdog_f, (timer_t *tp) ); +_PROTOTYPE( static void tell_dev, (vir_bytes start, size_t size, + int pci_bus, int pci_dev, int pci_func) ); /* The message used in the main loop is made global, so that rl_watchdog_f() * can change its message type to fake a HARD_INT message. @@ -757,7 +759,6 @@ re_t *rep; size_t rx_bufsize, tx_bufsize, tot_bufsize; phys_bytes buf; char *mallocbuf; - static struct memory chunk; int fd, s, i, off; /* Allocate receive and transmit buffers */ @@ -767,8 +768,8 @@ re_t *rep; rx_bufsize= RX_BUFSIZE; tot_bufsize= N_TX_BUF*tx_bufsize + rx_bufsize; - /* Now try to allocate a kernel memory buffer. */ - chunk.size = tot_bufsize; + if (tot_bufsize % 4096) + tot_bufsize += 4096-(tot_bufsize % 4096); #define BUF_ALIGNMENT (64*1024) @@ -788,6 +789,9 @@ re_t *rep; buf += BUF_ALIGNMENT - off; } + tell_dev((vir_bytes)mallocbuf, tot_bufsize, rep->re_pcibus, + rep->re_pcidev, rep->re_pcifunc); + for (i= 0; ire_tx[i].ret_buf= buf; @@ -1457,7 +1461,7 @@ int from_int; (vir_bytes) rep->v_re_rx_buf+o, s, D); if (cps != OK) panic(__FILE__, - "rl_readv_s: sys_vircopy failed", + "rl_readv_s: sys_safecopyto failed", cps); } @@ -3065,6 +3069,51 @@ dpeth_t *dep; } #endif +PRIVATE void tell_dev(buf, size, pci_bus, pci_dev, pci_func) +vir_bytes buf; +size_t size; +int pci_bus; +int pci_dev; +int pci_func; +{ + int r; + endpoint_t dev_e; + u32_t u32; + message m; + + r= ds_retrieve_u32("amddev", &u32); + if (r != OK) + { + printf( + "rtl8139`tell_dev: ds_retrieve_u32 failed for 'amddev': %d\n", + r); + return; + } + + dev_e= u32; + + m.m_type= IOMMU_MAP; + m.m2_i1= pci_bus; + m.m2_i2= pci_dev; + m.m2_i3= pci_func; + m.m2_l1= buf; + m.m2_l2= size; + + r= sendrec(dev_e, &m); + if (r != OK) + { + printf("rtl8139`tell_dev: sendrec to %d failed: %d\n", + dev_e, r); + return; + } + if (m.m_type != OK) + { + printf("rtl8139`tell_dev: dma map request failed: %d\n", + m.m_type); + return; + } +} + /* * $PchId: rtl8139.c,v 1.3 2003/09/11 14:15:15 philip Exp $ */ -- 2.44.0