cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

asid.c (1190B)


      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
     12int hl_asid_init(struct hl_device *hdev)
     13{
     14	hdev->asid_bitmap = kcalloc(BITS_TO_LONGS(hdev->asic_prop.max_asid),
     15					sizeof(*hdev->asid_bitmap), GFP_KERNEL);
     16	if (!hdev->asid_bitmap)
     17		return -ENOMEM;
     18
     19	mutex_init(&hdev->asid_mutex);
     20
     21	/* ASID 0 is reserved for the kernel driver and device CPU */
     22	set_bit(0, hdev->asid_bitmap);
     23
     24	return 0;
     25}
     26
     27void hl_asid_fini(struct hl_device *hdev)
     28{
     29	mutex_destroy(&hdev->asid_mutex);
     30	kfree(hdev->asid_bitmap);
     31}
     32
     33unsigned long hl_asid_alloc(struct hl_device *hdev)
     34{
     35	unsigned long found;
     36
     37	mutex_lock(&hdev->asid_mutex);
     38
     39	found = find_first_zero_bit(hdev->asid_bitmap,
     40					hdev->asic_prop.max_asid);
     41	if (found == hdev->asic_prop.max_asid)
     42		found = 0;
     43	else
     44		set_bit(found, hdev->asid_bitmap);
     45
     46	mutex_unlock(&hdev->asid_mutex);
     47
     48	return found;
     49}
     50
     51void hl_asid_free(struct hl_device *hdev, unsigned long asid)
     52{
     53	if (asid == HL_KERNEL_ASID_ID || asid >= hdev->asic_prop.max_asid) {
     54		dev_crit(hdev->dev, "Invalid ASID %lu", asid);
     55		return;
     56	}
     57
     58	clear_bit(asid, hdev->asid_bitmap);
     59}