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