GNU Linux-libre 6.8.9-gnu
[releases.git] / drivers / accel / habanalabs / common / asid.c
1 // SPDX-License-Identifier: GPL-2.0
2
3 /*
4  * Copyright 2016-2019 HabanaLabs, Ltd.
5  * All Rights Reserved.
6  */
7
8 #include "habanalabs.h"
9
10 #include <linux/slab.h>
11
12 int hl_asid_init(struct hl_device *hdev)
13 {
14         hdev->asid_bitmap = bitmap_zalloc(hdev->asic_prop.max_asid, GFP_KERNEL);
15         if (!hdev->asid_bitmap)
16                 return -ENOMEM;
17
18         mutex_init(&hdev->asid_mutex);
19
20         /* ASID 0 is reserved for the kernel driver and device CPU */
21         set_bit(0, hdev->asid_bitmap);
22
23         return 0;
24 }
25
26 void hl_asid_fini(struct hl_device *hdev)
27 {
28         mutex_destroy(&hdev->asid_mutex);
29         bitmap_free(hdev->asid_bitmap);
30 }
31
32 unsigned long hl_asid_alloc(struct hl_device *hdev)
33 {
34         unsigned long found;
35
36         mutex_lock(&hdev->asid_mutex);
37
38         found = find_first_zero_bit(hdev->asid_bitmap,
39                                         hdev->asic_prop.max_asid);
40         if (found == hdev->asic_prop.max_asid)
41                 found = 0;
42         else
43                 set_bit(found, hdev->asid_bitmap);
44
45         mutex_unlock(&hdev->asid_mutex);
46
47         return found;
48 }
49
50 void hl_asid_free(struct hl_device *hdev, unsigned long asid)
51 {
52         if (asid == HL_KERNEL_ASID_ID || asid >= hdev->asic_prop.max_asid) {
53                 dev_crit(hdev->dev, "Invalid ASID %lu", asid);
54                 return;
55         }
56
57         clear_bit(asid, hdev->asid_bitmap);
58 }