Subversion Repositories Kolibri OS

Rev

Rev 3290 | Rev 3480 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. #include <ddk.h>
  2. #include <linux/mm.h>
  3. #include <drm/drmP.h>
  4. #include <drm/i915_drm.h>
  5. #include "i915_drv.h"
  6. #include "intel_drv.h"
  7.  
  8.  
  9. struct file *shmem_file_setup(const char *name, loff_t size, unsigned long flags)
  10. {
  11.     struct file *filep;
  12.     int count;
  13.  
  14.     filep = malloc(sizeof(*filep));
  15.  
  16.     if(unlikely(filep == NULL))
  17.         return ERR_PTR(-ENOMEM);
  18.  
  19.     count = size / PAGE_SIZE;
  20.  
  21.     filep->pages = kzalloc(sizeof(struct page *) * count, 0);
  22.     if(unlikely(filep->pages == NULL))
  23.     {
  24.         kfree(filep);
  25.         return ERR_PTR(-ENOMEM);
  26.     };
  27.  
  28.     filep->count     = count;
  29.     filep->allocated = 0;
  30.     filep->vma       = NULL;
  31.  
  32. //    printf("%s file %p pages %p count %d\n",
  33. //              __FUNCTION__,filep, filep->pages, count);
  34.  
  35.     return filep;
  36. }
  37.  
  38. struct page *shmem_read_mapping_page_gfp(struct file *filep,
  39.                                          pgoff_t index, gfp_t gfp)
  40. {
  41.     struct page *page;
  42.  
  43. //    dbgprintf("%s, file %p index %d\n", __FUNCTION__, filep, index);
  44.  
  45.     if(unlikely(index >= filep->count))
  46.         return ERR_PTR(-EINVAL);
  47.  
  48.     page = filep->pages[index];
  49.  
  50.     if(unlikely(page == NULL))
  51.     {
  52.         page = (struct page *)AllocPage();
  53.  
  54.         if(unlikely(page == NULL))
  55.             return ERR_PTR(-ENOMEM);
  56.  
  57.         filep->pages[index] = page;
  58.     };
  59.  
  60.     return page;
  61. };
  62.  
  63. unsigned long vm_mmap(struct file *file, unsigned long addr,
  64.          unsigned long len, unsigned long prot,
  65.          unsigned long flag, unsigned long offset)
  66. {
  67.     char *mem, *ptr;
  68.     int i;
  69.  
  70.     if (unlikely(offset + PAGE_ALIGN(len) < offset))
  71.         return -EINVAL;
  72.     if (unlikely(offset & ~PAGE_MASK))
  73.         return -EINVAL;
  74.  
  75.     mem = UserAlloc(len);
  76.     if(unlikely(mem == NULL))
  77.         return -ENOMEM;
  78.  
  79.     for(i = offset, ptr = mem; i < offset+len; i+= 4096, ptr+= 4096)
  80.     {
  81.         struct page *page;
  82.  
  83.         page = shmem_read_mapping_page_gfp(file, i/PAGE_SIZE,0);
  84.  
  85.         if (unlikely(IS_ERR(page)))
  86.             goto err;
  87.  
  88.         MapPage(ptr, (addr_t)page, PG_SHARED|PG_UW);
  89.     }
  90.  
  91.     return (unsigned long)mem;
  92. err:
  93.     UserFree(mem);
  94.     return -ENOMEM;
  95. };
  96.  
  97. void shmem_file_delete(struct file *filep)
  98. {
  99. //    printf("%s file %p pages %p count %d\n",
  100. //            __FUNCTION__, filep, filep->pages, filep->count);
  101.  
  102.     if(filep->pages)
  103.         kfree(filep->pages);
  104. }
  105.