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(nbits: 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(nr: 0, addr: hdev->asid_bitmap); |
22 | |
23 | return 0; |
24 | } |
25 | |
26 | void hl_asid_fini(struct hl_device *hdev) |
27 | { |
28 | mutex_destroy(lock: &hdev->asid_mutex); |
29 | bitmap_free(bitmap: 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(addr: hdev->asid_bitmap, |
39 | size: hdev->asic_prop.max_asid); |
40 | if (found == hdev->asic_prop.max_asid) |
41 | found = 0; |
42 | else |
43 | set_bit(nr: found, addr: hdev->asid_bitmap); |
44 | |
45 | mutex_unlock(lock: &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(nr: asid, addr: hdev->asid_bitmap); |
58 | } |
59 |