/alps/pcitool

To get this branch, use:
bzr branch http://darksoft.org/webbzr/alps/pcitool

« back to all changes in this revision

Viewing changes to driver/dev.c

  • Committer: Suren A. Chilingaryan
  • Date: 2016-05-13 23:10:33 UTC
  • Revision ID: csa@suren.me-20160513231033-deh0biipgpln877s
Allow mapping of arbitrary memory areas

Show diffs side-by-side

added added

removed removed

Lines of Context:
127
127
#endif /* PCIDRIVER_DUMMY_DEVICE */
128
128
}
129
129
 
 
130
 
 
131
static int pcidriver_mmap_area(pcidriver_privdata_t *privdata, struct vm_area_struct *vmap)
 
132
{
 
133
    int ret = 0;
 
134
 
 
135
    unsigned long vma_size;
 
136
    unsigned long addr = vmap->vm_pgoff;
 
137
 
 
138
    mod_info_dbg("Entering mmap_addr\n");
 
139
 
 
140
    /* Check sizes */
 
141
    vma_size = (vmap->vm_end - vmap->vm_start);
 
142
 
 
143
    if (addr % PAGE_SIZE) {
 
144
        mod_info("mmap addr (0x%lx) is not aligned to page boundary\n", addr);
 
145
        return -EINVAL;
 
146
    }
 
147
 
 
148
    ret = remap_pfn_range(vmap, vmap->vm_start, (addr >> PAGE_SHIFT), vma_size, vmap->vm_page_prot);
 
149
 
 
150
    if (ret) {
 
151
        mod_info("remap_pfn_range failed\n");
 
152
        return -EAGAIN;
 
153
    }
 
154
 
 
155
    return 0;   /* success */
 
156
}
 
157
 
 
158
 
130
159
/**
131
160
 *
132
161
 * This function is the entry point for mmap() and calls either pcidriver_mmap_bar
156
185
        }
157
186
        ret = pcidriver_mmap_bar(privdata, vma, bar);
158
187
        break;
 
188
    case PCIDRIVER_MMAP_AREA:
 
189
        ret = pcidriver_mmap_area(privdata, vma);
 
190
        break;
159
191
    case PCIDRIVER_MMAP_KMEM:
160
192
        ret = pcidriver_mmap_kmem(privdata, vma);
161
193
        break;