12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758 |
- // SPDX-License-Identifier: GPL-2.0
- /*
- * Copyright 2016-2019 HabanaLabs, Ltd.
- * All Rights Reserved.
- */
- #include "habanalabs.h"
- #include <linux/slab.h>
- int hl_asid_init(struct hl_device *hdev)
- {
- hdev->asid_bitmap = bitmap_zalloc(hdev->asic_prop.max_asid, GFP_KERNEL);
- if (!hdev->asid_bitmap)
- return -ENOMEM;
- mutex_init(&hdev->asid_mutex);
- /* ASID 0 is reserved for the kernel driver and device CPU */
- set_bit(0, hdev->asid_bitmap);
- return 0;
- }
- void hl_asid_fini(struct hl_device *hdev)
- {
- mutex_destroy(&hdev->asid_mutex);
- bitmap_free(hdev->asid_bitmap);
- }
- unsigned long hl_asid_alloc(struct hl_device *hdev)
- {
- unsigned long found;
- mutex_lock(&hdev->asid_mutex);
- found = find_first_zero_bit(hdev->asid_bitmap,
- hdev->asic_prop.max_asid);
- if (found == hdev->asic_prop.max_asid)
- found = 0;
- else
- set_bit(found, hdev->asid_bitmap);
- mutex_unlock(&hdev->asid_mutex);
- return found;
- }
- void hl_asid_free(struct hl_device *hdev, unsigned long asid)
- {
- if (asid == HL_KERNEL_ASID_ID || asid >= hdev->asic_prop.max_asid) {
- dev_crit(hdev->dev, "Invalid ASID %lu", asid);
- return;
- }
- clear_bit(asid, hdev->asid_bitmap);
- }
|