OpenCores
URL https://opencores.org/ocsvn/c0or1k/c0or1k/trunk

Subversion Repositories c0or1k

[/] [c0or1k/] [trunk/] [conts/] [posix/] [mm0/] [mm/] [dev.c] - Rev 2

Compare with Previous | Blame | View Log

/*
 * Copyright (C) 2008 Bahadir Balban
 */
#include <l4/lib/list.h>
#include <vm_area.h>
#include <malloc/malloc.h>
#include <fs.h>
 
/*
 * This is yet unused, it is more of an anticipation
 * of how mmaped devices would be mapped with a pager.
 */
struct mmap_device {
	struct link page_list;	/* Dyn-allocated page list */
	unsigned long pfn_start;	/* Physical pfn start */
	unsigned long pfn_end;		/* Physical pfn end */
};
 
struct page *memdev_page_in(struct vm_object *vm_obj,
			    unsigned long pfn_offset)
{
	struct vm_file *f = vm_object_to_file(vm_obj);
	struct mmap_device *memdev = f->vnode->inode;
	struct page *page;
 
	/* Check if its within device boundary */
	if (pfn_offset >= memdev->pfn_end - memdev->pfn_start)
		return PTR_ERR(-1);
 
	/* Simply return the page if found */
	list_foreach_struct(page, &memdev->page_list, list)
		if (page->offset == pfn_offset)
			return page;
 
	/* Otherwise allocate one of our own for that offset and return it */
	page = kzalloc(sizeof(struct page));
	link_init(&page->list);
	spin_lock_init(&page->lock);
	page->offset = pfn_offset;
	page->owner = vm_obj;
	list_insert(&page->list, &memdev->page_list);
 
	return page;
}
 
/* All mmapable devices are handled by this */
struct vm_pager memdev_pager = {
	.ops = {
		.page_in = memdev_page_in,
	},
};
 
 
 

Compare with Previous | Blame | View Log

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.