aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--api/vfio_api.c4
-rw-r--r--drivers/rtl8169.c60
-rw-r--r--include/vfio_api.h2
3 files changed, 42 insertions, 24 deletions
diff --git a/api/vfio_api.c b/api/vfio_api.c
index 600026a..7628ca1 100644
--- a/api/vfio_api.c
+++ b/api/vfio_api.c
@@ -109,7 +109,7 @@ int dma_map_type1(int fd, unsigned long sz, void **vaddr, uint64_t iova)
return ret;
}
-int dma_unmap_type1(int fd, unsigned long sz, void *vaddr)
+int dma_unmap_type1(int fd, unsigned long sz, void *vaddr, uint64_t iova)
{
int ret;
struct vfio_iommu_type1_dma_unmap dma_unmap;
@@ -117,7 +117,7 @@ int dma_unmap_type1(int fd, unsigned long sz, void *vaddr)
memset(&dma_unmap, 0, sizeof(dma_unmap));
dma_unmap.argsz = sizeof(dma_unmap);
dma_unmap.size = sz;
- dma_unmap.iova = 0;
+ dma_unmap.iova = iova;
ret = ioctl(fd, VFIO_IOMMU_UNMAP_DMA, &dma_unmap);
if (ret)
printf("Failed to unmap DMA memory (%s)\n", strerror(errno));
diff --git a/drivers/rtl8169.c b/drivers/rtl8169.c
index 4ab2124..6ec1205 100644
--- a/drivers/rtl8169.c
+++ b/drivers/rtl8169.c
@@ -47,10 +47,21 @@ static inline void rtl8169_map_to_asic(struct rxdesc *desc, dma_addr_t mapping,
}
/* drivers/net/ethernet/realtek/r8169.c */
-int rtl_8169_remap(int container, void *map, struct rxdesc *rx_ring)
+int rtl_8169_remap2(int container, void *map, dma_addr_t *addr)
{
+ *addr = (io_read32(map + 0xE8));
+ *addr <<= 32;
+ *addr |= io_read32(map + 0xE4);
- /* unock config registers */
+ return 0;
+}
+
+/* drivers/net/ethernet/realtek/r8169.c */
+#if 0
+int rtl_8169_remap(int container, void *map, dma_addr_t *addr)
+{
+
+ /* unock config registers to change rx/tx desc addresses */
io_write8(0xc0, map + 0x50);
/* RxConfig = RXFTH: unlimited, MXDMA: unlimited, AAP: set (promisc. mode set) */
io_write32(0x0000e70f, map + 0x44);
@@ -67,7 +78,7 @@ int rtl_8169_remap(int container, void *map, struct rxdesc *rx_ring)
//io_write32(TxDescStartAddrHigh, ((u64) tp->TxPhyAddr) >> 32);
//io_write32(TxDescStartAddrLow, ((u64) tp->TxPhyAddr) & DMA_BIT_MASK(32));
- /* XXX need physaddress here not virtual */
+ /* XXX need dma_addr_t here not virtual */
io_write32(((uint64_t) rx_ring) >> 32, map + 0xe8);
io_write32(((uint64_t) rx_ring) & 0x00000000ffffffff, map + 0xe4);
@@ -78,6 +89,7 @@ int rtl_8169_remap(int container, void *map, struct rxdesc *rx_ring)
return 0;
}
+#endif
void rtl_8169_dump(int container, void *map)
{
@@ -87,23 +99,23 @@ void rtl_8169_dump(int container, void *map)
//printf("0x%08x\n", io_read32(map + 0x40));
//printf("0x%04x\n", io_read16(map + 0xDA));
//printf("0x%02x\n", io_read8(map + 0xEC));
- printf("RX LOW 0x%02x\n", io_read32(map + 0xE4));
- printf("RX HIGH 0x%02x\n", io_read32(map + 0xE8));
+ printf("RX LOW 0x%08x\n", io_read32(map + 0xE4));
+ printf("RX HIGH 0x%08x\n", io_read32(map + 0xE8));
}
-void *rtl8169_rx_fill(int container, struct rxdesc *rx_desc_ring, uint64_t iova_start)
+void *rtl8169_rx_fill(int container, struct rxdesc *rxd_ring, uint64_t iova)
{
int i;
void *vaddr = NULL;
int ret = 0;
- ret += dma_map_type1(container, NUM_RX_DESC * 2 * 1024 * 1024, &vaddr,
- iova_start);
+ ret += dma_map_type1(container, NUM_RX_DESC * 2048, &vaddr,
+ iova);
if (ret)
printf("Failed to map memory\n");
for (i = 0; i < NUM_RX_DESC; i++) {
- rtl8169_map_to_asic(&rx_desc_ring[i], (dma_addr_t)vaddr + i * 2048, 2048);
+ rtl8169_map_to_asic(&rxd_ring[i], (dma_addr_t)iova + i * 2048, 2048);
}
return vaddr;
@@ -123,7 +135,8 @@ int main(int argc, char* argv[])
struct vfio_iommu_type1_info iommu_info = { .argsz = sizeof(iommu_info) };
struct vfio_region_info region_info = { .argsz = sizeof(region_info) };
void *map;
- struct rxdesc *rx_desc_ring;
+ struct rxdesc *rxd_ring;
+ dma_addr_t rx_addr;
void *rxdata;
int cnt = 0;
@@ -163,10 +176,9 @@ int main(int argc, char* argv[])
printf("Device supports %d regions, %d irqs\n",
device_info.num_regions, device_info.num_irqs);
- /* Alloc RX descriptors */
- ret = dma_map_type1(container, R8169_RX_RING_BYTES, (void *)&rx_desc_ring, 0);
- printf("Rx desc ring %p\n", rx_desc_ring);
- /* TODO Alloc TX descriptors */
+ /* TODO Alloc TX descriptors and change addr? */
+ //ret = dma_map_type1(container, R8169_RX_RING_BYTES, (void *)&rxd_ring,
+ //0x0);
for (i = 0; i < device_info.num_regions; i++) {
region_info.index = i;
if (ioctl(device, VFIO_DEVICE_GET_REGION_INFO, &region_info))
@@ -188,20 +200,25 @@ int main(int argc, char* argv[])
printf("mmap failed\n");
continue;
}
- rtl_8169_remap(container, map, rx_desc_ring);
+ rtl_8169_remap2(container, map, &rx_addr);
rtl_8169_dump(container, map);
munmap(map, (size_t)region_info.size);
}
}
- rxdata = rtl8169_rx_fill(container, rx_desc_ring, R8169_RX_RING_BYTES);
+ /* fill rx_ring addresses */
+ printf("RX DESC: %lx\n", rx_addr);
+ ret = dma_map_type1(container, R8169_RX_RING_BYTES, (void *)&rxd_ring,
+ rx_addr);
+
+ rxdata = rtl8169_rx_fill(container, rxd_ring, rx_addr + R8169_RX_RING_BYTES);
- while (cnt < 3) {
+ while(1) {
for (i = 0; i < 16; i++) {
- int value = rx_desc_ring[i].opts1;
+ int value = rxd_ring[i].opts1;
printf("packet[%03d]: size=%x %x %llx: ", i,
- (value & 0x3FFF) - 4, rx_desc_ring[i].opts2,
- rx_desc_ring[i].addr);
+ (value & 0x3FFF) - 4, rxd_ring[i].opts2,
+ rxd_ring[i].addr);
print_packet(rxdata + i * 2048);
printf("\n");
}
@@ -209,7 +226,8 @@ int main(int argc, char* argv[])
sleep(1);
cnt++;
}
- dma_unmap_type1(container, R8169_RX_RING_BYTES, rx_desc_ring);
+ //ret += dma_map_type1(container, NUM_RX_DESC * 2 * 1024 * 1024, &vaddr, iova);
+ dma_unmap_type1(container, R8169_RX_RING_BYTES, rxd_ring, rx_addr);
return 0;
out:
diff --git a/include/vfio_api.h b/include/vfio_api.h
index cd95f85..8a66b44 100644
--- a/include/vfio_api.h
+++ b/include/vfio_api.h
@@ -1,7 +1,7 @@
#ifndef VFIO_API_H
#define VFIO_API_H
int dma_map_type1(int fd, unsigned long sz, void **vaddr, uint64_t iova);
-int dma_unmap_type1(int fd, unsigned long sz, void *vaddr);
+int dma_unmap_type1(int fd, unsigned long sz, void *vaddr, uint64_t iova);
int get_group(int grp_id);
int get_container(void);
#endif