IRQ: added irq source capability and make the inthandler setup use it
[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 #include <pci/pci_client_debug.h>
14
15 errval_t map_device(struct device_mem *mem)
16 {
17     errval_t err;
18
19     if(mem->type == 1) { // IO
20         return SYS_ERR_OK; // XXX
21     }
22
23     PCI_CLIENT_DEBUG("map_device: %lu\n", mem->bytes);
24
25     size_t offset = 0;
26     size_t cap_size = mem->bytes / mem->nr_caps;
27
28     err = vspace_map_anon_attr(&mem->vaddr, &mem->memobj, &mem->vregion,
29                                mem->bytes, NULL,
30                                VREGION_FLAGS_READ_WRITE_NOCACHE);
31     if (err_is_fail(err)) {
32         DEBUG_ERR(err, "vspace_map_anon_attr failed");
33         return err_push(err, LIB_ERR_VSPACE_MAP);
34     }
35
36     for (int i = 0; i < mem->nr_caps; i++) {
37         PCI_CLIENT_DEBUG("mem: map in cap nr %d\n", i);
38         err = mem->memobj->f.fill(mem->memobj, offset, mem->frame_cap[i],
39                                   cap_size);
40         if (err_is_fail(err)) {
41             DEBUG_ERR(err, "memobj->f.fill failed");
42             return err_push(err, LIB_ERR_MEMOBJ_FILL);
43         }
44         PCI_CLIENT_DEBUG("offset = %lu\n", offset);
45         err = mem->memobj->f.pagefault(mem->memobj, mem->vregion, offset, 0);
46         if (err_is_fail(err)) {
47             DEBUG_ERR(err, "memobj->f.pagefault failed");
48             return err_push(err, LIB_ERR_MEMOBJ_PAGEFAULT_HANDLER);
49         }
50         offset += cap_size;
51     }
52
53     return SYS_ERR_OK;
54 }
55
56 errval_t map_bars(struct device_mem *bars, int nr_mapped_bars)
57 {
58     errval_t err;
59
60     for (int i = 0; i < nr_mapped_bars; i++) {
61         err = map_device(&(bars[i]));
62         if (err_is_fail(err)) {
63             return err;
64         }
65     }
66
67     return SYS_ERR_OK;
68 }
69