1/* 2 * Copyright (c) 2007-2013 ETH Zurich. 3 * All rights reserved. 4 * 5 * This file is distributed under the terms in the attached LICENSE file. 6 * If you do not find this file, copies can be found by writing to: 7 * ETH Zurich D-INFK, Haldeneggsteig 4, CH-8092 Zurich. Attn: Systems Group. 8 */ 9 10 11#ifndef USB_MEMORY_H_ 12#define USB_MEMORY_H_ 13 14#include <barrelfish/barrelfish.h> 15#include <usb/usb.h> 16 17/* prototypes */ 18struct usb_xfer; 19 20#define USB_PAGE_SIZE 0x1000 // 4k 21 22 23/* 24 * ------------------------------------------------------------------------ 25 * USB Memory Block 26 * ------------------------------------------------------------------------ 27 * This data structures is used to associate a virtual address with the 28 * respecting physical address 29 * 30 * Fields: 31 * - phys_addr: physical address of the memory region 32 * - size: size of the memory region 33 * - buffer: virtual address of the memory region 34 */ 35struct usb_memory_block { 36 usb_paddr_t phys_addr; 37 ssize_t size; 38 void *buffer; 39}; 40 41 42/* 43 * ------------------------------------------------------------------------ 44 * USB memory page 45 * ------------------------------------------------------------------------ 46 * This data structure is used for allocating the hardware descriptors 47 * such as transfer descriptors and endpoint descriptors. 48 * 49 * Fields: 50 * - cap: barrelfish frame capability 51 * - frame_id: barrelfish frame id 52 * - phys_addr: physial base address of the usb page 53 * - size: size of the usb page 54 * - buffer: virtual address of the buffer 55 */ 56struct usb_page { 57 struct capref cap; 58 struct frame_identity frame_id; 59 struct usb_memory_block page; 60 struct usb_memory_block free; 61 struct usb_page *next; 62}; 63 64 65/* 66 * ------------------------------------------------------------------------ 67 * USB memory page 68 * ------------------------------------------------------------------------ 69 * This data structure is used for allocating buffers for device DMA transfers- 70 * 71 * Fields: 72 * - cap: barrelfish frame capability 73 * - frame_id: barrelfish frame id 74 * - phys_addr: physial base address of the usb page 75 * - size: size of the usb page 76 * - buffer: virtual address of the buffer 77 */ 78struct usb_dma_page { 79 struct capref cap; 80 struct frame_identity frame_id; 81 usb_paddr_t phys_addr; 82 uint32_t size; 83 void *buffer; 84 struct usb_xfer *xfer; 85 struct usb_dma_page *next; 86}; 87 88 89/* 90 * ------------------------------------------------------------------------ 91 * USB Memory Page List 92 * ------------------------------------------------------------------------ 93 * This data structure is used for allocating buffers for device DMA transfers- 94 * 95 * Fields: 96 * - cap: barrelfish frame capability 97 * - frame_id: barrelfish frame id 98 99 */ 100struct usb_page_list_entry { 101 struct usb_page_list_entry *next; 102 struct usb_page *page; 103}; 104 105 106 107 108 109struct usb_page *usb_mem_page_alloc(void); 110void usb_mem_page_free(struct usb_page *ret_page); 111 112uint32_t usb_mem_next_block(uint32_t size, uint32_t align, struct usb_page *page, 113 struct usb_memory_block *ret_mem); 114 115struct usb_dma_page *usb_mem_dma_alloc(uint32_t size, uint32_t align); 116void usb_mem_dma_free(struct usb_dma_page *page); 117 118void usb_mem_copy_in(struct usb_dma_page *pg, uint32_t offset, const void *data, uint32_t length); 119void usb_mem_copy_out(struct usb_dma_page *pg, uint32_t offset, void *data, uint32_t length); 120#endif /* USB_MEMORY_H_ */ 121