60 lines
1.3 KiB
C
60 lines
1.3 KiB
C
|
#include <drm/drmP.h>
|
||
|
#include <drm/i915_drm.h>
|
||
|
#include "i915_drv.h"
|
||
|
#include "intel_drv.h"
|
||
|
|
||
|
|
||
|
struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags)
|
||
|
{
|
||
|
struct file *filep;
|
||
|
int count;
|
||
|
|
||
|
filep = malloc(sizeof(*filep));
|
||
|
|
||
|
if(unlikely(filep == NULL))
|
||
|
return ERR_PTR(-ENOMEM);
|
||
|
|
||
|
count = size / PAGE_SIZE;
|
||
|
|
||
|
filep->pages = kzalloc(sizeof(struct page *) * count, 0);
|
||
|
if(unlikely(filep->pages == NULL))
|
||
|
{
|
||
|
kfree(filep);
|
||
|
return ERR_PTR(-ENOMEM);
|
||
|
};
|
||
|
|
||
|
filep->count = count;
|
||
|
filep->allocated = 0;
|
||
|
filep->vma = NULL;
|
||
|
|
||
|
// dbgprintf("%s file %p pages %p count %d\n",
|
||
|
// __FUNCTION__,filep, filep->pages, filep->pages);
|
||
|
|
||
|
return filep;
|
||
|
}
|
||
|
|
||
|
struct page *shmem_read_mapping_page_gfp(struct file *filep,
|
||
|
pgoff_t index, gfp_t gfp)
|
||
|
{
|
||
|
struct page *page;
|
||
|
|
||
|
// dbgprintf("%s, file %p index %d\n", __FUNCTION__, filep, index);
|
||
|
|
||
|
if(unlikely(index >= filep->count))
|
||
|
return ERR_PTR(-EINVAL);
|
||
|
|
||
|
page = filep->pages[index];
|
||
|
|
||
|
if(unlikely(page == NULL))
|
||
|
{
|
||
|
page = (struct page *)AllocPage();
|
||
|
|
||
|
if(unlikely(page == NULL))
|
||
|
return ERR_PTR(-ENOMEM);
|
||
|
|
||
|
filep->pages[index] = page;
|
||
|
};
|
||
|
|
||
|
return page;
|
||
|
};
|