Book a Demo!
CoCalc Logo Icon
StoreFeaturesDocsShareSupportNewsAboutPoliciesSign UpSign In
torvalds
GitHub Repository: torvalds/linux
Path: blob/master/drivers/accel/habanalabs/common/asid.c
26450 views
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
}
59
60