brintos

brintos / linux-shallow public Read only

0
0
Text · 2.8 KiB · 52ccfd3 Raw
91 lines · c
1/* SPDX-License-Identifier: GPL-2.0 OR MIT */2/*3 * Copyright 2014-2022 Advanced Micro Devices, Inc.4 *5 * Permission is hereby granted, free of charge, to any person obtaining a6 * copy of this software and associated documentation files (the "Software"),7 * to deal in the Software without restriction, including without limitation8 * the rights to use, copy, modify, merge, publish, distribute, sublicense,9 * and/or sell copies of the Software, and to permit persons to whom the10 * Software is furnished to do so, subject to the following conditions:11 *12 * The above copyright notice and this permission notice shall be included in13 * all copies or substantial portions of the Software.14 *15 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR16 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,17 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL18 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR19 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,20 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR21 * OTHER DEALINGS IN THE SOFTWARE.22 */23 24#ifndef KFD_EVENTS_H_INCLUDED25#define KFD_EVENTS_H_INCLUDED26 27#include <linux/kernel.h>28#include <linux/hashtable.h>29#include <linux/types.h>30#include <linux/list.h>31#include <linux/wait.h>32#include "kfd_priv.h"33#include <uapi/linux/kfd_ioctl.h>34 35/*36 * IDR supports non-negative integer IDs. Small IDs are used for37 * signal events to match their signal slot. Use the upper half of the38 * ID space for non-signal events.39 */40#define KFD_FIRST_NONSIGNAL_EVENT_ID ((INT_MAX >> 1) + 1)41#define KFD_LAST_NONSIGNAL_EVENT_ID INT_MAX42 43/*44 * Written into kfd_signal_slot_t to indicate that the event is not signaled.45 * Since the event protocol may need to write the event ID into memory, this46 * must not be a valid event ID.47 * For the sake of easy memset-ing, this must be a byte pattern.48 */49#define UNSIGNALED_EVENT_SLOT ((uint64_t)-1)50 51struct kfd_event_waiter;52struct signal_page;53 54struct kfd_event {55	u32 event_id;56	u64 event_age;57 58	bool signaled;59	bool auto_reset;60 61	int type;62 63	spinlock_t lock;64	wait_queue_head_t wq; /* List of event waiters. */65 66	/* Only for signal events. */67	uint64_t __user *user_signal_address;68 69	/* type specific data */70	union {71		struct kfd_hsa_memory_exception_data memory_exception_data;72		struct kfd_hsa_hw_exception_data hw_exception_data;73	};74 75	struct rcu_head rcu; /* for asynchronous kfree_rcu */76};77 78#define KFD_EVENT_TIMEOUT_IMMEDIATE 079#define KFD_EVENT_TIMEOUT_INFINITE 0xFFFFFFFFu80 81/* Matching HSA_EVENTTYPE */82#define KFD_EVENT_TYPE_SIGNAL 083#define KFD_EVENT_TYPE_HW_EXCEPTION 384#define KFD_EVENT_TYPE_DEBUG 585#define KFD_EVENT_TYPE_MEMORY 886 87extern void kfd_signal_event_interrupt(u32 pasid, uint32_t partial_id,88				       uint32_t valid_id_bits);89 90#endif91