Orange Pi5 kernel

Deprecated Linux kernel 5.10.110 for OrangePi 5/5B/5+ boards

3 Commits   0 Branches   0 Tags
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  1) // SPDX-License-Identifier: GPL-2.0
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  2) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  3) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  4)  * Copyright 2016-2019 HabanaLabs, Ltd.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  5)  * All Rights Reserved.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  6)  */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  7) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  8) #include "habanalabs.h"
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300  9) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) #include <linux/slab.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) int hl_asid_init(struct hl_device *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) 	hdev->asid_bitmap = kcalloc(BITS_TO_LONGS(hdev->asic_prop.max_asid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) 					sizeof(*hdev->asid_bitmap), GFP_KERNEL);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) 	if (!hdev->asid_bitmap)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) 		return -ENOMEM;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) 	mutex_init(&hdev->asid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) 	/* ASID 0 is reserved for the kernel driver and device CPU */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) 	set_bit(0, hdev->asid_bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) 	return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) void hl_asid_fini(struct hl_device *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) 	mutex_destroy(&hdev->asid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) 	kfree(hdev->asid_bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) unsigned long hl_asid_alloc(struct hl_device *hdev)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) 	unsigned long found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) 	mutex_lock(&hdev->asid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) 	found = find_first_zero_bit(hdev->asid_bitmap,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) 					hdev->asic_prop.max_asid);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) 	if (found == hdev->asic_prop.max_asid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) 		found = 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) 	else
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) 		set_bit(found, hdev->asid_bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) 	mutex_unlock(&hdev->asid_mutex);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) 	return found;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) 
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) void hl_asid_free(struct hl_device *hdev, unsigned long asid)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) 	if (WARN((asid == 0 || asid >= hdev->asic_prop.max_asid),
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) 						"Invalid ASID %lu", asid))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55) 		return;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) 	clear_bit(asid, hdev->asid_bitmap);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) }