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
15errval_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;
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    PCI_CLIENT_DEBUG("mem: map in cap \n");
37    err = mem->memobj->f.fill(mem->memobj, offset, mem->frame_cap,
38                              cap_size);
39    if (err_is_fail(err)) {
40        DEBUG_ERR(err, "memobj->f.fill failed");
41        return err_push(err, LIB_ERR_MEMOBJ_FILL);
42    }
43    PCI_CLIENT_DEBUG("offset = %lu\n", offset);
44    err = mem->memobj->f.pagefault(mem->memobj, mem->vregion, offset, 0);
45    if (err_is_fail(err)) {
46        DEBUG_ERR(err, "memobj->f.pagefault failed");
47        return err_push(err, LIB_ERR_MEMOBJ_PAGEFAULT_HANDLER);
48    }
49    offset += cap_size;
50
51    return SYS_ERR_OK;
52}
53
54errval_t map_bars(struct device_mem *bars, int nr_mapped_bars)
55{
56    errval_t err;
57
58    for (int i = 0; i < nr_mapped_bars; i++) {
59        err = map_device(&(bars[i]));
60        if (err_is_fail(err)) {
61            return err;
62        }
63    }
64
65    return SYS_ERR_OK;
66}
67
68