diff options
author | Ilias Apalodimas <ilias.apalodimas@linaro.org> | 2017-10-09 11:15:42 +0300 |
---|---|---|
committer | Ilias Apalodimas <ilias.apalodimas@linaro.org> | 2017-10-09 11:15:42 +0300 |
commit | 0688e551639242794eec2fae5ac2f38ff6ffaf0f (patch) | |
tree | 402033f6745605857dc63c9fd61bddf4041f7009 | |
parent | ce8a26c5ce819a697a0e625642282a68e573668c (diff) |
-rw-r--r-- | api/vfio_api.c | 4 | ||||
-rw-r--r-- | drivers/rtl8169.c | 60 | ||||
-rw-r--r-- | include/vfio_api.h | 2 |
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, ®ion_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 |