b22c311198f121c78b34aa56c1da7a32f95cebc6
[barrelfish] / lib / pci / mem.c
1 /*
2  * Copyright (c) 2007, 2008, 2009, 2010, 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 #include <stdio.h>
11 #include <barrelfish/barrelfish.h>
12 #include <pci/mem.h>
13
14 #if 0
15 #define PCI_DEBUG(x...) printf("pci_client: " x)
16 #else
17 #define PCI_DEBUG(x...) ((void)0)
18 #endif
19
20 errval_t map_device(struct device_mem *mem)
21 {
22     errval_t err;
23
24     if(mem->type == 1) { // IO
25         return SYS_ERR_OK; // XXX
26     }
27
28     PCI_DEBUG("map_device: %lu\n", mem->bytes);
29
30     size_t offset = 0;
31     size_t cap_size = mem->bytes / mem->nr_caps;
32
33     err = vspace_map_anon_attr(&mem->vaddr, &mem->memobj, &mem->vregion,
34                                mem->bytes, NULL,
35                                VREGION_FLAGS_READ_WRITE_NOCACHE);
36     if (err_is_fail(err)) {
37         DEBUG_ERR(err, "vspace_map_anon_attr failed");
38         return err_push(err, LIB_ERR_VSPACE_MAP);
39     }
40
41     for (int i = 0; i < mem->nr_caps; i++) {
42         PCI_DEBUG("mem: map in cap nr %d\n", i);
43         err = mem->memobj->f.fill(mem->memobj, offset, mem->frame_cap[i],
44                                   cap_size);
45         if (err_is_fail(err)) {
46             DEBUG_ERR(err, "memobj->f.fill failed");
47             return err_push(err, LIB_ERR_MEMOBJ_FILL);
48         }
49         PCI_DEBUG("offset = %lu\n", offset);
50         err = mem->memobj->f.pagefault(mem->memobj, mem->vregion, offset, 0);
51         if (err_is_fail(err)) {
52             DEBUG_ERR(err, "memobj->f.pagefault failed");
53             return err_push(err, LIB_ERR_MEMOBJ_PAGEFAULT_HANDLER);
54         }
55         offset += cap_size;
56     }
57
58     return SYS_ERR_OK;
59 }
60
61 errval_t map_bars(struct device_mem *bars, int nr_mapped_bars)
62 {
63     errval_t err;
64
65     for (int i = 0; i < nr_mapped_bars; i++) {
66         err = map_device(&(bars[i]));
67         if (err_is_fail(err)) {
68             return err;
69         }
70     }
71
72     return SYS_ERR_OK;
73 }
74