Commit 3174ac9b authored by Oded Gabbay's avatar Oded Gabbay

habanalabs: restructure hl_mmap

Arrange the hl_mmap code to be more structured and expandable for the
future. Add better defines that describe our usage of the vm_pgoff.

Note that I shamelessly took the code and defines from the amdkfd driver
(my previous driver).
Signed-off-by: default avatarOded Gabbay <oded.gabbay@gmail.com>
parent f763946a
...@@ -183,7 +183,7 @@ int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr, ...@@ -183,7 +183,7 @@ int hl_cb_create(struct hl_device *hdev, struct hl_cb_mgr *mgr,
* idr is 32-bit so we can safely OR it with a mask that is above * idr is 32-bit so we can safely OR it with a mask that is above
* 32 bit * 32 bit
*/ */
*handle = cb->id | HL_MMAP_CB_MASK; *handle = cb->id | HL_MMAP_TYPE_CB;
*handle <<= PAGE_SHIFT; *handle <<= PAGE_SHIFT;
hl_debugfs_add_cb(cb); hl_debugfs_add_cb(cb);
......
...@@ -123,9 +123,13 @@ static int hl_device_release_ctrl(struct inode *inode, struct file *filp) ...@@ -123,9 +123,13 @@ static int hl_device_release_ctrl(struct inode *inode, struct file *filp)
static int hl_mmap(struct file *filp, struct vm_area_struct *vma) static int hl_mmap(struct file *filp, struct vm_area_struct *vma)
{ {
struct hl_fpriv *hpriv = filp->private_data; struct hl_fpriv *hpriv = filp->private_data;
unsigned long vm_pgoff;
if ((vma->vm_pgoff & HL_MMAP_CB_MASK) == HL_MMAP_CB_MASK) { vm_pgoff = vma->vm_pgoff;
vma->vm_pgoff ^= HL_MMAP_CB_MASK; vma->vm_pgoff = HL_MMAP_OFFSET_VALUE_GET(vm_pgoff);
switch (vm_pgoff & HL_MMAP_TYPE_MASK) {
case HL_MMAP_TYPE_CB:
return hl_cb_mmap(hpriv, vma); return hl_cb_mmap(hpriv, vma);
} }
......
...@@ -22,7 +22,19 @@ ...@@ -22,7 +22,19 @@
#define HL_NAME "habanalabs" #define HL_NAME "habanalabs"
#define HL_MMAP_CB_MASK (0x8000000000000000ull >> PAGE_SHIFT) /* Use upper bits of mmap offset to store habana driver specific information.
* bits[63:62] - Encode mmap type
* bits[45:0] - mmap offset value
*
* NOTE: struct vm_area_struct.vm_pgoff uses offset in pages. Hence, these
* defines are w.r.t to PAGE_SIZE
*/
#define HL_MMAP_TYPE_SHIFT (62 - PAGE_SHIFT)
#define HL_MMAP_TYPE_MASK (0x3ull << HL_MMAP_TYPE_SHIFT)
#define HL_MMAP_TYPE_CB (0x2ull << HL_MMAP_TYPE_SHIFT)
#define HL_MMAP_OFFSET_VALUE_MASK (0x3FFFFFFFFFFFull >> PAGE_SHIFT)
#define HL_MMAP_OFFSET_VALUE_GET(off) (off & HL_MMAP_OFFSET_VALUE_MASK)
#define HL_PENDING_RESET_PER_SEC 30 #define HL_PENDING_RESET_PER_SEC 30
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment