2 * Copyright (c) 2007, 2008, 2009, 2010, ETH Zurich.
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.
11 #include <barrelfish/barrelfish.h>
15 #define PCI_DEBUG(x...) printf("pci_client: " x)
17 #define PCI_DEBUG(x...) ((void)0)
20 errval_t map_device(struct device_mem *mem)
24 if(mem->type == 1) { // IO
25 return SYS_ERR_OK; // XXX
28 PCI_DEBUG("map_device: %lu\n", mem->bytes);
31 size_t cap_size = mem->bytes / mem->nr_caps;
33 err = vspace_map_anon_attr(&mem->vaddr, &mem->memobj, &mem->vregion,
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);
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],
45 if (err_is_fail(err)) {
46 DEBUG_ERR(err, "memobj->f.fill failed");
47 return err_push(err, LIB_ERR_MEMOBJ_FILL);
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);
61 errval_t map_bars(struct device_mem *bars, int nr_mapped_bars)
65 for (int i = 0; i < nr_mapped_bars; i++) {
66 err = map_device(&(bars[i]));
67 if (err_is_fail(err)) {