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