kfd_device_queue_manager.c 93 KB
Newer Older
1
// SPDX-License-Identifier: GPL-2.0 OR MIT
2
/*
3
 * Copyright 2014-2022 Advanced Micro Devices, Inc.
4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE COPYRIGHT HOLDER(S) OR AUTHOR(S) BE LIABLE FOR ANY CLAIM, DAMAGES OR
 * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
 * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR
 * OTHER DEALINGS IN THE SOFTWARE.
 *
 */

25 26
#include <linux/ratelimit.h>
#include <linux/printk.h>
27 28 29 30
#include <linux/slab.h>
#include <linux/list.h>
#include <linux/types.h>
#include <linux/bitops.h>
31
#include <linux/sched.h>
32 33 34 35 36
#include "kfd_priv.h"
#include "kfd_device_queue_manager.h"
#include "kfd_mqd_manager.h"
#include "cik_regs.h"
#include "kfd_kernel_queue.h"
37
#include "amdgpu_amdkfd.h"
38
#include "amdgpu_reset.h"
39
#include "mes_v11_api_def.h"
40
#include "kfd_debug.h"
41 42 43 44 45 46

/* Size of the per-pipe EOP queue */
#define CIK_HPD_EOP_BYTES_LOG2 11
#define CIK_HPD_EOP_BYTES (1U << CIK_HPD_EOP_BYTES_LOG2)

static int set_pasid_vmid_mapping(struct device_queue_manager *dqm,
47
				  u32 pasid, unsigned int vmid);
48

49 50
static int execute_queues_cpsch(struct device_queue_manager *dqm,
				enum kfd_unmap_queues_filter filter,
51 52
				uint32_t filter_param,
				uint32_t grace_period);
53
static int unmap_queues_cpsch(struct device_queue_manager *dqm,
54
				enum kfd_unmap_queues_filter filter,
55 56 57
				uint32_t filter_param,
				uint32_t grace_period,
				bool reset);
58

59 60
static int map_queues_cpsch(struct device_queue_manager *dqm);

61
static void deallocate_sdma_queue(struct device_queue_manager *dqm,
62
				struct queue *q);
63

64 65 66 67
static inline void deallocate_hqd(struct device_queue_manager *dqm,
				struct queue *q);
static int allocate_hqd(struct device_queue_manager *dqm, struct queue *q);
static int allocate_sdma_queue(struct device_queue_manager *dqm,
68
				struct queue *q, const uint32_t *restore_sdma_id);
69 70
static void kfd_process_hw_exception(struct work_struct *work);

71 72
static inline
enum KFD_MQD_TYPE get_mqd_type_from_queue_type(enum kfd_queue_type type)
73
{
74
	if (type == KFD_QUEUE_TYPE_SDMA || type == KFD_QUEUE_TYPE_SDMA_XGMI)
75 76
		return KFD_MQD_TYPE_SDMA;
	return KFD_MQD_TYPE_CP;
77 78
}

79 80 81
static bool is_pipe_enabled(struct device_queue_manager *dqm, int mec, int pipe)
{
	int i;
82 83
	int pipe_offset = (mec * dqm->dev->kfd->shared_resources.num_pipe_per_mec
		+ pipe) * dqm->dev->kfd->shared_resources.num_queue_per_pipe;
84 85

	/* queue is available for KFD usage if bit is 1 */
86
	for (i = 0; i <  dqm->dev->kfd->shared_resources.num_queue_per_pipe; ++i)
87
		if (test_bit(pipe_offset + i,
88
			      dqm->dev->kfd->shared_resources.cp_queue_bitmap))
89 90 91 92
			return true;
	return false;
}

93
unsigned int get_cp_queues_num(struct device_queue_manager *dqm)
94
{
95
	return bitmap_weight(dqm->dev->kfd->shared_resources.cp_queue_bitmap,
96
				AMDGPU_MAX_QUEUES);
97 98
}

99
unsigned int get_queues_per_pipe(struct device_queue_manager *dqm)
100
{
101
	return dqm->dev->kfd->shared_resources.num_queue_per_pipe;
102 103 104 105
}

unsigned int get_pipes_per_mec(struct device_queue_manager *dqm)
{
106
	return dqm->dev->kfd->shared_resources.num_pipe_per_mec;
107 108
}

109 110
static unsigned int get_num_all_sdma_engines(struct device_queue_manager *dqm)
{
111 112
	return kfd_get_num_sdma_engines(dqm->dev) +
		kfd_get_num_xgmi_sdma_engines(dqm->dev);
113 114
}

115 116
unsigned int get_num_sdma_queues(struct device_queue_manager *dqm)
{
117
	return kfd_get_num_sdma_engines(dqm->dev) *
118
		dqm->dev->kfd->device_info.num_sdma_queues_per_engine;
119 120
}

121 122
unsigned int get_num_xgmi_sdma_queues(struct device_queue_manager *dqm)
{
123
	return kfd_get_num_xgmi_sdma_engines(dqm->dev) *
124
		dqm->dev->kfd->device_info.num_sdma_queues_per_engine;
125 126
}

127 128 129 130 131 132 133
static void init_sdma_bitmaps(struct device_queue_manager *dqm)
{
	bitmap_zero(dqm->sdma_bitmap, KFD_MAX_SDMA_QUEUES);
	bitmap_set(dqm->sdma_bitmap, 0, get_num_sdma_queues(dqm));

	bitmap_zero(dqm->xgmi_sdma_bitmap, KFD_MAX_SDMA_QUEUES);
	bitmap_set(dqm->xgmi_sdma_bitmap, 0, get_num_xgmi_sdma_queues(dqm));
134 135 136 137 138

	/* Mask out the reserved queues */
	bitmap_andnot(dqm->sdma_bitmap, dqm->sdma_bitmap,
		      dqm->dev->kfd->device_info.reserved_sdma_queues_bitmap,
		      KFD_MAX_SDMA_QUEUES);
139 140
}

141
void program_sh_mem_settings(struct device_queue_manager *dqm,
142 143
					struct qcm_process_device *qpd)
{
144 145
	uint32_t xcc_mask = dqm->dev->xcc_mask;
	int xcc_id;
146

147
	for_each_inst(xcc_id, xcc_mask)
148
		dqm->dev->kfd2kgd->program_sh_mem_settings(
149 150 151
			dqm->dev->adev, qpd->vmid, qpd->sh_mem_config,
			qpd->sh_mem_ape1_base, qpd->sh_mem_ape1_limit,
			qpd->sh_mem_bases, xcc_id);
152 153
}

154 155
static void kfd_hws_hang(struct device_queue_manager *dqm)
{
156 157 158 159 160 161 162 163 164 165 166 167 168 169
	struct device_process_node *cur;
	struct qcm_process_device *qpd;
	struct queue *q;

	/* Mark all device queues as reset. */
	list_for_each_entry(cur, &dqm->queues, list) {
		qpd = cur->qpd;
		list_for_each_entry(q, &qpd->queues_list, list) {
			struct kfd_process_device *pdd = qpd_to_pdd(qpd);

			pdd->has_reset_queue = true;
		}
	}

170 171 172
	/*
	 * Issue a GPU reset if HWS is unresponsive
	 */
173
	schedule_work(&dqm->hw_exception_work);
174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201
}

static int convert_to_mes_queue_type(int queue_type)
{
	int mes_queue_type;

	switch (queue_type) {
	case KFD_QUEUE_TYPE_COMPUTE:
		mes_queue_type = MES_QUEUE_TYPE_COMPUTE;
		break;
	case KFD_QUEUE_TYPE_SDMA:
		mes_queue_type = MES_QUEUE_TYPE_SDMA;
		break;
	default:
		WARN(1, "Invalid queue type %d", queue_type);
		mes_queue_type = -EINVAL;
		break;
	}

	return mes_queue_type;
}

static int add_queue_mes(struct device_queue_manager *dqm, struct queue *q,
			 struct qcm_process_device *qpd)
{
	struct amdgpu_device *adev = (struct amdgpu_device *)dqm->dev->adev;
	struct kfd_process_device *pdd = qpd_to_pdd(qpd);
	struct mes_add_queue_input queue_input;
202
	int r, queue_type;
203
	uint64_t wptr_addr_off;
204

205
	if (!down_read_trylock(&adev->reset_domain->sem))
206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222
		return -EIO;

	memset(&queue_input, 0x0, sizeof(struct mes_add_queue_input));
	queue_input.process_id = qpd->pqm->process->pasid;
	queue_input.page_table_base_addr =  qpd->page_table_base;
	queue_input.process_va_start = 0;
	queue_input.process_va_end = adev->vm_manager.max_pfn - 1;
	/* MES unit for quantum is 100ns */
	queue_input.process_quantum = KFD_MES_PROCESS_QUANTUM;  /* Equivalent to 10ms. */
	queue_input.process_context_addr = pdd->proc_ctx_gpu_addr;
	queue_input.gang_quantum = KFD_MES_GANG_QUANTUM; /* Equivalent to 1ms */
	queue_input.gang_context_addr = q->gang_ctx_gpu_addr;
	queue_input.inprocess_gang_priority = q->properties.priority;
	queue_input.gang_global_priority_level =
					AMDGPU_MES_PRIORITY_LEVEL_NORMAL;
	queue_input.doorbell_offset = q->properties.doorbell_off;
	queue_input.mqd_addr = q->gart_mqd_addr;
223
	queue_input.wptr_addr = (uint64_t)q->properties.write_ptr;
224

225 226
	wptr_addr_off = (uint64_t)q->properties.write_ptr & (PAGE_SIZE - 1);
	queue_input.wptr_mc_addr = amdgpu_bo_gpu_offset(q->properties.wptr_bo) + wptr_addr_off;
227

228
	queue_input.is_kfd_process = 1;
229 230
	queue_input.is_aql_queue = (q->properties.format == KFD_QUEUE_FORMAT_AQL);
	queue_input.queue_size = q->properties.queue_size >> 2;
231

232 233 234
	queue_input.paging = false;
	queue_input.tba_addr = qpd->tba_addr;
	queue_input.tma_addr = qpd->tma_addr;
235
	queue_input.trap_en = !kfd_dbg_has_cwsr_workaround(q->device);
236 237 238 239
	queue_input.skip_process_ctx_clear =
		qpd->pqm->process->runtime_info.runtime_state == DEBUG_RUNTIME_STATE_ENABLED &&
						(qpd->pqm->process->debug_trap_enabled ||
						 kfd_dbg_has_ttmps_always_setup(q->device));
240

241 242
	queue_type = convert_to_mes_queue_type(q->properties.type);
	if (queue_type < 0) {
243 244
		dev_err(adev->dev, "Queue type not supported with MES, queue:%d\n",
			q->properties.type);
245
		up_read(&adev->reset_domain->sem);
246 247
		return -EINVAL;
	}
248
	queue_input.queue_type = (uint32_t)queue_type;
249

250
	queue_input.exclusively_scheduled = q->properties.is_gws;
251 252 253 254

	amdgpu_mes_lock(&adev->mes);
	r = adev->mes.funcs->add_hw_queue(&adev->mes, &queue_input);
	amdgpu_mes_unlock(&adev->mes);
255
	up_read(&adev->reset_domain->sem);
256
	if (r) {
257
		dev_err(adev->dev, "failed to add hardware queue to MES, doorbell=0x%x\n",
258
			q->properties.doorbell_off);
259
		dev_err(adev->dev, "MES might be in unrecoverable state, issue a GPU reset\n");
260
		kfd_hws_hang(dqm);
261
	}
262 263 264 265 266 267 268 269 270 271 272

	return r;
}

static int remove_queue_mes(struct device_queue_manager *dqm, struct queue *q,
			struct qcm_process_device *qpd)
{
	struct amdgpu_device *adev = (struct amdgpu_device *)dqm->dev->adev;
	int r;
	struct mes_remove_queue_input queue_input;

273
	if (!down_read_trylock(&adev->reset_domain->sem))
274 275 276 277 278 279 280 281 282
		return -EIO;

	memset(&queue_input, 0x0, sizeof(struct mes_remove_queue_input));
	queue_input.doorbell_offset = q->properties.doorbell_off;
	queue_input.gang_context_addr = q->gang_ctx_gpu_addr;

	amdgpu_mes_lock(&adev->mes);
	r = adev->mes.funcs->remove_hw_queue(&adev->mes, &queue_input);
	amdgpu_mes_unlock(&adev->mes);
283
	up_read(&adev->reset_domain->sem);
284 285

	if (r) {
286
		dev_err(adev->dev, "failed to remove hardware queue from MES, doorbell=0x%x\n",
287
			q->properties.doorbell_off);
288
		dev_err(adev->dev, "MES might be in unrecoverable state, issue a GPU reset\n");
289 290 291 292 293 294 295 296 297
		kfd_hws_hang(dqm);
	}

	return r;
}

static int remove_all_queues_mes(struct device_queue_manager *dqm)
{
	struct device_process_node *cur;
298
	struct device *dev = dqm->dev->adev->dev;
299 300 301 302 303 304 305 306 307 308
	struct qcm_process_device *qpd;
	struct queue *q;
	int retval = 0;

	list_for_each_entry(cur, &dqm->queues, list) {
		qpd = cur->qpd;
		list_for_each_entry(q, &qpd->queues_list, list) {
			if (q->properties.is_active) {
				retval = remove_queue_mes(dqm, q, qpd);
				if (retval) {
309
					dev_err(dev, "%s: Failed to remove queue %d for dev %d",
310 311 312 313 314 315 316 317 318 319 320 321
						__func__,
						q->properties.queue_id,
						dqm->dev->id);
					return retval;
				}
			}
		}
	}

	return retval;
}

322
static void increment_queue_count(struct device_queue_manager *dqm,
323 324
				  struct qcm_process_device *qpd,
				  struct queue *q)
325 326
{
	dqm->active_queue_count++;
327 328
	if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE ||
	    q->properties.type == KFD_QUEUE_TYPE_DIQ)
329
		dqm->active_cp_queue_count++;
330 331 332 333 334

	if (q->properties.is_gws) {
		dqm->gws_queue_count++;
		qpd->mapped_gws_queue = true;
	}
335 336
}

337
static void decrement_queue_count(struct device_queue_manager *dqm,
338 339
				  struct qcm_process_device *qpd,
				  struct queue *q)
340 341
{
	dqm->active_queue_count--;
342 343
	if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE ||
	    q->properties.type == KFD_QUEUE_TYPE_DIQ)
344
		dqm->active_cp_queue_count--;
345 346 347 348 349

	if (q->properties.is_gws) {
		dqm->gws_queue_count--;
		qpd->mapped_gws_queue = false;
	}
350 351
}

352 353 354 355 356 357 358
/*
 * Allocate a doorbell ID to this queue.
 * If doorbell_id is passed in, make sure requested ID is valid then allocate it.
 */
static int allocate_doorbell(struct qcm_process_device *qpd,
			     struct queue *q,
			     uint32_t const *restore_id)
359
{
360
	struct kfd_node *dev = qpd->dqm->dev;
361

362
	if (!KFD_IS_SOC15(dev)) {
363 364 365
		/* On pre-SOC15 chips we need to use the queue ID to
		 * preserve the user mode ABI.
		 */
366 367 368 369

		if (restore_id && *restore_id != q->properties.queue_id)
			return -EINVAL;

370
		q->doorbell_id = q->properties.queue_id;
371 372
	} else if (q->properties.type == KFD_QUEUE_TYPE_SDMA ||
			q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) {
373 374 375 376
		/* For SDMA queues on SOC15 with 8-byte doorbell, use static
		 * doorbell assignments based on the engine and queue id.
		 * The doobell index distance between RLC (2*i) and (2*i+1)
		 * for a SDMA engine is 512.
377
		 */
378

379
		uint32_t *idx_offset = dev->kfd->shared_resources.sdma_doorbell_idx;
380 381 382 383 384 385 386 387 388 389

		/*
		 * q->properties.sdma_engine_id corresponds to the virtual
		 * sdma engine number. However, for doorbell allocation,
		 * we need the physical sdma engine id in order to get the
		 * correct doorbell offset.
		 */
		uint32_t valid_id = idx_offset[qpd->dqm->dev->node_id *
					       get_num_all_sdma_engines(qpd->dqm) +
					       q->properties.sdma_engine_id]
390 391 392 393 394 395 396
						+ (q->properties.sdma_queue_id & 1)
						* KFD_QUEUE_DOORBELL_MIRROR_OFFSET
						+ (q->properties.sdma_queue_id >> 1);

		if (restore_id && *restore_id != valid_id)
			return -EINVAL;
		q->doorbell_id = valid_id;
397
	} else {
398 399 400 401 402 403 404 405 406 407 408 409
		/* For CP queues on SOC15 */
		if (restore_id) {
			/* make sure that ID is free  */
			if (__test_and_set_bit(*restore_id, qpd->doorbell_bitmap))
				return -EINVAL;

			q->doorbell_id = *restore_id;
		} else {
			/* or reserve a free doorbell ID */
			unsigned int found;

			found = find_first_zero_bit(qpd->doorbell_bitmap,
410
						    KFD_MAX_NUM_OF_QUEUES_PER_PROCESS);
411 412 413 414 415 416
			if (found >= KFD_MAX_NUM_OF_QUEUES_PER_PROCESS) {
				pr_debug("No doorbells available");
				return -EBUSY;
			}
			set_bit(found, qpd->doorbell_bitmap);
			q->doorbell_id = found;
417 418 419
		}
	}

420 421
	q->properties.doorbell_off = amdgpu_doorbell_index_on_bar(dev->adev,
								  qpd->proc_doorbells,
422 423
								  q->doorbell_id,
								  dev->kfd->device_info.doorbell_size);
424 425 426 427 428 429 430
	return 0;
}

static void deallocate_doorbell(struct qcm_process_device *qpd,
				struct queue *q)
{
	unsigned int old;
431
	struct kfd_node *dev = qpd->dqm->dev;
432

433
	if (!KFD_IS_SOC15(dev) ||
434 435
	    q->properties.type == KFD_QUEUE_TYPE_SDMA ||
	    q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)
436 437 438 439 440 441
		return;

	old = test_and_clear_bit(q->doorbell_id, qpd->doorbell_bitmap);
	WARN_ON(!old);
}

442 443 444
static void program_trap_handler_settings(struct device_queue_manager *dqm,
				struct qcm_process_device *qpd)
{
445 446
	uint32_t xcc_mask = dqm->dev->xcc_mask;
	int xcc_id;
447

448
	if (dqm->dev->kfd2kgd->program_trap_handler_settings)
449
		for_each_inst(xcc_id, xcc_mask)
450
			dqm->dev->kfd2kgd->program_trap_handler_settings(
451 452
				dqm->dev->adev, qpd->vmid, qpd->tba_addr,
				qpd->tma_addr, xcc_id);
453 454
}

455 456 457 458
static int allocate_vmid(struct device_queue_manager *dqm,
			struct qcm_process_device *qpd,
			struct queue *q)
{
459
	struct device *dev = dqm->dev->adev->dev;
460
	int allocated_vmid = -1, i;
461

462 463 464 465 466 467 468 469 470
	for (i = dqm->dev->vm_info.first_vmid_kfd;
			i <= dqm->dev->vm_info.last_vmid_kfd; i++) {
		if (!dqm->vmid_pasid[i]) {
			allocated_vmid = i;
			break;
		}
	}

	if (allocated_vmid < 0) {
471
		dev_err(dev, "no more vmid to allocate\n");
472 473 474 475 476 477
		return -ENOSPC;
	}

	pr_debug("vmid allocated: %d\n", allocated_vmid);

	dqm->vmid_pasid[allocated_vmid] = q->process->pasid;
478

479
	set_pasid_vmid_mapping(dqm, q->process->pasid, allocated_vmid);
480 481 482 483 484 485

	qpd->vmid = allocated_vmid;
	q->properties.vmid = allocated_vmid;

	program_sh_mem_settings(dqm, qpd);

486
	if (KFD_IS_SOC15(dqm->dev) && dqm->dev->kfd->cwsr_enabled)
487 488
		program_trap_handler_settings(dqm, qpd);

489 490 491
	/* qpd->page_table_base is set earlier when register_process()
	 * is called, i.e. when the first queue is created.
	 */
492
	dqm->dev->kfd2kgd->set_vm_context_page_table_base(dqm->dev->adev,
493 494 495
			qpd->vmid,
			qpd->page_table_base);
	/* invalidate the VM context after pasid and vmid mapping is set up */
496
	kfd_flush_tlb(qpd_to_pdd(qpd), TLB_FLUSH_LEGACY);
497

498
	if (dqm->dev->kfd2kgd->set_scratch_backing_va)
499
		dqm->dev->kfd2kgd->set_scratch_backing_va(dqm->dev->adev,
500
				qpd->sh_hidden_private_base, qpd->vmid);
501

502 503 504
	return 0;
}

505
static int flush_texture_cache_nocpsch(struct kfd_node *kdev,
506 507
				struct qcm_process_device *qpd)
{
508
	const struct packet_manager_funcs *pmf = qpd->dqm->packet_mgr.pmf;
509
	int ret;
510 511 512 513

	if (!qpd->ib_kaddr)
		return -ENOMEM;

514 515 516
	ret = pmf->release_mem(qpd->ib_base, (uint32_t *)qpd->ib_kaddr);
	if (ret)
		return ret;
517

518
	return amdgpu_amdkfd_submit_ib(kdev->adev, KGD_ENGINE_MEC1, qpd->vmid,
519 520
				qpd->ib_base, (uint32_t *)qpd->ib_kaddr,
				pmf->release_mem_size / sizeof(uint32_t));
521 522
}

523 524 525 526
static void deallocate_vmid(struct device_queue_manager *dqm,
				struct qcm_process_device *qpd,
				struct queue *q)
{
527 528
	struct device *dev = dqm->dev->adev->dev;

529
	/* On GFX v7, CP doesn't flush TC at dequeue */
530
	if (q->device->adev->asic_type == CHIP_HAWAII)
531
		if (flush_texture_cache_nocpsch(q->device, qpd))
532
			dev_err(dev, "Failed to flush TC\n");
533

534
	kfd_flush_tlb(qpd_to_pdd(qpd), TLB_FLUSH_LEGACY);
535

536 537
	/* Release the vmid mapping */
	set_pasid_vmid_mapping(dqm, 0, qpd->vmid);
538
	dqm->vmid_pasid[qpd->vmid] = 0;
539

540 541 542 543 544 545
	qpd->vmid = 0;
	q->properties.vmid = 0;
}

static int create_queue_nocpsch(struct device_queue_manager *dqm,
				struct queue *q,
546
				struct qcm_process_device *qpd,
547
				const struct kfd_criu_queue_priv_data *qd,
548
				const void *restore_mqd, const void *restore_ctl_stack)
549
{
550
	struct mqd_manager *mqd_mgr;
551 552
	int retval;

553
	dqm_lock(dqm);
554

555
	if (dqm->total_queue_count >= max_num_of_queues_per_device) {
556
		pr_warn("Can't create new usermode queue because %d queues were already created\n",
557
				dqm->total_queue_count);
558 559
		retval = -EPERM;
		goto out_unlock;
560 561
	}

562 563
	if (list_empty(&qpd->queues_list)) {
		retval = allocate_vmid(dqm, qpd, q);
564 565
		if (retval)
			goto out_unlock;
566 567
	}
	q->properties.vmid = qpd->vmid;
568
	/*
569 570 571
	 * Eviction state logic: mark all queues as evicted, even ones
	 * not currently active. Restoring inactive queues later only
	 * updates the is_evicted flag but is a no-op otherwise.
572
	 */
573
	q->properties.is_evicted = !!qpd->evicted;
574

575 576 577
	q->properties.tba_addr = qpd->tba_addr;
	q->properties.tma_addr = qpd->tma_addr;

578 579
	mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type(
			q->properties.type)];
580 581 582 583 584 585 586 587
	if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE) {
		retval = allocate_hqd(dqm, q);
		if (retval)
			goto deallocate_vmid;
		pr_debug("Loading mqd to hqd on pipe %d, queue %d\n",
			q->pipe, q->queue);
	} else if (q->properties.type == KFD_QUEUE_TYPE_SDMA ||
		q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) {
588
		retval = allocate_sdma_queue(dqm, q, qd ? &qd->sdma_id : NULL);
589 590 591 592 593
		if (retval)
			goto deallocate_vmid;
		dqm->asic_ops.init_sdma_vm(dqm, q, qpd);
	}

594
	retval = allocate_doorbell(qpd, q, qd ? &qd->doorbell_id : NULL);
595 596 597
	if (retval)
		goto out_deallocate_hqd;

598 599
	/* Temporarily release dqm lock to avoid a circular lock dependency */
	dqm_unlock(dqm);
600
	q->mqd_mem_obj = mqd_mgr->allocate_mqd(mqd_mgr->dev, &q->properties);
601 602
	dqm_lock(dqm);

603 604 605 606
	if (!q->mqd_mem_obj) {
		retval = -ENOMEM;
		goto out_deallocate_doorbell;
	}
607 608 609

	if (qd)
		mqd_mgr->restore_mqd(mqd_mgr, &q->mqd, q->mqd_mem_obj, &q->gart_mqd_addr,
610 611
				     &q->properties, restore_mqd, restore_ctl_stack,
				     qd->ctl_stack_size);
612 613 614 615
	else
		mqd_mgr->init_mqd(mqd_mgr, &q->mqd, q->mqd_mem_obj,
					&q->gart_mqd_addr, &q->properties);

616
	if (q->properties.is_active) {
617 618 619 620
		if (!dqm->sched_running) {
			WARN_ONCE(1, "Load non-HWS mqd while stopped\n");
			goto add_queue_to_list;
		}
621 622 623 624 625 626 627 628

		if (WARN(q->process->mm != current->mm,
					"should only run in user thread"))
			retval = -EFAULT;
		else
			retval = mqd_mgr->load_mqd(mqd_mgr, q->mqd, q->pipe,
					q->queue, &q->properties, current->mm);
		if (retval)
629
			goto out_free_mqd;
630 631
	}

632
add_queue_to_list:
633
	list_add(&q->list, &qpd->queues_list);
634
	qpd->queue_count++;
635
	if (q->properties.is_active)
636
		increment_queue_count(dqm, qpd, q);
637

638 639 640 641 642 643 644
	/*
	 * Unconditionally increment this counter, regardless of the queue's
	 * type or whether the queue is active.
	 */
	dqm->total_queue_count++;
	pr_debug("Total of %d queues are accountable so far\n",
			dqm->total_queue_count);
645
	goto out_unlock;
646

647 648
out_free_mqd:
	mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
649 650 651 652 653 654 655 656 657 658 659
out_deallocate_doorbell:
	deallocate_doorbell(qpd, q);
out_deallocate_hqd:
	if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE)
		deallocate_hqd(dqm, q);
	else if (q->properties.type == KFD_QUEUE_TYPE_SDMA ||
		q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)
		deallocate_sdma_queue(dqm, q);
deallocate_vmid:
	if (list_empty(&qpd->queues_list))
		deallocate_vmid(dqm, qpd, q);
660
out_unlock:
661
	dqm_unlock(dqm);
662
	return retval;
663 664 665 666 667
}

static int allocate_hqd(struct device_queue_manager *dqm, struct queue *q)
{
	bool set;
668
	int pipe, bit, i;
669 670 671

	set = false;

672 673
	for (pipe = dqm->next_pipe_to_allocate, i = 0;
			i < get_pipes_per_mec(dqm);
674 675 676 677 678
			pipe = ((pipe + 1) % get_pipes_per_mec(dqm)), ++i) {

		if (!is_pipe_enabled(dqm, 0, pipe))
			continue;

679
		if (dqm->allocated_queues[pipe] != 0) {
680 681
			bit = ffs(dqm->allocated_queues[pipe]) - 1;
			dqm->allocated_queues[pipe] &= ~(1 << bit);
682 683 684 685 686 687 688
			q->pipe = pipe;
			q->queue = bit;
			set = true;
			break;
		}
	}

689
	if (!set)
690 691
		return -EBUSY;

692
	pr_debug("hqd slot - pipe %d, queue %d\n", q->pipe, q->queue);
693
	/* horizontal hqd allocation */
694
	dqm->next_pipe_to_allocate = (pipe + 1) % get_pipes_per_mec(dqm);
695 696 697 698 699 700 701

	return 0;
}

static inline void deallocate_hqd(struct device_queue_manager *dqm,
				struct queue *q)
{
702
	dqm->allocated_queues[q->pipe] |= (1 << q->queue);
703 704
}

705 706 707
#define SQ_IND_CMD_CMD_KILL		0x00000003
#define SQ_IND_CMD_MODE_BROADCAST	0x00000001

708
static int dbgdev_wave_reset_wavefronts(struct kfd_node *dev, struct kfd_process *p)
709 710 711 712 713 714 715 716 717
{
	int status = 0;
	unsigned int vmid;
	uint16_t queried_pasid;
	union SQ_CMD_BITS reg_sq_cmd;
	union GRBM_GFX_INDEX_BITS reg_gfx_index;
	struct kfd_process_device *pdd;
	int first_vmid_to_scan = dev->vm_info.first_vmid_kfd;
	int last_vmid_to_scan = dev->vm_info.last_vmid_kfd;
718 719
	uint32_t xcc_mask = dev->xcc_mask;
	int xcc_id;
720 721 722 723 724 725

	reg_sq_cmd.u32All = 0;
	reg_gfx_index.u32All = 0;

	pr_debug("Killing all process wavefronts\n");

726
	if (!dev->kfd2kgd->get_atc_vmid_pasid_mapping_info) {
727
		dev_err(dev->adev->dev, "no vmid pasid mapping supported\n");
728 729 730
		return -EOPNOTSUPP;
	}

731 732 733 734 735
	/* Scan all registers in the range ATC_VMID8_PASID_MAPPING ..
	 * ATC_VMID15_PASID_MAPPING
	 * to check which VMID the current process is mapped to.
	 */

736 737 738
	for (vmid = first_vmid_to_scan; vmid <= last_vmid_to_scan; vmid++) {
		status = dev->kfd2kgd->get_atc_vmid_pasid_mapping_info
				(dev->adev, vmid, &queried_pasid);
739

740 741 742 743
		if (status && queried_pasid == p->pasid) {
			pr_debug("Killing wave fronts of vmid %d and pasid 0x%x\n",
					vmid, p->pasid);
			break;
744 745 746 747
		}
	}

	if (vmid > last_vmid_to_scan) {
748
		dev_err(dev->adev->dev, "Didn't find vmid for pasid 0x%x\n", p->pasid);
749 750 751 752 753 754 755 756 757 758 759 760 761 762 763
		return -EFAULT;
	}

	/* taking the VMID for that process on the safe way using PDD */
	pdd = kfd_get_process_device_data(dev, p);
	if (!pdd)
		return -EFAULT;

	reg_gfx_index.bits.sh_broadcast_writes = 1;
	reg_gfx_index.bits.se_broadcast_writes = 1;
	reg_gfx_index.bits.instance_broadcast_writes = 1;
	reg_sq_cmd.bits.mode = SQ_IND_CMD_MODE_BROADCAST;
	reg_sq_cmd.bits.cmd = SQ_IND_CMD_CMD_KILL;
	reg_sq_cmd.bits.vm_id = vmid;

764 765 766 767
	for_each_inst(xcc_id, xcc_mask)
		dev->kfd2kgd->wave_control_execute(
			dev->adev, reg_gfx_index.u32All,
			reg_sq_cmd.u32All, xcc_id);
768 769 770 771

	return 0;
}

772 773 774 775
/* Access to DQM has to be locked before calling destroy_queue_nocpsch_locked
 * to avoid asynchronized access
 */
static int destroy_queue_nocpsch_locked(struct device_queue_manager *dqm,
776 777 778 779
				struct qcm_process_device *qpd,
				struct queue *q)
{
	int retval;
780
	struct mqd_manager *mqd_mgr;
781

782 783
	mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type(
			q->properties.type)];
784

785
	if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE)
786
		deallocate_hqd(dqm, q);
787
	else if (q->properties.type == KFD_QUEUE_TYPE_SDMA)
788
		deallocate_sdma_queue(dqm, q);
789
	else if (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)
790
		deallocate_sdma_queue(dqm, q);
791
	else {
792
		pr_debug("q->properties.type %d is invalid\n",
793
				q->properties.type);
794
		return -EINVAL;
795
	}
796
	dqm->total_queue_count--;
797

798 799
	deallocate_doorbell(qpd, q);

800 801 802 803 804
	if (!dqm->sched_running) {
		WARN_ONCE(1, "Destroy non-HWS queue while stopped\n");
		return 0;
	}

805
	retval = mqd_mgr->destroy_mqd(mqd_mgr, q->mqd,
806
				KFD_PREEMPT_TYPE_WAVEFRONT_RESET,
807
				KFD_UNMAP_LATENCY_MS,
808
				q->pipe, q->queue);
809 810
	if (retval == -ETIME)
		qpd->reset_wavefronts = true;
811 812

	list_del(&q->list);
813 814 815 816 817 818 819 820 821 822 823 824
	if (list_empty(&qpd->queues_list)) {
		if (qpd->reset_wavefronts) {
			pr_warn("Resetting wave fronts (nocpsch) on dev %p\n",
					dqm->dev);
			/* dbgdev_wave_reset_wavefronts has to be called before
			 * deallocate_vmid(), i.e. when vmid is still in use.
			 */
			dbgdev_wave_reset_wavefronts(dqm->dev,
					qpd->pqm->process);
			qpd->reset_wavefronts = false;
		}

825
		deallocate_vmid(dqm, qpd, q);
826
	}
827
	qpd->queue_count--;
828 829
	if (q->properties.is_active)
		decrement_queue_count(dqm, qpd, q);
830

831 832
	return retval;
}
833

834 835 836 837 838
static int destroy_queue_nocpsch(struct device_queue_manager *dqm,
				struct qcm_process_device *qpd,
				struct queue *q)
{
	int retval;
839
	uint64_t sdma_val = 0;
840
	struct device *dev = dqm->dev->adev->dev;
841
	struct kfd_process_device *pdd = qpd_to_pdd(qpd);
842 843
	struct mqd_manager *mqd_mgr =
		dqm->mqd_mgrs[get_mqd_type_from_queue_type(q->properties.type)];
844 845 846 847

	/* Get the SDMA queue stats */
	if ((q->properties.type == KFD_QUEUE_TYPE_SDMA) ||
	    (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)) {
848
		retval = read_sdma_queue_counter((uint64_t __user *)q->properties.read_ptr,
849 850
							&sdma_val);
		if (retval)
851
			dev_err(dev, "Failed to read SDMA queue counter for queue: %d\n",
852 853
				q->properties.queue_id);
	}
854

855
	dqm_lock(dqm);
856
	retval = destroy_queue_nocpsch_locked(dqm, qpd, q);
857 858
	if (!retval)
		pdd->sdma_past_activity_counter += sdma_val;
859
	dqm_unlock(dqm);
860

861 862
	mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);

863 864 865
	return retval;
}

866 867
static int update_queue(struct device_queue_manager *dqm, struct queue *q,
			struct mqd_update_info *minfo)
868
{
869
	int retval = 0;
870
	struct device *dev = dqm->dev->adev->dev;
871
	struct mqd_manager *mqd_mgr;
872
	struct kfd_process_device *pdd;
873
	bool prev_active = false;
874

875
	dqm_lock(dqm);
876 877 878 879 880
	pdd = kfd_get_process_device_data(q->device, q->process);
	if (!pdd) {
		retval = -ENODEV;
		goto out_unlock;
	}
881 882
	mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type(
			q->properties.type)];
883

884 885 886 887
	/* Save previous activity state for counters */
	prev_active = q->properties.is_active;

	/* Make sure the queue is unmapped before updating the MQD */
888
	if (dqm->sched_policy != KFD_SCHED_POLICY_NO_HWS) {
889
		if (!dqm->dev->kfd->shared_resources.enable_mes)
890
			retval = unmap_queues_cpsch(dqm,
891
						    KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, USE_DEFAULT_GRACE_PERIOD, false);
892 893 894
		else if (prev_active)
			retval = remove_queue_mes(dqm, q, &pdd->qpd);

895 896 897 898 899 900
		/* queue is reset so inaccessable  */
		if (pdd->has_reset_queue) {
			retval = -EACCES;
			goto out_unlock;
		}

901
		if (retval) {
902
			dev_err(dev, "unmap queue failed\n");
903 904
			goto out_unlock;
		}
905
	} else if (prev_active &&
906
		   (q->properties.type == KFD_QUEUE_TYPE_COMPUTE ||
907 908
		    q->properties.type == KFD_QUEUE_TYPE_SDMA ||
		    q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)) {
909 910 911 912 913 914

		if (!dqm->sched_running) {
			WARN_ONCE(1, "Update non-HWS queue while stopped\n");
			goto out_unlock;
		}

915
		retval = mqd_mgr->destroy_mqd(mqd_mgr, q->mqd,
916
				(dqm->dev->kfd->cwsr_enabled ?
917 918
				 KFD_PREEMPT_TYPE_WAVEFRONT_SAVE :
				 KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN),
919 920
				KFD_UNMAP_LATENCY_MS, q->pipe, q->queue);
		if (retval) {
921
			dev_err(dev, "destroy mqd failed\n");
922 923 924 925
			goto out_unlock;
		}
	}

926
	mqd_mgr->update_mqd(mqd_mgr, q->mqd, &q->properties, minfo);
927

928 929 930
	/*
	 * check active state vs. the previous state and modify
	 * counter accordingly. map_queues_cpsch uses the
931
	 * dqm->active_queue_count to determine whether a new runlist must be
932 933
	 * uploaded.
	 */
934 935 936 937 938
	if (q->properties.is_active && !prev_active) {
		increment_queue_count(dqm, &pdd->qpd, q);
	} else if (!q->properties.is_active && prev_active) {
		decrement_queue_count(dqm, &pdd->qpd, q);
	} else if (q->gws && !q->properties.is_gws) {
939 940 941 942 943 944 945 946 947 948 949 950 951
		if (q->properties.is_active) {
			dqm->gws_queue_count++;
			pdd->qpd.mapped_gws_queue = true;
		}
		q->properties.is_gws = true;
	} else if (!q->gws && q->properties.is_gws) {
		if (q->properties.is_active) {
			dqm->gws_queue_count--;
			pdd->qpd.mapped_gws_queue = false;
		}
		q->properties.is_gws = false;
	}

952
	if (dqm->sched_policy != KFD_SCHED_POLICY_NO_HWS) {
953
		if (!dqm->dev->kfd->shared_resources.enable_mes)
954
			retval = map_queues_cpsch(dqm);
955
		else if (q->properties.is_active)
956 957
			retval = add_queue_mes(dqm, q, &pdd->qpd);
	} else if (q->properties.is_active &&
958
		 (q->properties.type == KFD_QUEUE_TYPE_COMPUTE ||
959 960
		  q->properties.type == KFD_QUEUE_TYPE_SDMA ||
		  q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)) {
961 962 963 964 965 966 967 968
		if (WARN(q->process->mm != current->mm,
			 "should only run in user thread"))
			retval = -EFAULT;
		else
			retval = mqd_mgr->load_mqd(mqd_mgr, q->mqd,
						   q->pipe, q->queue,
						   &q->properties, current->mm);
	}
969

970
out_unlock:
971
	dqm_unlock(dqm);
972 973 974
	return retval;
}

975 976 977 978 979 980 981 982 983 984 985 986 987 988 989 990 991 992 993 994 995 996 997 998 999 1000 1001 1002 1003 1004 1005 1006 1007 1008 1009 1010 1011 1012 1013 1014 1015 1016 1017 1018 1019 1020 1021 1022 1023 1024 1025 1026 1027 1028 1029 1030 1031 1032 1033 1034 1035 1036 1037 1038 1039 1040 1041 1042 1043 1044 1045 1046 1047 1048 1049 1050 1051 1052 1053 1054 1055 1056 1057 1058 1059 1060
/* suspend_single_queue does not lock the dqm like the
 * evict_process_queues_cpsch or evict_process_queues_nocpsch. You should
 * lock the dqm before calling, and unlock after calling.
 *
 * The reason we don't lock the dqm is because this function may be
 * called on multiple queues in a loop, so rather than locking/unlocking
 * multiple times, we will just keep the dqm locked for all of the calls.
 */
static int suspend_single_queue(struct device_queue_manager *dqm,
				      struct kfd_process_device *pdd,
				      struct queue *q)
{
	bool is_new;

	if (q->properties.is_suspended)
		return 0;

	pr_debug("Suspending PASID %u queue [%i]\n",
			pdd->process->pasid,
			q->properties.queue_id);

	is_new = q->properties.exception_status & KFD_EC_MASK(EC_QUEUE_NEW);

	if (is_new || q->properties.is_being_destroyed) {
		pr_debug("Suspend: skip %s queue id %i\n",
				is_new ? "new" : "destroyed",
				q->properties.queue_id);
		return -EBUSY;
	}

	q->properties.is_suspended = true;
	if (q->properties.is_active) {
		if (dqm->dev->kfd->shared_resources.enable_mes) {
			int r = remove_queue_mes(dqm, q, &pdd->qpd);

			if (r)
				return r;
		}

		decrement_queue_count(dqm, &pdd->qpd, q);
		q->properties.is_active = false;
	}

	return 0;
}

/* resume_single_queue does not lock the dqm like the functions
 * restore_process_queues_cpsch or restore_process_queues_nocpsch. You should
 * lock the dqm before calling, and unlock after calling.
 *
 * The reason we don't lock the dqm is because this function may be
 * called on multiple queues in a loop, so rather than locking/unlocking
 * multiple times, we will just keep the dqm locked for all of the calls.
 */
static int resume_single_queue(struct device_queue_manager *dqm,
				      struct qcm_process_device *qpd,
				      struct queue *q)
{
	struct kfd_process_device *pdd;

	if (!q->properties.is_suspended)
		return 0;

	pdd = qpd_to_pdd(qpd);

	pr_debug("Restoring from suspend PASID %u queue [%i]\n",
			    pdd->process->pasid,
			    q->properties.queue_id);

	q->properties.is_suspended = false;

	if (QUEUE_IS_ACTIVE(q->properties)) {
		if (dqm->dev->kfd->shared_resources.enable_mes) {
			int r = add_queue_mes(dqm, q, &pdd->qpd);

			if (r)
				return r;
		}

		q->properties.is_active = true;
		increment_queue_count(dqm, qpd, q);
	}

	return 0;
}

1061 1062 1063 1064
static int evict_process_queues_nocpsch(struct device_queue_manager *dqm,
					struct qcm_process_device *qpd)
{
	struct queue *q;
1065
	struct mqd_manager *mqd_mgr;
1066
	struct kfd_process_device *pdd;
1067
	int retval, ret = 0;
1068

1069
	dqm_lock(dqm);
1070 1071 1072 1073
	if (qpd->evicted++ > 0) /* already evicted, do nothing */
		goto out;

	pdd = qpd_to_pdd(qpd);
1074
	pr_debug_ratelimited("Evicting PASID 0x%x queues\n",
1075 1076
			    pdd->process->pasid);

1077
	pdd->last_evict_timestamp = get_jiffies_64();
1078 1079 1080
	/* Mark all queues as evicted. Deactivate all active queues on
	 * the qpd.
	 */
1081
	list_for_each_entry(q, &qpd->queues_list, list) {
1082
		q->properties.is_evicted = true;
1083 1084
		if (!q->properties.is_active)
			continue;
1085

1086 1087
		mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type(
				q->properties.type)];
1088
		q->properties.is_active = false;
1089
		decrement_queue_count(dqm, qpd, q);
1090 1091 1092 1093

		if (WARN_ONCE(!dqm->sched_running, "Evict when stopped\n"))
			continue;

1094
		retval = mqd_mgr->destroy_mqd(mqd_mgr, q->mqd,
1095
				(dqm->dev->kfd->cwsr_enabled ?
1096 1097
				 KFD_PREEMPT_TYPE_WAVEFRONT_SAVE :
				 KFD_PREEMPT_TYPE_WAVEFRONT_DRAIN),
1098
				KFD_UNMAP_LATENCY_MS, q->pipe, q->queue);
1099 1100 1101 1102 1103
		if (retval && !ret)
			/* Return the first error, but keep going to
			 * maintain a consistent eviction state
			 */
			ret = retval;
1104 1105 1106
	}

out:
1107
	dqm_unlock(dqm);
1108
	return ret;
1109 1110 1111 1112 1113 1114
}

static int evict_process_queues_cpsch(struct device_queue_manager *dqm,
				      struct qcm_process_device *qpd)
{
	struct queue *q;
1115
	struct device *dev = dqm->dev->adev->dev;
1116 1117 1118
	struct kfd_process_device *pdd;
	int retval = 0;

1119
	dqm_lock(dqm);
1120 1121 1122 1123
	if (qpd->evicted++ > 0) /* already evicted, do nothing */
		goto out;

	pdd = qpd_to_pdd(qpd);
1124 1125 1126 1127 1128 1129 1130 1131

	/* The debugger creates processes that temporarily have not acquired
	 * all VMs for all devices and has no VMs itself.
	 * Skip queue eviction on process eviction.
	 */
	if (!pdd->drm_priv)
		goto out;

1132
	pr_debug_ratelimited("Evicting PASID 0x%x queues\n",
1133 1134
			    pdd->process->pasid);

1135 1136 1137
	/* Mark all queues as evicted. Deactivate all active queues on
	 * the qpd.
	 */
1138
	list_for_each_entry(q, &qpd->queues_list, list) {
1139
		q->properties.is_evicted = true;
1140 1141
		if (!q->properties.is_active)
			continue;
1142

1143
		q->properties.is_active = false;
1144
		decrement_queue_count(dqm, qpd, q);
1145

1146
		if (dqm->dev->kfd->shared_resources.enable_mes) {
1147 1148
			retval = remove_queue_mes(dqm, q, qpd);
			if (retval) {
1149
				dev_err(dev, "Failed to evict queue %d\n",
1150 1151 1152 1153
					q->properties.queue_id);
				goto out;
			}
		}
1154
	}
1155
	pdd->last_evict_timestamp = get_jiffies_64();
1156
	if (!dqm->dev->kfd->shared_resources.enable_mes)
1157 1158 1159
		retval = execute_queues_cpsch(dqm,
					      qpd->is_debug ?
					      KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES :
1160 1161
					      KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0,
					      USE_DEFAULT_GRACE_PERIOD);
1162 1163

out:
1164
	dqm_unlock(dqm);
1165 1166 1167 1168 1169 1170
	return retval;
}

static int restore_process_queues_nocpsch(struct device_queue_manager *dqm,
					  struct qcm_process_device *qpd)
{
1171
	struct mm_struct *mm = NULL;
1172
	struct queue *q;
1173
	struct mqd_manager *mqd_mgr;
1174
	struct kfd_process_device *pdd;
1175
	uint64_t pd_base;
1176
	uint64_t eviction_duration;
1177
	int retval, ret = 0;
1178 1179 1180

	pdd = qpd_to_pdd(qpd);
	/* Retrieve PD base */
1181
	pd_base = amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd->drm_priv);
1182

1183
	dqm_lock(dqm);
1184 1185 1186 1187 1188 1189 1190
	if (WARN_ON_ONCE(!qpd->evicted)) /* already restored, do nothing */
		goto out;
	if (qpd->evicted > 1) { /* ref count still > 0, decrement & quit */
		qpd->evicted--;
		goto out;
	}

1191
	pr_debug_ratelimited("Restoring PASID 0x%x queues\n",
1192 1193 1194 1195
			    pdd->process->pasid);

	/* Update PD Base in QPD */
	qpd->page_table_base = pd_base;
1196
	pr_debug("Updated PD address to 0x%llx\n", pd_base);
1197 1198 1199

	if (!list_empty(&qpd->queues_list)) {
		dqm->dev->kfd2kgd->set_vm_context_page_table_base(
1200
				dqm->dev->adev,
1201 1202
				qpd->vmid,
				qpd->page_table_base);
1203
		kfd_flush_tlb(pdd, TLB_FLUSH_LEGACY);
1204 1205
	}

1206 1207 1208 1209 1210
	/* Take a safe reference to the mm_struct, which may otherwise
	 * disappear even while the kfd_process is still referenced.
	 */
	mm = get_task_mm(pdd->process->lead_thread);
	if (!mm) {
1211
		ret = -EFAULT;
1212 1213 1214
		goto out;
	}

1215 1216 1217
	/* Remove the eviction flags. Activate queues that are not
	 * inactive for other reasons.
	 */
1218
	list_for_each_entry(q, &qpd->queues_list, list) {
1219 1220
		q->properties.is_evicted = false;
		if (!QUEUE_IS_ACTIVE(q->properties))
1221
			continue;
1222

1223 1224
		mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type(
				q->properties.type)];
1225
		q->properties.is_active = true;
1226
		increment_queue_count(dqm, qpd, q);
1227 1228 1229 1230

		if (WARN_ONCE(!dqm->sched_running, "Restore when stopped\n"))
			continue;

1231
		retval = mqd_mgr->load_mqd(mqd_mgr, q->mqd, q->pipe,
1232
				       q->queue, &q->properties, mm);
1233 1234 1235 1236 1237
		if (retval && !ret)
			/* Return the first error, but keep going to
			 * maintain a consistent eviction state
			 */
			ret = retval;
1238 1239
	}
	qpd->evicted = 0;
1240 1241
	eviction_duration = get_jiffies_64() - pdd->last_evict_timestamp;
	atomic64_add(eviction_duration, &pdd->evict_duration_counter);
1242
out:
1243 1244
	if (mm)
		mmput(mm);
1245
	dqm_unlock(dqm);
1246
	return ret;
1247 1248 1249 1250 1251 1252
}

static int restore_process_queues_cpsch(struct device_queue_manager *dqm,
					struct qcm_process_device *qpd)
{
	struct queue *q;
1253
	struct device *dev = dqm->dev->adev->dev;
1254
	struct kfd_process_device *pdd;
1255
	uint64_t eviction_duration;
1256 1257 1258 1259
	int retval = 0;

	pdd = qpd_to_pdd(qpd);

1260
	dqm_lock(dqm);
1261 1262 1263 1264 1265 1266 1267
	if (WARN_ON_ONCE(!qpd->evicted)) /* already restored, do nothing */
		goto out;
	if (qpd->evicted > 1) { /* ref count still > 0, decrement & quit */
		qpd->evicted--;
		goto out;
	}

1268 1269 1270 1271 1272 1273 1274
	/* The debugger creates processes that temporarily have not acquired
	 * all VMs for all devices and has no VMs itself.
	 * Skip queue restore on process restore.
	 */
	if (!pdd->drm_priv)
		goto vm_not_acquired;

1275
	pr_debug_ratelimited("Restoring PASID 0x%x queues\n",
1276 1277 1278
			    pdd->process->pasid);

	/* Update PD Base in QPD */
1279 1280
	qpd->page_table_base = amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd->drm_priv);
	pr_debug("Updated PD address to 0x%llx\n", qpd->page_table_base);
1281 1282 1283 1284

	/* activate all active queues on the qpd */
	list_for_each_entry(q, &qpd->queues_list, list) {
		q->properties.is_evicted = false;
1285 1286 1287
		if (!QUEUE_IS_ACTIVE(q->properties))
			continue;

1288
		q->properties.is_active = true;
1289
		increment_queue_count(dqm, &pdd->qpd, q);
1290

1291
		if (dqm->dev->kfd->shared_resources.enable_mes) {
1292 1293
			retval = add_queue_mes(dqm, q, qpd);
			if (retval) {
1294
				dev_err(dev, "Failed to restore queue %d\n",
1295 1296 1297 1298
					q->properties.queue_id);
				goto out;
			}
		}
1299
	}
1300
	if (!dqm->dev->kfd->shared_resources.enable_mes)
1301
		retval = execute_queues_cpsch(dqm,
1302
					      KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, USE_DEFAULT_GRACE_PERIOD);
1303 1304
	eviction_duration = get_jiffies_64() - pdd->last_evict_timestamp;
	atomic64_add(eviction_duration, &pdd->evict_duration_counter);
1305 1306
vm_not_acquired:
	qpd->evicted = 0;
1307
out:
1308
	dqm_unlock(dqm);
1309 1310 1311
	return retval;
}

1312
static int register_process(struct device_queue_manager *dqm,
1313 1314 1315
					struct qcm_process_device *qpd)
{
	struct device_process_node *n;
1316
	struct kfd_process_device *pdd;
1317
	uint64_t pd_base;
1318
	int retval;
1319

1320
	n = kzalloc(sizeof(*n), GFP_KERNEL);
1321 1322 1323 1324 1325
	if (!n)
		return -ENOMEM;

	n->qpd = qpd;

1326 1327
	pdd = qpd_to_pdd(qpd);
	/* Retrieve PD base */
1328
	pd_base = amdgpu_amdkfd_gpuvm_get_process_page_dir(pdd->drm_priv);
1329

1330
	dqm_lock(dqm);
1331 1332
	list_add(&n->list, &dqm->queues);

1333 1334
	/* Update PD Base in QPD */
	qpd->page_table_base = pd_base;
1335
	pr_debug("Updated PD address to 0x%llx\n", pd_base);
1336

1337
	retval = dqm->asic_ops.update_qpd(dqm, qpd);
1338

1339
	dqm->processes_count++;
1340

1341
	dqm_unlock(dqm);
1342

1343 1344 1345 1346 1347
	/* Outside the DQM lock because under the DQM lock we can't do
	 * reclaim or take other locks that others hold while reclaiming.
	 */
	kfd_inc_compute_active(dqm->dev);

1348
	return retval;
1349 1350
}

1351
static int unregister_process(struct device_queue_manager *dqm,
1352 1353 1354 1355 1356
					struct qcm_process_device *qpd)
{
	int retval;
	struct device_process_node *cur, *next;

1357 1358
	pr_debug("qpd->queues_list is %s\n",
			list_empty(&qpd->queues_list) ? "empty" : "not empty");
1359 1360

	retval = 0;
1361
	dqm_lock(dqm);
1362 1363 1364 1365

	list_for_each_entry_safe(cur, next, &dqm->queues, list) {
		if (qpd == cur->qpd) {
			list_del(&cur->list);
1366
			kfree(cur);
1367
			dqm->processes_count--;
1368 1369 1370 1371 1372 1373
			goto out;
		}
	}
	/* qpd not found in dqm list */
	retval = 1;
out:
1374
	dqm_unlock(dqm);
1375 1376 1377 1378 1379 1380 1381

	/* Outside the DQM lock because under the DQM lock we can't do
	 * reclaim or take other locks that others hold while reclaiming.
	 */
	if (!retval)
		kfd_dec_compute_active(dqm->dev);

1382 1383 1384 1385
	return retval;
}

static int
1386
set_pasid_vmid_mapping(struct device_queue_manager *dqm, u32 pasid,
1387 1388
			unsigned int vmid)
{
1389 1390
	uint32_t xcc_mask = dqm->dev->xcc_mask;
	int xcc_id, ret;
1391

1392
	for_each_inst(xcc_id, xcc_mask) {
1393
		ret = dqm->dev->kfd2kgd->set_pasid_vmid_mapping(
1394
			dqm->dev->adev, pasid, vmid, xcc_id);
1395 1396 1397 1398 1399
		if (ret)
			break;
	}

	return ret;
1400 1401
}

1402 1403
static void init_interrupts(struct device_queue_manager *dqm)
{
1404 1405
	uint32_t xcc_mask = dqm->dev->xcc_mask;
	unsigned int i, xcc_id;
1406

1407 1408 1409
	for_each_inst(xcc_id, xcc_mask) {
		for (i = 0 ; i < get_pipes_per_mec(dqm) ; i++) {
			if (is_pipe_enabled(dqm, 0, i)) {
1410
				dqm->dev->kfd2kgd->init_interrupts(
1411
					dqm->dev->adev, i, xcc_id);
1412
			}
1413 1414
		}
	}
1415 1416
}

1417 1418
static int initialize_nocpsch(struct device_queue_manager *dqm)
{
1419
	int pipe, queue;
1420

1421
	pr_debug("num of pipes: %d\n", get_pipes_per_mec(dqm));
1422

1423 1424 1425 1426 1427
	dqm->allocated_queues = kcalloc(get_pipes_per_mec(dqm),
					sizeof(unsigned int), GFP_KERNEL);
	if (!dqm->allocated_queues)
		return -ENOMEM;

1428
	mutex_init(&dqm->lock_hidden);
1429
	INIT_LIST_HEAD(&dqm->queues);
1430
	dqm->active_queue_count = dqm->next_pipe_to_allocate = 0;
1431
	dqm->active_cp_queue_count = 0;
1432
	dqm->gws_queue_count = 0;
1433

1434 1435 1436 1437 1438
	for (pipe = 0; pipe < get_pipes_per_mec(dqm); pipe++) {
		int pipe_offset = pipe * get_queues_per_pipe(dqm);

		for (queue = 0; queue < get_queues_per_pipe(dqm); queue++)
			if (test_bit(pipe_offset + queue,
1439
				     dqm->dev->kfd->shared_resources.cp_queue_bitmap))
1440 1441
				dqm->allocated_queues[pipe] |= 1 << queue;
	}
1442

1443 1444
	memset(dqm->vmid_pasid, 0, sizeof(dqm->vmid_pasid));

1445
	init_sdma_bitmaps(dqm);
1446 1447 1448 1449

	return 0;
}

1450
static void uninitialize(struct device_queue_manager *dqm)
1451
{
1452 1453
	int i;

1454
	WARN_ON(dqm->active_queue_count > 0 || dqm->processes_count > 0);
1455 1456

	kfree(dqm->allocated_queues);
1457
	for (i = 0 ; i < KFD_MQD_TYPE_MAX ; i++)
1458
		kfree(dqm->mqd_mgrs[i]);
1459
	mutex_destroy(&dqm->lock_hidden);
1460 1461 1462 1463
}

static int start_nocpsch(struct device_queue_manager *dqm)
{
1464 1465
	int r = 0;

1466
	pr_info("SW scheduler is used");
1467
	init_interrupts(dqm);
1468

1469
	if (dqm->dev->adev->asic_type == CHIP_HAWAII)
1470 1471 1472
		r = pm_init(&dqm->packet_mgr, dqm);
	if (!r)
		dqm->sched_running = true;
1473

1474
	return r;
1475 1476 1477 1478
}

static int stop_nocpsch(struct device_queue_manager *dqm)
{
1479 1480 1481 1482 1483 1484
	dqm_lock(dqm);
	if (!dqm->sched_running) {
		dqm_unlock(dqm);
		return 0;
	}

1485
	if (dqm->dev->adev->asic_type == CHIP_HAWAII)
1486
		pm_uninit(&dqm->packet_mgr);
1487
	dqm->sched_running = false;
1488
	dqm_unlock(dqm);
1489

1490 1491 1492
	return 0;
}

1493
static int allocate_sdma_queue(struct device_queue_manager *dqm,
1494
				struct queue *q, const uint32_t *restore_sdma_id)
1495
{
1496
	struct device *dev = dqm->dev->adev->dev;
1497 1498
	int bit;

1499
	if (q->properties.type == KFD_QUEUE_TYPE_SDMA) {
1500
		if (bitmap_empty(dqm->sdma_bitmap, KFD_MAX_SDMA_QUEUES)) {
1501
			dev_err(dev, "No more SDMA queue to allocate\n");
1502
			return -ENOMEM;
1503 1504
		}

1505 1506
		if (restore_sdma_id) {
			/* Re-use existing sdma_id */
1507
			if (!test_bit(*restore_sdma_id, dqm->sdma_bitmap)) {
1508
				dev_err(dev, "SDMA queue already in use\n");
1509 1510
				return -EBUSY;
			}
1511
			clear_bit(*restore_sdma_id, dqm->sdma_bitmap);
1512 1513 1514
			q->sdma_id = *restore_sdma_id;
		} else {
			/* Find first available sdma_id */
1515 1516 1517
			bit = find_first_bit(dqm->sdma_bitmap,
					     get_num_sdma_queues(dqm));
			clear_bit(bit, dqm->sdma_bitmap);
1518 1519 1520
			q->sdma_id = bit;
		}

1521 1522
		q->properties.sdma_engine_id =
			q->sdma_id % kfd_get_num_sdma_engines(dqm->dev);
1523
		q->properties.sdma_queue_id = q->sdma_id /
1524
				kfd_get_num_sdma_engines(dqm->dev);
1525
	} else if (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) {
1526
		if (bitmap_empty(dqm->xgmi_sdma_bitmap, KFD_MAX_SDMA_QUEUES)) {
1527
			dev_err(dev, "No more XGMI SDMA queue to allocate\n");
1528
			return -ENOMEM;
1529
		}
1530 1531
		if (restore_sdma_id) {
			/* Re-use existing sdma_id */
1532
			if (!test_bit(*restore_sdma_id, dqm->xgmi_sdma_bitmap)) {
1533
				dev_err(dev, "SDMA queue already in use\n");
1534 1535
				return -EBUSY;
			}
1536
			clear_bit(*restore_sdma_id, dqm->xgmi_sdma_bitmap);
1537 1538
			q->sdma_id = *restore_sdma_id;
		} else {
1539 1540 1541
			bit = find_first_bit(dqm->xgmi_sdma_bitmap,
					     get_num_xgmi_sdma_queues(dqm));
			clear_bit(bit, dqm->xgmi_sdma_bitmap);
1542 1543
			q->sdma_id = bit;
		}
1544 1545 1546 1547 1548 1549
		/* sdma_engine_id is sdma id including
		 * both PCIe-optimized SDMAs and XGMI-
		 * optimized SDMAs. The calculation below
		 * assumes the first N engines are always
		 * PCIe-optimized ones
		 */
1550 1551 1552
		q->properties.sdma_engine_id =
			kfd_get_num_sdma_engines(dqm->dev) +
			q->sdma_id % kfd_get_num_xgmi_sdma_engines(dqm->dev);
1553
		q->properties.sdma_queue_id = q->sdma_id /
1554
			kfd_get_num_xgmi_sdma_engines(dqm->dev);
1555 1556 1557 1558 1559 1560 1561 1562 1563 1564 1565 1566 1567 1568 1569 1570 1571 1572 1573 1574 1575 1576 1577 1578 1579 1580 1581 1582 1583 1584 1585 1586 1587 1588 1589
	} else if (q->properties.type == KFD_QUEUE_TYPE_SDMA_BY_ENG_ID) {
		int i, num_queues, num_engines, eng_offset = 0, start_engine;
		bool free_bit_found = false, is_xgmi = false;

		if (q->properties.sdma_engine_id < kfd_get_num_sdma_engines(dqm->dev)) {
			num_queues = get_num_sdma_queues(dqm);
			num_engines = kfd_get_num_sdma_engines(dqm->dev);
			q->properties.type = KFD_QUEUE_TYPE_SDMA;
		} else {
			num_queues = get_num_xgmi_sdma_queues(dqm);
			num_engines = kfd_get_num_xgmi_sdma_engines(dqm->dev);
			eng_offset = kfd_get_num_sdma_engines(dqm->dev);
			q->properties.type = KFD_QUEUE_TYPE_SDMA_XGMI;
			is_xgmi = true;
		}

		/* Scan available bit based on target engine ID. */
		start_engine = q->properties.sdma_engine_id - eng_offset;
		for (i = start_engine; i < num_queues; i += num_engines) {

			if (!test_bit(i, is_xgmi ? dqm->xgmi_sdma_bitmap : dqm->sdma_bitmap))
				continue;

			clear_bit(i, is_xgmi ? dqm->xgmi_sdma_bitmap : dqm->sdma_bitmap);
			q->sdma_id = i;
			q->properties.sdma_queue_id = q->sdma_id / num_engines;
			free_bit_found = true;
			break;
		}

		if (!free_bit_found) {
			dev_err(dev, "No more SDMA queue to allocate for target ID %i\n",
				q->properties.sdma_engine_id);
			return -ENOMEM;
		}
1590
	}
1591 1592 1593

	pr_debug("SDMA engine id: %d\n", q->properties.sdma_engine_id);
	pr_debug("SDMA queue id: %d\n", q->properties.sdma_queue_id);
1594 1595 1596 1597 1598

	return 0;
}

static void deallocate_sdma_queue(struct device_queue_manager *dqm,
1599
				struct queue *q)
1600
{
1601 1602 1603
	if (q->properties.type == KFD_QUEUE_TYPE_SDMA) {
		if (q->sdma_id >= get_num_sdma_queues(dqm))
			return;
1604
		set_bit(q->sdma_id, dqm->sdma_bitmap);
1605 1606 1607
	} else if (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) {
		if (q->sdma_id >= get_num_xgmi_sdma_queues(dqm))
			return;
1608
		set_bit(q->sdma_id, dqm->xgmi_sdma_bitmap);
1609
	}
1610 1611
}

1612 1613 1614 1615 1616 1617
/*
 * Device Queue Manager implementation for cp scheduler
 */

static int set_sched_resources(struct device_queue_manager *dqm)
{
1618
	int i, mec;
1619
	struct scheduling_resources res;
1620
	struct device *dev = dqm->dev->adev->dev;
1621

1622
	res.vmid_mask = dqm->dev->compute_vmid_bitmap;
1623 1624

	res.queue_mask = 0;
1625
	for (i = 0; i < AMDGPU_MAX_QUEUES; ++i) {
1626 1627
		mec = (i / dqm->dev->kfd->shared_resources.num_queue_per_pipe)
			/ dqm->dev->kfd->shared_resources.num_pipe_per_mec;
1628

1629
		if (!test_bit(i, dqm->dev->kfd->shared_resources.cp_queue_bitmap))
1630 1631 1632 1633 1634 1635 1636 1637
			continue;

		/* only acquire queues from the first MEC */
		if (mec > 0)
			continue;

		/* This situation may be hit in the future if a new HW
		 * generation exposes more than 64 queues. If so, the
1638 1639
		 * definition of res.queue_mask needs updating
		 */
1640
		if (WARN_ON(i >= (sizeof(res.queue_mask)*8))) {
1641
			dev_err(dev, "Invalid queue enabled by amdgpu: %d\n", i);
1642 1643 1644
			break;
		}

1645 1646
		res.queue_mask |= 1ull
			<< amdgpu_queue_mask_bit_to_set_resource_bit(
1647
				dqm->dev->adev, i);
1648
	}
1649 1650
	res.gws_mask = ~0ull;
	res.oac_mask = res.gds_heap_base = res.gds_heap_size = 0;
1651

1652 1653 1654
	pr_debug("Scheduling resources:\n"
			"vmid mask: 0x%8X\n"
			"queue mask: 0x%8llX\n",
1655 1656
			res.vmid_mask, res.queue_mask);

1657
	return pm_send_set_resources(&dqm->packet_mgr, &res);
1658 1659 1660 1661
}

static int initialize_cpsch(struct device_queue_manager *dqm)
{
1662
	pr_debug("num of pipes: %d\n", get_pipes_per_mec(dqm));
1663

1664
	mutex_init(&dqm->lock_hidden);
1665
	INIT_LIST_HEAD(&dqm->queues);
1666
	dqm->active_queue_count = dqm->processes_count = 0;
1667
	dqm->active_cp_queue_count = 0;
1668
	dqm->gws_queue_count = 0;
1669
	dqm->active_runlist = false;
1670
	INIT_WORK(&dqm->hw_exception_work, kfd_process_hw_exception);
1671
	dqm->trap_debug_vmid = 0;
1672

1673 1674
	init_sdma_bitmaps(dqm);

1675 1676
	if (dqm->dev->kfd2kgd->get_iq_wait_times)
		dqm->dev->kfd2kgd->get_iq_wait_times(dqm->dev->adev,
1677
					&dqm->wait_times,
1678
					ffs(dqm->dev->xcc_mask) - 1);
1679
	return 0;
1680 1681
}

1682 1683 1684 1685 1686 1687 1688 1689 1690 1691 1692 1693 1694 1695 1696 1697 1698 1699 1700 1701 1702 1703 1704 1705 1706 1707 1708 1709 1710 1711 1712 1713 1714 1715 1716 1717 1718 1719 1720 1721 1722 1723 1724 1725 1726 1727 1728 1729 1730 1731 1732 1733 1734 1735
/* halt_cpsch:
 * Unmap queues so the schedule doesn't continue remaining jobs in the queue.
 * Then set dqm->sched_halt so queues don't map to runlist until unhalt_cpsch
 * is called.
 */
static int halt_cpsch(struct device_queue_manager *dqm)
{
	int ret = 0;

	dqm_lock(dqm);
	if (!dqm->sched_running) {
		dqm_unlock(dqm);
		return 0;
	}

	WARN_ONCE(dqm->sched_halt, "Scheduling is already on halt\n");

	if (!dqm->is_hws_hang) {
		if (!dqm->dev->kfd->shared_resources.enable_mes)
			ret = unmap_queues_cpsch(dqm,
						 KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0,
				USE_DEFAULT_GRACE_PERIOD, false);
		else
			ret = remove_all_queues_mes(dqm);
	}
	dqm->sched_halt = true;
	dqm_unlock(dqm);

	return ret;
}

/* unhalt_cpsch
 * Unset dqm->sched_halt and map queues back to runlist
 */
static int unhalt_cpsch(struct device_queue_manager *dqm)
{
	int ret = 0;

	dqm_lock(dqm);
	if (!dqm->sched_running || !dqm->sched_halt) {
		WARN_ONCE(!dqm->sched_halt, "Scheduling is not on halt.\n");
		dqm_unlock(dqm);
		return 0;
	}
	dqm->sched_halt = false;
	if (!dqm->dev->kfd->shared_resources.enable_mes)
		ret = execute_queues_cpsch(dqm,
					   KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES,
			0, USE_DEFAULT_GRACE_PERIOD);
	dqm_unlock(dqm);

	return ret;
}

1736 1737
static int start_cpsch(struct device_queue_manager *dqm)
{
1738
	struct device *dev = dqm->dev->adev->dev;
1739
	int retval, num_hw_queue_slots;
1740 1741 1742

	retval = 0;

1743
	dqm_lock(dqm);
1744

1745
	if (!dqm->dev->kfd->shared_resources.enable_mes) {
1746 1747 1748
		retval = pm_init(&dqm->packet_mgr, dqm);
		if (retval)
			goto fail_packet_manager_init;
1749

1750 1751 1752 1753
		retval = set_sched_resources(dqm);
		if (retval)
			goto fail_set_sched_resources;
	}
1754
	pr_debug("Allocating fence memory\n");
1755 1756

	/* allocate fence memory on the gart */
1757 1758
	retval = kfd_gtt_sa_allocate(dqm->dev, sizeof(*dqm->fence_addr),
					&dqm->fence_mem);
1759

1760
	if (retval)
1761 1762
		goto fail_allocate_vidmem;

1763
	dqm->fence_addr = (uint64_t *)dqm->fence_mem->cpu_ptr;
1764
	dqm->fence_gpu_addr = dqm->fence_mem->gpu_addr;
1765 1766 1767

	init_interrupts(dqm);

1768
	/* clear hang status when driver try to start the hw scheduler */
1769
	dqm->sched_running = true;
1770

1771
	if (!dqm->dev->kfd->shared_resources.enable_mes)
1772
		execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, USE_DEFAULT_GRACE_PERIOD);
1773 1774 1775 1776 1777 1778 1779 1780 1781 1782

	/* Set CWSR grace period to 1x1000 cycle for GFX9.4.3 APU */
	if (amdgpu_emu_mode == 0 && dqm->dev->adev->gmc.is_app_apu &&
	    (KFD_GC_VERSION(dqm->dev) == IP_VERSION(9, 4, 3))) {
		uint32_t reg_offset = 0;
		uint32_t grace_period = 1;

		retval = pm_update_grace_period(&dqm->packet_mgr,
						grace_period);
		if (retval)
1783
			dev_err(dev, "Setting grace timeout failed\n");
1784 1785 1786 1787 1788
		else if (dqm->dev->kfd2kgd->build_grace_period_packet_info)
			/* Update dqm->wait_times maintained in software */
			dqm->dev->kfd2kgd->build_grace_period_packet_info(
					dqm->dev->adev,	dqm->wait_times,
					grace_period, &reg_offset,
1789
					&dqm->wait_times);
1790 1791
	}

1792 1793 1794 1795 1796 1797 1798 1799 1800 1801 1802 1803 1804
	/* setup per-queue reset detection buffer  */
	num_hw_queue_slots =  dqm->dev->kfd->shared_resources.num_queue_per_pipe *
			      dqm->dev->kfd->shared_resources.num_pipe_per_mec *
			      NUM_XCC(dqm->dev->xcc_mask);

	dqm->detect_hang_info_size = num_hw_queue_slots * sizeof(struct dqm_detect_hang_info);
	dqm->detect_hang_info = kzalloc(dqm->detect_hang_info_size, GFP_KERNEL);

	if (!dqm->detect_hang_info) {
		retval = -ENOMEM;
		goto fail_detect_hang_buffer;
	}

1805
	dqm_unlock(dqm);
1806 1807

	return 0;
1808 1809
fail_detect_hang_buffer:
	kfd_gtt_sa_free(dqm->dev, dqm->fence_mem);
1810 1811
fail_allocate_vidmem:
fail_set_sched_resources:
1812
	if (!dqm->dev->kfd->shared_resources.enable_mes)
1813
		pm_uninit(&dqm->packet_mgr);
1814
fail_packet_manager_init:
1815
	dqm_unlock(dqm);
1816 1817 1818 1819 1820
	return retval;
}

static int stop_cpsch(struct device_queue_manager *dqm)
{
1821
	dqm_lock(dqm);
1822 1823 1824 1825 1826
	if (!dqm->sched_running) {
		dqm_unlock(dqm);
		return 0;
	}

1827 1828 1829 1830
	if (!dqm->dev->kfd->shared_resources.enable_mes)
		unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0, USE_DEFAULT_GRACE_PERIOD, false);
	else
		remove_all_queues_mes(dqm);
1831

1832
	dqm->sched_running = false;
1833

1834
	if (!dqm->dev->kfd->shared_resources.enable_mes)
1835
		pm_release_ib(&dqm->packet_mgr);
1836

1837
	kfd_gtt_sa_free(dqm->dev, dqm->fence_mem);
1838
	if (!dqm->dev->kfd->shared_resources.enable_mes)
1839
		pm_uninit(&dqm->packet_mgr);
1840 1841
	kfree(dqm->detect_hang_info);
	dqm->detect_hang_info = NULL;
1842
	dqm_unlock(dqm);
1843 1844 1845 1846 1847 1848 1849 1850

	return 0;
}

static int create_kernel_queue_cpsch(struct device_queue_manager *dqm,
					struct kernel_queue *kq,
					struct qcm_process_device *qpd)
{
1851
	dqm_lock(dqm);
1852
	if (dqm->total_queue_count >= max_num_of_queues_per_device) {
1853
		pr_warn("Can't create new kernel queue because %d queues were already created\n",
1854
				dqm->total_queue_count);
1855
		dqm_unlock(dqm);
1856 1857 1858 1859 1860 1861 1862 1863 1864 1865 1866
		return -EPERM;
	}

	/*
	 * Unconditionally increment this counter, regardless of the queue's
	 * type or whether the queue is active.
	 */
	dqm->total_queue_count++;
	pr_debug("Total of %d queues are accountable so far\n",
			dqm->total_queue_count);

1867
	list_add(&kq->list, &qpd->priv_queue_list);
1868
	increment_queue_count(dqm, qpd, kq->queue);
1869
	qpd->is_debug = true;
1870 1871
	execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0,
			USE_DEFAULT_GRACE_PERIOD);
1872
	dqm_unlock(dqm);
1873 1874 1875 1876 1877 1878 1879 1880

	return 0;
}

static void destroy_kernel_queue_cpsch(struct device_queue_manager *dqm,
					struct kernel_queue *kq,
					struct qcm_process_device *qpd)
{
1881
	dqm_lock(dqm);
1882
	list_del(&kq->list);
1883
	decrement_queue_count(dqm, qpd, kq->queue);
1884
	qpd->is_debug = false;
1885 1886
	execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0,
			USE_DEFAULT_GRACE_PERIOD);
1887 1888 1889 1890
	/*
	 * Unconditionally decrement this counter, regardless of the queue's
	 * type.
	 */
1891
	dqm->total_queue_count--;
1892 1893
	pr_debug("Total of %d queues are accountable so far\n",
			dqm->total_queue_count);
1894
	dqm_unlock(dqm);
1895 1896 1897
}

static int create_queue_cpsch(struct device_queue_manager *dqm, struct queue *q,
1898
			struct qcm_process_device *qpd,
1899
			const struct kfd_criu_queue_priv_data *qd,
1900
			const void *restore_mqd, const void *restore_ctl_stack)
1901 1902
{
	int retval;
1903
	struct mqd_manager *mqd_mgr;
1904

1905
	if (dqm->total_queue_count >= max_num_of_queues_per_device) {
1906
		pr_warn("Can't create new usermode queue because %d queues were already created\n",
1907
				dqm->total_queue_count);
1908 1909
		retval = -EPERM;
		goto out;
1910 1911
	}

1912
	if (q->properties.type == KFD_QUEUE_TYPE_SDMA ||
1913 1914
		q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI ||
		q->properties.type == KFD_QUEUE_TYPE_SDMA_BY_ENG_ID) {
1915
		dqm_lock(dqm);
1916
		retval = allocate_sdma_queue(dqm, q, qd ? &qd->sdma_id : NULL);
1917
		dqm_unlock(dqm);
1918
		if (retval)
1919
			goto out;
1920
	}
1921

1922
	retval = allocate_doorbell(qpd, q, qd ? &qd->doorbell_id : NULL);
1923 1924 1925
	if (retval)
		goto out_deallocate_sdma_queue;

1926 1927
	mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type(
			q->properties.type)];
1928

1929 1930 1931
	if (q->properties.type == KFD_QUEUE_TYPE_SDMA ||
		q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)
		dqm->asic_ops.init_sdma_vm(dqm, q, qpd);
1932 1933
	q->properties.tba_addr = qpd->tba_addr;
	q->properties.tma_addr = qpd->tma_addr;
1934 1935 1936 1937 1938
	q->mqd_mem_obj = mqd_mgr->allocate_mqd(mqd_mgr->dev, &q->properties);
	if (!q->mqd_mem_obj) {
		retval = -ENOMEM;
		goto out_deallocate_doorbell;
	}
1939 1940 1941 1942 1943 1944 1945 1946

	dqm_lock(dqm);
	/*
	 * Eviction state logic: mark all queues as evicted, even ones
	 * not currently active. Restoring inactive queues later only
	 * updates the is_evicted flag but is a no-op otherwise.
	 */
	q->properties.is_evicted = !!qpd->evicted;
1947
	q->properties.is_dbg_wa = qpd->pqm->process->debug_trap_enabled &&
1948
				  kfd_dbg_has_cwsr_workaround(q->device);
1949 1950 1951

	if (qd)
		mqd_mgr->restore_mqd(mqd_mgr, &q->mqd, q->mqd_mem_obj, &q->gart_mqd_addr,
1952 1953
				     &q->properties, restore_mqd, restore_ctl_stack,
				     qd->ctl_stack_size);
1954 1955 1956
	else
		mqd_mgr->init_mqd(mqd_mgr, &q->mqd, q->mqd_mem_obj,
					&q->gart_mqd_addr, &q->properties);
1957

1958
	list_add(&q->list, &qpd->queues_list);
1959
	qpd->queue_count++;
1960

1961
	if (q->properties.is_active) {
1962
		increment_queue_count(dqm, qpd, q);
1963

1964
		if (!dqm->dev->kfd->shared_resources.enable_mes)
1965
			retval = execute_queues_cpsch(dqm,
1966
					KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0, USE_DEFAULT_GRACE_PERIOD);
1967
		else
1968
			retval = add_queue_mes(dqm, q, qpd);
1969 1970
		if (retval)
			goto cleanup_queue;
1971 1972
	}

1973 1974 1975 1976 1977 1978 1979 1980 1981
	/*
	 * Unconditionally increment this counter, regardless of the queue's
	 * type or whether the queue is active.
	 */
	dqm->total_queue_count++;

	pr_debug("Total of %d queues are accountable so far\n",
			dqm->total_queue_count);

1982
	dqm_unlock(dqm);
1983 1984
	return retval;

1985 1986 1987 1988 1989 1990 1991
cleanup_queue:
	qpd->queue_count--;
	list_del(&q->list);
	if (q->properties.is_active)
		decrement_queue_count(dqm, qpd, q);
	mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
	dqm_unlock(dqm);
1992 1993
out_deallocate_doorbell:
	deallocate_doorbell(qpd, q);
1994
out_deallocate_sdma_queue:
1995
	if (q->properties.type == KFD_QUEUE_TYPE_SDMA ||
1996 1997
		q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI) {
		dqm_lock(dqm);
1998
		deallocate_sdma_queue(dqm, q);
1999 2000
		dqm_unlock(dqm);
	}
2001
out:
2002 2003 2004
	return retval;
}

2005 2006 2007
int amdkfd_fence_wait_timeout(struct device_queue_manager *dqm,
			      uint64_t fence_value,
			      unsigned int timeout_ms)
2008
{
2009
	unsigned long end_jiffies = msecs_to_jiffies(timeout_ms) + jiffies;
2010 2011
	struct device *dev = dqm->dev->adev->dev;
	uint64_t *fence_addr =  dqm->fence_addr;
2012 2013

	while (*fence_addr != fence_value) {
2014 2015 2016 2017
		/* Fatal err detected, this response won't come */
		if (amdgpu_amdkfd_is_fed(dqm->dev->adev))
			return -EIO;

2018
		if (time_after(jiffies, end_jiffies)) {
2019
			dev_err(dev, "qcm fence wait loop timeout expired\n");
2020 2021 2022 2023 2024 2025 2026
			/* In HWS case, this is used to halt the driver thread
			 * in order not to mess up CP states before doing
			 * scandumps for FW debugging.
			 */
			while (halt_if_hws_hang)
				schedule();

2027 2028
			return -ETIME;
		}
2029
		schedule();
2030 2031 2032 2033 2034
	}

	return 0;
}

2035 2036 2037
/* dqm->lock mutex has to be locked before calling this function */
static int map_queues_cpsch(struct device_queue_manager *dqm)
{
2038
	struct device *dev = dqm->dev->adev->dev;
2039 2040
	int retval;

2041
	if (!dqm->sched_running || dqm->sched_halt)
2042
		return 0;
2043
	if (dqm->active_queue_count <= 0 || dqm->processes_count <= 0)
2044 2045 2046 2047
		return 0;
	if (dqm->active_runlist)
		return 0;

2048
	retval = pm_send_runlist(&dqm->packet_mgr, &dqm->queues);
2049
	pr_debug("%s sent runlist\n", __func__);
2050
	if (retval) {
2051
		dev_err(dev, "failed to execute runlist\n");
2052 2053 2054 2055 2056 2057 2058
		return retval;
	}
	dqm->active_runlist = true;

	return retval;
}

2059 2060 2061 2062 2063 2064 2065 2066 2067 2068 2069 2070 2071 2072 2073 2074 2075 2076 2077 2078 2079 2080 2081 2082 2083 2084 2085 2086 2087 2088 2089 2090 2091 2092 2093 2094 2095 2096 2097 2098 2099 2100 2101 2102 2103 2104 2105 2106 2107 2108 2109 2110 2111 2112 2113 2114 2115 2116 2117 2118 2119 2120 2121 2122 2123 2124 2125 2126 2127 2128 2129 2130 2131 2132 2133 2134 2135 2136 2137 2138 2139 2140 2141 2142 2143 2144 2145 2146 2147 2148 2149 2150 2151 2152 2153 2154 2155 2156 2157 2158 2159 2160 2161 2162 2163 2164 2165 2166 2167 2168 2169 2170 2171 2172 2173 2174 2175 2176 2177 2178 2179 2180 2181 2182 2183 2184 2185 2186 2187
static void set_queue_as_reset(struct device_queue_manager *dqm, struct queue *q,
			       struct qcm_process_device *qpd)
{
	struct kfd_process_device *pdd = qpd_to_pdd(qpd);

	dev_err(dqm->dev->adev->dev, "queue id 0x%0x at pasid 0x%0x is reset\n",
		q->properties.queue_id, q->process->pasid);

	pdd->has_reset_queue = true;
	if (q->properties.is_active) {
		q->properties.is_active = false;
		decrement_queue_count(dqm, qpd, q);
	}
}

static int detect_queue_hang(struct device_queue_manager *dqm)
{
	int i;

	/* detect should be used only in dqm locked queue reset */
	if (WARN_ON(dqm->detect_hang_count > 0))
		return 0;

	memset(dqm->detect_hang_info, 0, dqm->detect_hang_info_size);

	for (i = 0; i < AMDGPU_MAX_QUEUES; ++i) {
		uint32_t mec, pipe, queue;
		int xcc_id;

		mec = (i / dqm->dev->kfd->shared_resources.num_queue_per_pipe)
			/ dqm->dev->kfd->shared_resources.num_pipe_per_mec;

		if (mec || !test_bit(i, dqm->dev->kfd->shared_resources.cp_queue_bitmap))
			continue;

		amdgpu_queue_mask_bit_to_mec_queue(dqm->dev->adev, i, &mec, &pipe, &queue);

		for_each_inst(xcc_id, dqm->dev->xcc_mask) {
			uint64_t queue_addr = dqm->dev->kfd2kgd->hqd_get_pq_addr(
						dqm->dev->adev, pipe, queue, xcc_id);
			struct dqm_detect_hang_info hang_info;

			if (!queue_addr)
				continue;

			hang_info.pipe_id = pipe;
			hang_info.queue_id = queue;
			hang_info.xcc_id = xcc_id;
			hang_info.queue_address = queue_addr;

			dqm->detect_hang_info[dqm->detect_hang_count] = hang_info;
			dqm->detect_hang_count++;
		}
	}

	return dqm->detect_hang_count;
}

static struct queue *find_queue_by_address(struct device_queue_manager *dqm, uint64_t queue_address)
{
	struct device_process_node *cur;
	struct qcm_process_device *qpd;
	struct queue *q;

	list_for_each_entry(cur, &dqm->queues, list) {
		qpd = cur->qpd;
		list_for_each_entry(q, &qpd->queues_list, list) {
			if (queue_address == q->properties.queue_address)
				return q;
		}
	}

	return NULL;
}

/* only for compute queue */
static int reset_queues_on_hws_hang(struct device_queue_manager *dqm)
{
	int r = 0, reset_count = 0, i;

	if (!dqm->detect_hang_info || dqm->is_hws_hang)
		return -EIO;

	/* assume dqm locked. */
	if (!detect_queue_hang(dqm))
		return -ENOTRECOVERABLE;

	for (i = 0; i < dqm->detect_hang_count; i++) {
		struct dqm_detect_hang_info hang_info = dqm->detect_hang_info[i];
		struct queue *q = find_queue_by_address(dqm, hang_info.queue_address);
		struct kfd_process_device *pdd;
		uint64_t queue_addr = 0;

		if (!q) {
			r = -ENOTRECOVERABLE;
			goto reset_fail;
		}

		pdd = kfd_get_process_device_data(dqm->dev, q->process);
		if (!pdd) {
			r = -ENOTRECOVERABLE;
			goto reset_fail;
		}

		queue_addr = dqm->dev->kfd2kgd->hqd_reset(dqm->dev->adev,
				hang_info.pipe_id, hang_info.queue_id, hang_info.xcc_id,
				KFD_UNMAP_LATENCY_MS);

		/* either reset failed or we reset an unexpected queue. */
		if (queue_addr != q->properties.queue_address) {
			r = -ENOTRECOVERABLE;
			goto reset_fail;
		}

		set_queue_as_reset(dqm, q, &pdd->qpd);
		reset_count++;
	}

	if (reset_count == dqm->detect_hang_count)
		kfd_signal_reset_event(dqm->dev);
	else
		r = -ENOTRECOVERABLE;

reset_fail:
	dqm->detect_hang_count = 0;

	return r;
}

2188
/* dqm->lock mutex has to be locked before calling this function */
2189
static int unmap_queues_cpsch(struct device_queue_manager *dqm,
2190
				enum kfd_unmap_queues_filter filter,
2191 2192 2193
				uint32_t filter_param,
				uint32_t grace_period,
				bool reset)
2194
{
2195
	struct device *dev = dqm->dev->adev->dev;
2196
	struct mqd_manager *mqd_mgr;
2197
	int retval;
2198

2199 2200
	if (!dqm->sched_running)
		return 0;
2201
	if (!dqm->active_runlist)
2202 2203 2204
		return 0;
	if (!down_read_trylock(&dqm->dev->adev->reset_domain->sem))
		return -EIO;
2205

2206 2207 2208
	if (grace_period != USE_DEFAULT_GRACE_PERIOD) {
		retval = pm_update_grace_period(&dqm->packet_mgr, grace_period);
		if (retval)
2209
			goto out;
2210 2211
	}

2212
	retval = pm_send_unmap_queue(&dqm->packet_mgr, filter, filter_param, reset);
2213
	if (retval)
2214
		goto out;
2215 2216

	*dqm->fence_addr = KFD_FENCE_INIT;
2217
	pm_send_query_status(&dqm->packet_mgr, dqm->fence_gpu_addr,
2218 2219
				KFD_FENCE_COMPLETED);
	/* should be timed out */
2220 2221
	retval = amdkfd_fence_wait_timeout(dqm, KFD_FENCE_COMPLETED,
					   queue_preemption_timeout_ms);
2222
	if (retval) {
2223
		dev_err(dev, "The cp might be in an unrecoverable state due to an unsuccessful queues preemption\n");
2224
		kfd_hws_hang(dqm);
2225
		goto out;
2226
	}
2227

2228 2229 2230 2231 2232 2233 2234 2235 2236
	/* In the current MEC firmware implementation, if compute queue
	 * doesn't response to the preemption request in time, HIQ will
	 * abandon the unmap request without returning any timeout error
	 * to driver. Instead, MEC firmware will log the doorbell of the
	 * unresponding compute queue to HIQ.MQD.queue_doorbell_id fields.
	 * To make sure the queue unmap was successful, driver need to
	 * check those fields
	 */
	mqd_mgr = dqm->mqd_mgrs[KFD_MQD_TYPE_HIQ];
2237
	if (mqd_mgr->check_preemption_failed(mqd_mgr, dqm->packet_mgr.priv_queue->queue->mqd)) {
2238 2239 2240 2241 2242 2243 2244 2245
		if (reset_queues_on_hws_hang(dqm)) {
			while (halt_if_hws_hang)
				schedule();
			dqm->is_hws_hang = true;
			kfd_hws_hang(dqm);
			retval = -ETIME;
			goto out;
		}
2246 2247
	}

2248 2249 2250 2251
	/* We need to reset the grace period value for this device */
	if (grace_period != USE_DEFAULT_GRACE_PERIOD) {
		if (pm_update_grace_period(&dqm->packet_mgr,
					USE_DEFAULT_GRACE_PERIOD))
2252
			dev_err(dev, "Failed to reset grace period\n");
2253 2254
	}

2255
	pm_release_ib(&dqm->packet_mgr);
2256 2257
	dqm->active_runlist = false;

2258 2259
out:
	up_read(&dqm->dev->adev->reset_domain->sem);
2260 2261 2262
	return retval;
}

2263
/* only for compute queue */
2264
static int reset_queues_cpsch(struct device_queue_manager *dqm, uint16_t pasid)
2265 2266 2267 2268 2269 2270
{
	int retval;

	dqm_lock(dqm);

	retval = unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_BY_PASID,
2271
			pasid, USE_DEFAULT_GRACE_PERIOD, true);
2272 2273 2274 2275 2276

	dqm_unlock(dqm);
	return retval;
}

2277
/* dqm->lock mutex has to be locked before calling this function */
2278 2279
static int execute_queues_cpsch(struct device_queue_manager *dqm,
				enum kfd_unmap_queues_filter filter,
2280 2281
				uint32_t filter_param,
				uint32_t grace_period)
2282 2283 2284
{
	int retval;

2285
	if (!down_read_trylock(&dqm->dev->adev->reset_domain->sem))
2286
		return -EIO;
2287
	retval = unmap_queues_cpsch(dqm, filter, filter_param, grace_period, false);
2288 2289 2290 2291
	if (!retval)
		retval = map_queues_cpsch(dqm);
	up_read(&dqm->dev->adev->reset_domain->sem);
	return retval;
2292 2293
}

2294 2295 2296 2297 2298 2299 2300 2301 2302 2303 2304 2305 2306 2307 2308 2309 2310 2311 2312 2313 2314 2315 2316 2317 2318
static int wait_on_destroy_queue(struct device_queue_manager *dqm,
				 struct queue *q)
{
	struct kfd_process_device *pdd = kfd_get_process_device_data(q->device,
								q->process);
	int ret = 0;

	if (pdd->qpd.is_debug)
		return ret;

	q->properties.is_being_destroyed = true;

	if (pdd->process->debug_trap_enabled && q->properties.is_suspended) {
		dqm_unlock(dqm);
		mutex_unlock(&q->process->mutex);
		ret = wait_event_interruptible(dqm->destroy_wait,
						!q->properties.is_suspended);

		mutex_lock(&q->process->mutex);
		dqm_lock(dqm);
	}

	return ret;
}

2319 2320 2321 2322 2323
static int destroy_queue_cpsch(struct device_queue_manager *dqm,
				struct qcm_process_device *qpd,
				struct queue *q)
{
	int retval;
2324
	struct mqd_manager *mqd_mgr;
2325 2326
	uint64_t sdma_val = 0;
	struct kfd_process_device *pdd = qpd_to_pdd(qpd);
2327
	struct device *dev = dqm->dev->adev->dev;
2328 2329 2330 2331

	/* Get the SDMA queue stats */
	if ((q->properties.type == KFD_QUEUE_TYPE_SDMA) ||
	    (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)) {
2332
		retval = read_sdma_queue_counter((uint64_t __user *)q->properties.read_ptr,
2333 2334
							&sdma_val);
		if (retval)
2335
			dev_err(dev, "Failed to read SDMA queue counter for queue: %d\n",
2336 2337
				q->properties.queue_id);
	}
2338

2339
	/* remove queue from list to prevent rescheduling after preemption */
2340
	dqm_lock(dqm);
2341

2342 2343 2344 2345 2346 2347 2348
	retval = wait_on_destroy_queue(dqm, q);

	if (retval) {
		dqm_unlock(dqm);
		return retval;
	}

2349 2350 2351 2352 2353 2354 2355 2356 2357 2358
	if (qpd->is_debug) {
		/*
		 * error, currently we do not allow to destroy a queue
		 * of a currently debugged process
		 */
		retval = -EBUSY;
		goto failed_try_destroy_debugged_queue;

	}

2359 2360
	mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type(
			q->properties.type)];
2361

2362 2363
	deallocate_doorbell(qpd, q);

2364 2365
	if ((q->properties.type == KFD_QUEUE_TYPE_SDMA) ||
	    (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)) {
2366
		deallocate_sdma_queue(dqm, q);
2367 2368
		pdd->sdma_past_activity_counter += sdma_val;
	}
2369

2370
	list_del(&q->list);
2371
	qpd->queue_count--;
2372
	if (q->properties.is_active) {
2373
		decrement_queue_count(dqm, qpd, q);
2374
		if (!dqm->dev->kfd->shared_resources.enable_mes) {
2375
			retval = execute_queues_cpsch(dqm,
2376 2377
						      KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0,
						      USE_DEFAULT_GRACE_PERIOD);
2378 2379 2380 2381 2382 2383
			if (retval == -ETIME)
				qpd->reset_wavefronts = true;
		} else {
			retval = remove_queue_mes(dqm, q, qpd);
		}
	}
2384

2385 2386 2387 2388 2389 2390 2391
	/*
	 * Unconditionally decrement this counter, regardless of the queue's
	 * type
	 */
	dqm->total_queue_count--;
	pr_debug("Total of %d queues are accountable so far\n",
			dqm->total_queue_count);
2392

2393
	dqm_unlock(dqm);
2394

2395 2396 2397 2398 2399 2400 2401 2402
	/*
	 * Do free_mqd and raise delete event after dqm_unlock(dqm) to avoid
	 * circular locking
	 */
	kfd_dbg_ev_raise(KFD_EC_MASK(EC_DEVICE_QUEUE_DELETE),
				qpd->pqm->process, q->device,
				-1, false, NULL, 0);

2403
	mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
2404

2405
	return retval;
2406

2407 2408
failed_try_destroy_debugged_queue:

2409
	dqm_unlock(dqm);
2410 2411 2412 2413 2414 2415 2416 2417 2418 2419 2420 2421 2422 2423 2424 2425 2426 2427
	return retval;
}

/*
 * Low bits must be 0000/FFFF as required by HW, high bits must be 0 to
 * stay in user mode.
 */
#define APE1_FIXED_BITS_MASK 0xFFFF80000000FFFFULL
/* APE1 limit is inclusive and 64K aligned. */
#define APE1_LIMIT_ALIGNMENT 0xFFFF

static bool set_cache_memory_policy(struct device_queue_manager *dqm,
				   struct qcm_process_device *qpd,
				   enum cache_policy default_policy,
				   enum cache_policy alternate_policy,
				   void __user *alternate_aperture_base,
				   uint64_t alternate_aperture_size)
{
2428 2429 2430 2431
	bool retval = true;

	if (!dqm->asic_ops.set_cache_memory_policy)
		return retval;
2432

2433
	dqm_lock(dqm);
2434 2435 2436 2437 2438 2439 2440 2441 2442 2443 2444 2445 2446 2447 2448 2449 2450 2451 2452

	if (alternate_aperture_size == 0) {
		/* base > limit disables APE1 */
		qpd->sh_mem_ape1_base = 1;
		qpd->sh_mem_ape1_limit = 0;
	} else {
		/*
		 * In FSA64, APE1_Base[63:0] = { 16{SH_MEM_APE1_BASE[31]},
		 *			SH_MEM_APE1_BASE[31:0], 0x0000 }
		 * APE1_Limit[63:0] = { 16{SH_MEM_APE1_LIMIT[31]},
		 *			SH_MEM_APE1_LIMIT[31:0], 0xFFFF }
		 * Verify that the base and size parameters can be
		 * represented in this format and convert them.
		 * Additionally restrict APE1 to user-mode addresses.
		 */

		uint64_t base = (uintptr_t)alternate_aperture_base;
		uint64_t limit = base + alternate_aperture_size - 1;

2453 2454 2455
		if (limit <= base || (base & APE1_FIXED_BITS_MASK) != 0 ||
		   (limit & APE1_FIXED_BITS_MASK) != APE1_LIMIT_ALIGNMENT) {
			retval = false;
2456
			goto out;
2457
		}
2458 2459 2460 2461 2462

		qpd->sh_mem_ape1_base = base >> 16;
		qpd->sh_mem_ape1_limit = limit >> 16;
	}

2463
	retval = dqm->asic_ops.set_cache_memory_policy(
2464 2465 2466 2467 2468 2469
			dqm,
			qpd,
			default_policy,
			alternate_policy,
			alternate_aperture_base,
			alternate_aperture_size);
2470

2471
	if ((dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) && (qpd->vmid != 0))
2472 2473
		program_sh_mem_settings(dqm, qpd);

2474
	pr_debug("sh_mem_config: 0x%x, ape1_base: 0x%x, ape1_limit: 0x%x\n",
2475 2476 2477 2478
		qpd->sh_mem_config, qpd->sh_mem_ape1_base,
		qpd->sh_mem_ape1_limit);

out:
2479
	dqm_unlock(dqm);
2480
	return retval;
2481 2482
}

2483 2484 2485
static int process_termination_nocpsch(struct device_queue_manager *dqm,
		struct qcm_process_device *qpd)
{
2486
	struct queue *q;
2487 2488
	struct device_process_node *cur, *next_dpn;
	int retval = 0;
2489
	bool found = false;
2490

2491
	dqm_lock(dqm);
2492 2493

	/* Clear all user mode queues */
2494 2495
	while (!list_empty(&qpd->queues_list)) {
		struct mqd_manager *mqd_mgr;
2496 2497
		int ret;

2498 2499 2500
		q = list_first_entry(&qpd->queues_list, struct queue, list);
		mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type(
				q->properties.type)];
2501 2502 2503
		ret = destroy_queue_nocpsch_locked(dqm, qpd, q);
		if (ret)
			retval = ret;
2504 2505 2506
		dqm_unlock(dqm);
		mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
		dqm_lock(dqm);
2507 2508 2509 2510 2511 2512 2513 2514
	}

	/* Unregister process */
	list_for_each_entry_safe(cur, next_dpn, &dqm->queues, list) {
		if (qpd == cur->qpd) {
			list_del(&cur->list);
			kfree(cur);
			dqm->processes_count--;
2515
			found = true;
2516 2517 2518 2519
			break;
		}
	}

2520
	dqm_unlock(dqm);
2521 2522 2523 2524 2525 2526 2527

	/* Outside the DQM lock because under the DQM lock we can't do
	 * reclaim or take other locks that others hold while reclaiming.
	 */
	if (found)
		kfd_dec_compute_active(dqm->dev);

2528 2529 2530
	return retval;
}

2531 2532 2533 2534 2535 2536
static int get_wave_state(struct device_queue_manager *dqm,
			  struct queue *q,
			  void __user *ctl_stack,
			  u32 *ctl_stack_used_size,
			  u32 *save_area_used_size)
{
2537
	struct mqd_manager *mqd_mgr;
2538 2539 2540

	dqm_lock(dqm);

2541
	mqd_mgr = dqm->mqd_mgrs[KFD_MQD_TYPE_CP];
2542

2543
	if (q->properties.type != KFD_QUEUE_TYPE_COMPUTE ||
2544
	    q->properties.is_active || !q->device->kfd->cwsr_enabled ||
2545 2546 2547
	    !mqd_mgr->get_wave_state) {
		dqm_unlock(dqm);
		return -EINVAL;
2548 2549 2550
	}

	dqm_unlock(dqm);
2551 2552 2553 2554 2555 2556

	/*
	 * get_wave_state is outside the dqm lock to prevent circular locking
	 * and the queue should be protected against destruction by the process
	 * lock.
	 */
2557 2558
	return mqd_mgr->get_wave_state(mqd_mgr, q->mqd, &q->properties,
			ctl_stack, ctl_stack_used_size, save_area_used_size);
2559
}
2560

2561 2562
static void get_queue_checkpoint_info(struct device_queue_manager *dqm,
			const struct queue *q,
2563 2564
			u32 *mqd_size,
			u32 *ctl_stack_size)
2565 2566 2567 2568 2569 2570 2571 2572
{
	struct mqd_manager *mqd_mgr;
	enum KFD_MQD_TYPE mqd_type =
			get_mqd_type_from_queue_type(q->properties.type);

	dqm_lock(dqm);
	mqd_mgr = dqm->mqd_mgrs[mqd_type];
	*mqd_size = mqd_mgr->mqd_size;
2573 2574 2575 2576
	*ctl_stack_size = 0;

	if (q->properties.type == KFD_QUEUE_TYPE_COMPUTE && mqd_mgr->get_checkpoint_info)
		mqd_mgr->get_checkpoint_info(mqd_mgr, q->mqd, ctl_stack_size);
2577 2578 2579 2580 2581 2582

	dqm_unlock(dqm);
}

static int checkpoint_mqd(struct device_queue_manager *dqm,
			  const struct queue *q,
2583 2584
			  void *mqd,
			  void *ctl_stack)
2585 2586 2587 2588 2589 2590 2591 2592
{
	struct mqd_manager *mqd_mgr;
	int r = 0;
	enum KFD_MQD_TYPE mqd_type =
			get_mqd_type_from_queue_type(q->properties.type);

	dqm_lock(dqm);

2593
	if (q->properties.is_active || !q->device->kfd->cwsr_enabled) {
2594 2595 2596 2597 2598 2599 2600 2601 2602 2603
		r = -EINVAL;
		goto dqm_unlock;
	}

	mqd_mgr = dqm->mqd_mgrs[mqd_type];
	if (!mqd_mgr->checkpoint_mqd) {
		r = -EOPNOTSUPP;
		goto dqm_unlock;
	}

2604
	mqd_mgr->checkpoint_mqd(mqd_mgr, q->mqd, mqd, ctl_stack);
2605 2606 2607 2608 2609 2610

dqm_unlock:
	dqm_unlock(dqm);
	return r;
}

2611 2612 2613 2614
static int process_termination_cpsch(struct device_queue_manager *dqm,
		struct qcm_process_device *qpd)
{
	int retval;
2615
	struct queue *q;
2616
	struct device *dev = dqm->dev->adev->dev;
2617
	struct kernel_queue *kq, *kq_next;
2618
	struct mqd_manager *mqd_mgr;
2619 2620 2621
	struct device_process_node *cur, *next_dpn;
	enum kfd_unmap_queues_filter filter =
		KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES;
2622
	bool found = false;
2623 2624 2625

	retval = 0;

2626
	dqm_lock(dqm);
2627 2628 2629 2630

	/* Clean all kernel queues */
	list_for_each_entry_safe(kq, kq_next, &qpd->priv_queue_list, list) {
		list_del(&kq->list);
2631
		decrement_queue_count(dqm, qpd, kq->queue);
2632 2633 2634 2635 2636 2637 2638
		qpd->is_debug = false;
		dqm->total_queue_count--;
		filter = KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES;
	}

	/* Clear all user mode queues */
	list_for_each_entry(q, &qpd->queues_list, list) {
2639
		if (q->properties.type == KFD_QUEUE_TYPE_SDMA)
2640
			deallocate_sdma_queue(dqm, q);
2641
		else if (q->properties.type == KFD_QUEUE_TYPE_SDMA_XGMI)
2642
			deallocate_sdma_queue(dqm, q);
2643

2644
		if (q->properties.is_active) {
2645
			decrement_queue_count(dqm, qpd, q);
2646

2647
			if (dqm->dev->kfd->shared_resources.enable_mes) {
2648 2649
				retval = remove_queue_mes(dqm, q, qpd);
				if (retval)
2650
					dev_err(dev, "Failed to remove queue %d\n",
2651 2652 2653 2654
						q->properties.queue_id);
			}
		}

2655 2656 2657 2658 2659 2660 2661 2662 2663
		dqm->total_queue_count--;
	}

	/* Unregister process */
	list_for_each_entry_safe(cur, next_dpn, &dqm->queues, list) {
		if (qpd == cur->qpd) {
			list_del(&cur->list);
			kfree(cur);
			dqm->processes_count--;
2664
			found = true;
2665 2666 2667 2668
			break;
		}
	}

2669
	if (!dqm->dev->kfd->shared_resources.enable_mes)
2670
		retval = execute_queues_cpsch(dqm, filter, 0, USE_DEFAULT_GRACE_PERIOD);
2671

2672 2673
	if ((retval || qpd->reset_wavefronts) &&
	    down_read_trylock(&dqm->dev->adev->reset_domain->sem)) {
2674 2675 2676
		pr_warn("Resetting wave fronts (cpsch) on dev %p\n", dqm->dev);
		dbgdev_wave_reset_wavefronts(dqm->dev, qpd->pqm->process);
		qpd->reset_wavefronts = false;
2677
		up_read(&dqm->dev->adev->reset_domain->sem);
2678 2679
	}

2680
	/* Lastly, free mqd resources.
2681
	 * Do free_mqd() after dqm_unlock to avoid circular locking.
2682
	 */
2683 2684
	while (!list_empty(&qpd->queues_list)) {
		q = list_first_entry(&qpd->queues_list, struct queue, list);
2685 2686
		mqd_mgr = dqm->mqd_mgrs[get_mqd_type_from_queue_type(
				q->properties.type)];
2687
		list_del(&q->list);
2688
		qpd->queue_count--;
2689
		dqm_unlock(dqm);
2690
		mqd_mgr->free_mqd(mqd_mgr, q->mqd, q->mqd_mem_obj);
2691
		dqm_lock(dqm);
2692
	}
2693 2694 2695 2696 2697 2698 2699
	dqm_unlock(dqm);

	/* Outside the DQM lock because under the DQM lock we can't do
	 * reclaim or take other locks that others hold while reclaiming.
	 */
	if (found)
		kfd_dec_compute_active(dqm->dev);
2700 2701 2702 2703

	return retval;
}

2704 2705 2706
static int init_mqd_managers(struct device_queue_manager *dqm)
{
	int i, j;
2707
	struct device *dev = dqm->dev->adev->dev;
2708 2709 2710 2711 2712
	struct mqd_manager *mqd_mgr;

	for (i = 0; i < KFD_MQD_TYPE_MAX; i++) {
		mqd_mgr = dqm->asic_ops.mqd_manager_init(i, dqm->dev);
		if (!mqd_mgr) {
2713
			dev_err(dev, "mqd manager [%d] initialization failed\n", i);
2714 2715 2716 2717 2718 2719 2720 2721 2722 2723 2724 2725 2726 2727 2728
			goto out_free;
		}
		dqm->mqd_mgrs[i] = mqd_mgr;
	}

	return 0;

out_free:
	for (j = 0; j < i; j++) {
		kfree(dqm->mqd_mgrs[j]);
		dqm->mqd_mgrs[j] = NULL;
	}

	return -ENOMEM;
}
2729 2730 2731 2732 2733

/* Allocate one hiq mqd (HWS) and all SDMA mqd in a continuous trunk*/
static int allocate_hiq_sdma_mqd(struct device_queue_manager *dqm)
{
	int retval;
2734
	struct kfd_node *dev = dqm->dev;
2735 2736
	struct kfd_mem_obj *mem_obj = &dqm->hiq_sdma_mqd;
	uint32_t size = dqm->mqd_mgrs[KFD_MQD_TYPE_SDMA]->mqd_size *
2737
		get_num_all_sdma_engines(dqm) *
2738
		dev->kfd->device_info.num_sdma_queues_per_engine +
2739
		(dqm->mqd_mgrs[KFD_MQD_TYPE_HIQ]->mqd_size *
2740
		NUM_XCC(dqm->dev->xcc_mask));
2741

2742
	retval = amdgpu_amdkfd_alloc_gtt_mem(dev->adev, size,
2743
		&(mem_obj->gtt_mem), &(mem_obj->gpu_addr),
2744
		(void *)&(mem_obj->cpu_ptr), false);
2745 2746 2747 2748

	return retval;
}

2749
struct device_queue_manager *device_queue_manager_init(struct kfd_node *dev)
2750 2751 2752
{
	struct device_queue_manager *dqm;

2753
	pr_debug("Loading device queue manager\n");
2754

2755
	dqm = kzalloc(sizeof(*dqm), GFP_KERNEL);
2756 2757 2758
	if (!dqm)
		return NULL;

2759
	switch (dev->adev->asic_type) {
2760 2761 2762 2763 2764 2765 2766 2767 2768 2769 2770 2771 2772 2773 2774
	/* HWS is not available on Hawaii. */
	case CHIP_HAWAII:
	/* HWS depends on CWSR for timely dequeue. CWSR is not
	 * available on Tonga.
	 *
	 * FIXME: This argument also applies to Kaveri.
	 */
	case CHIP_TONGA:
		dqm->sched_policy = KFD_SCHED_POLICY_NO_HWS;
		break;
	default:
		dqm->sched_policy = sched_policy;
		break;
	}

2775
	dqm->dev = dev;
2776
	switch (dqm->sched_policy) {
2777 2778 2779
	case KFD_SCHED_POLICY_HWS:
	case KFD_SCHED_POLICY_HWS_NO_OVERSUBSCRIPTION:
		/* initialize dqm for cp scheduling */
2780 2781 2782 2783
		dqm->ops.create_queue = create_queue_cpsch;
		dqm->ops.initialize = initialize_cpsch;
		dqm->ops.start = start_cpsch;
		dqm->ops.stop = stop_cpsch;
2784 2785
		dqm->ops.halt = halt_cpsch;
		dqm->ops.unhalt = unhalt_cpsch;
2786 2787
		dqm->ops.destroy_queue = destroy_queue_cpsch;
		dqm->ops.update_queue = update_queue;
2788 2789 2790
		dqm->ops.register_process = register_process;
		dqm->ops.unregister_process = unregister_process;
		dqm->ops.uninitialize = uninitialize;
2791 2792 2793
		dqm->ops.create_kernel_queue = create_kernel_queue_cpsch;
		dqm->ops.destroy_kernel_queue = destroy_kernel_queue_cpsch;
		dqm->ops.set_cache_memory_policy = set_cache_memory_policy;
2794
		dqm->ops.process_termination = process_termination_cpsch;
2795 2796
		dqm->ops.evict_process_queues = evict_process_queues_cpsch;
		dqm->ops.restore_process_queues = restore_process_queues_cpsch;
2797
		dqm->ops.get_wave_state = get_wave_state;
2798
		dqm->ops.reset_queues = reset_queues_cpsch;
2799 2800
		dqm->ops.get_queue_checkpoint_info = get_queue_checkpoint_info;
		dqm->ops.checkpoint_mqd = checkpoint_mqd;
2801 2802 2803
		break;
	case KFD_SCHED_POLICY_NO_HWS:
		/* initialize dqm for no cp scheduling */
2804 2805 2806 2807 2808
		dqm->ops.start = start_nocpsch;
		dqm->ops.stop = stop_nocpsch;
		dqm->ops.create_queue = create_queue_nocpsch;
		dqm->ops.destroy_queue = destroy_queue_nocpsch;
		dqm->ops.update_queue = update_queue;
2809 2810
		dqm->ops.register_process = register_process;
		dqm->ops.unregister_process = unregister_process;
2811
		dqm->ops.initialize = initialize_nocpsch;
2812
		dqm->ops.uninitialize = uninitialize;
2813
		dqm->ops.set_cache_memory_policy = set_cache_memory_policy;
2814
		dqm->ops.process_termination = process_termination_nocpsch;
2815 2816 2817
		dqm->ops.evict_process_queues = evict_process_queues_nocpsch;
		dqm->ops.restore_process_queues =
			restore_process_queues_nocpsch;
2818
		dqm->ops.get_wave_state = get_wave_state;
2819 2820
		dqm->ops.get_queue_checkpoint_info = get_queue_checkpoint_info;
		dqm->ops.checkpoint_mqd = checkpoint_mqd;
2821 2822
		break;
	default:
2823
		dev_err(dev->adev->dev, "Invalid scheduling policy %d\n", dqm->sched_policy);
2824
		goto out_free;
2825 2826
	}

2827
	switch (dev->adev->asic_type) {
2828
	case CHIP_KAVERI:
2829
	case CHIP_HAWAII:
2830
		device_queue_manager_init_cik(&dqm->asic_ops);
2831 2832
		break;

2833
	case CHIP_CARRIZO:
2834 2835 2836 2837
	case CHIP_TONGA:
	case CHIP_FIJI:
	case CHIP_POLARIS10:
	case CHIP_POLARIS11:
2838
	case CHIP_POLARIS12:
2839
	case CHIP_VEGAM:
2840
		device_queue_manager_init_vi(&dqm->asic_ops);
2841
		break;
2842

2843
	default:
2844 2845 2846
		if (KFD_GC_VERSION(dev) >= IP_VERSION(12, 0, 0))
			device_queue_manager_init_v12(&dqm->asic_ops);
		else if (KFD_GC_VERSION(dev) >= IP_VERSION(11, 0, 0))
2847 2848
			device_queue_manager_init_v11(&dqm->asic_ops);
		else if (KFD_GC_VERSION(dev) >= IP_VERSION(10, 1, 1))
2849
			device_queue_manager_init_v10(&dqm->asic_ops);
2850 2851 2852 2853
		else if (KFD_GC_VERSION(dev) >= IP_VERSION(9, 0, 1))
			device_queue_manager_init_v9(&dqm->asic_ops);
		else {
			WARN(1, "Unexpected ASIC family %u",
2854
			     dev->adev->asic_type);
2855 2856
			goto out_free;
		}
2857 2858
	}

2859 2860 2861
	if (init_mqd_managers(dqm))
		goto out_free;

2862
	if (!dev->kfd->shared_resources.enable_mes && allocate_hiq_sdma_mqd(dqm)) {
2863
		dev_err(dev->adev->dev, "Failed to allocate hiq sdma mqd trunk buffer\n");
2864 2865 2866
		goto out_free;
	}

2867 2868
	if (!dqm->ops.initialize(dqm)) {
		init_waitqueue_head(&dqm->destroy_wait);
2869
		return dqm;
2870
	}
2871

2872 2873 2874
out_free:
	kfree(dqm);
	return NULL;
2875 2876
}

2877
static void deallocate_hiq_sdma_mqd(struct kfd_node *dev,
2878
				    struct kfd_mem_obj *mqd)
2879 2880 2881
{
	WARN(!mqd, "No hiq sdma mqd trunk to free");

2882
	amdgpu_amdkfd_free_gtt_mem(dev->adev, &mqd->gtt_mem);
2883 2884
}

2885 2886
void device_queue_manager_uninit(struct device_queue_manager *dqm)
{
2887
	dqm->ops.stop(dqm);
2888
	dqm->ops.uninitialize(dqm);
2889
	if (!dqm->dev->kfd->shared_resources.enable_mes)
2890
		deallocate_hiq_sdma_mqd(dqm->dev, &dqm->hiq_sdma_mqd);
2891 2892
	kfree(dqm);
}
2893

2894
int kfd_dqm_evict_pasid(struct device_queue_manager *dqm, u32 pasid)
2895 2896 2897 2898 2899 2900 2901
{
	struct kfd_process_device *pdd;
	struct kfd_process *p = kfd_lookup_process_by_pasid(pasid);
	int ret = 0;

	if (!p)
		return -EINVAL;
2902
	WARN(debug_evictions, "Evicting pid %d", p->lead_thread->pid);
2903 2904 2905 2906 2907 2908 2909 2910
	pdd = kfd_get_process_device_data(dqm->dev, p);
	if (pdd)
		ret = dqm->ops.evict_process_queues(dqm, &pdd->qpd);
	kfd_unref_process(p);

	return ret;
}

2911 2912 2913 2914
static void kfd_process_hw_exception(struct work_struct *work)
{
	struct device_queue_manager *dqm = container_of(work,
			struct device_queue_manager, hw_exception_work);
2915
	amdgpu_amdkfd_gpu_reset(dqm->dev->adev);
2916 2917
}

2918 2919 2920 2921
int reserve_debug_trap_vmid(struct device_queue_manager *dqm,
				struct qcm_process_device *qpd)
{
	int r;
2922
	struct device *dev = dqm->dev->adev->dev;
2923 2924 2925
	int updated_vmid_mask;

	if (dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) {
2926
		dev_err(dev, "Unsupported on sched_policy: %i\n", dqm->sched_policy);
2927 2928 2929 2930 2931 2932
		return -EINVAL;
	}

	dqm_lock(dqm);

	if (dqm->trap_debug_vmid != 0) {
2933
		dev_err(dev, "Trap debug id already reserved\n");
2934 2935 2936 2937 2938 2939 2940 2941 2942 2943 2944 2945 2946 2947 2948 2949 2950 2951 2952 2953 2954 2955 2956 2957 2958 2959 2960 2961 2962 2963 2964 2965 2966 2967 2968
		r = -EBUSY;
		goto out_unlock;
	}

	r = unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0,
			USE_DEFAULT_GRACE_PERIOD, false);
	if (r)
		goto out_unlock;

	updated_vmid_mask = dqm->dev->kfd->shared_resources.compute_vmid_bitmap;
	updated_vmid_mask &= ~(1 << dqm->dev->vm_info.last_vmid_kfd);

	dqm->dev->kfd->shared_resources.compute_vmid_bitmap = updated_vmid_mask;
	dqm->trap_debug_vmid = dqm->dev->vm_info.last_vmid_kfd;
	r = set_sched_resources(dqm);
	if (r)
		goto out_unlock;

	r = map_queues_cpsch(dqm);
	if (r)
		goto out_unlock;

	pr_debug("Reserved VMID for trap debug: %i\n", dqm->trap_debug_vmid);

out_unlock:
	dqm_unlock(dqm);
	return r;
}

/*
 * Releases vmid for the trap debugger
 */
int release_debug_trap_vmid(struct device_queue_manager *dqm,
			struct qcm_process_device *qpd)
{
2969
	struct device *dev = dqm->dev->adev->dev;
2970 2971 2972 2973 2974
	int r;
	int updated_vmid_mask;
	uint32_t trap_debug_vmid;

	if (dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) {
2975
		dev_err(dev, "Unsupported on sched_policy: %i\n", dqm->sched_policy);
2976 2977 2978 2979 2980 2981
		return -EINVAL;
	}

	dqm_lock(dqm);
	trap_debug_vmid = dqm->trap_debug_vmid;
	if (dqm->trap_debug_vmid == 0) {
2982
		dev_err(dev, "Trap debug id is not reserved\n");
2983 2984 2985 2986 2987 2988 2989 2990 2991 2992 2993 2994 2995 2996 2997 2998 2999 3000 3001 3002 3003 3004 3005 3006 3007 3008 3009 3010 3011
		r = -EINVAL;
		goto out_unlock;
	}

	r = unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0,
			USE_DEFAULT_GRACE_PERIOD, false);
	if (r)
		goto out_unlock;

	updated_vmid_mask = dqm->dev->kfd->shared_resources.compute_vmid_bitmap;
	updated_vmid_mask |= (1 << dqm->dev->vm_info.last_vmid_kfd);

	dqm->dev->kfd->shared_resources.compute_vmid_bitmap = updated_vmid_mask;
	dqm->trap_debug_vmid = 0;
	r = set_sched_resources(dqm);
	if (r)
		goto out_unlock;

	r = map_queues_cpsch(dqm);
	if (r)
		goto out_unlock;

	pr_debug("Released VMID for trap debug: %i\n", trap_debug_vmid);

out_unlock:
	dqm_unlock(dqm);
	return r;
}

3012 3013 3014 3015 3016 3017 3018 3019 3020 3021 3022 3023 3024 3025 3026 3027 3028 3029 3030 3031 3032 3033 3034 3035 3036 3037 3038 3039 3040 3041 3042 3043 3044 3045 3046 3047 3048 3049 3050 3051 3052 3053 3054 3055 3056 3057 3058 3059 3060 3061 3062 3063 3064 3065 3066 3067 3068 3069 3070 3071 3072 3073 3074 3075 3076 3077 3078 3079 3080 3081 3082 3083 3084 3085 3086 3087 3088 3089 3090 3091 3092 3093 3094
#define QUEUE_NOT_FOUND		-1
/* invalidate queue operation in array */
static void q_array_invalidate(uint32_t num_queues, uint32_t *queue_ids)
{
	int i;

	for (i = 0; i < num_queues; i++)
		queue_ids[i] |= KFD_DBG_QUEUE_INVALID_MASK;
}

/* find queue index in array */
static int q_array_get_index(unsigned int queue_id,
		uint32_t num_queues,
		uint32_t *queue_ids)
{
	int i;

	for (i = 0; i < num_queues; i++)
		if (queue_id == (queue_ids[i] & ~KFD_DBG_QUEUE_INVALID_MASK))
			return i;

	return QUEUE_NOT_FOUND;
}

struct copy_context_work_handler_workarea {
	struct work_struct copy_context_work;
	struct kfd_process *p;
};

static void copy_context_work_handler (struct work_struct *work)
{
	struct copy_context_work_handler_workarea *workarea;
	struct mqd_manager *mqd_mgr;
	struct queue *q;
	struct mm_struct *mm;
	struct kfd_process *p;
	uint32_t tmp_ctl_stack_used_size, tmp_save_area_used_size;
	int i;

	workarea = container_of(work,
			struct copy_context_work_handler_workarea,
			copy_context_work);

	p = workarea->p;
	mm = get_task_mm(p->lead_thread);

	if (!mm)
		return;

	kthread_use_mm(mm);
	for (i = 0; i < p->n_pdds; i++) {
		struct kfd_process_device *pdd = p->pdds[i];
		struct device_queue_manager *dqm = pdd->dev->dqm;
		struct qcm_process_device *qpd = &pdd->qpd;

		list_for_each_entry(q, &qpd->queues_list, list) {
			mqd_mgr = dqm->mqd_mgrs[KFD_MQD_TYPE_CP];

			/* We ignore the return value from get_wave_state
			 * because
			 * i) right now, it always returns 0, and
			 * ii) if we hit an error, we would continue to the
			 *      next queue anyway.
			 */
			mqd_mgr->get_wave_state(mqd_mgr,
					q->mqd,
					&q->properties,
					(void __user *)	q->properties.ctx_save_restore_area_address,
					&tmp_ctl_stack_used_size,
					&tmp_save_area_used_size);
		}
	}
	kthread_unuse_mm(mm);
	mmput(mm);
}

static uint32_t *get_queue_ids(uint32_t num_queues, uint32_t *usr_queue_id_array)
{
	size_t array_size = num_queues * sizeof(uint32_t);

	if (!usr_queue_id_array)
		return NULL;

3095
	return memdup_user(usr_queue_id_array, array_size);
3096 3097 3098 3099 3100 3101 3102 3103 3104 3105 3106 3107 3108 3109 3110 3111 3112 3113 3114 3115 3116 3117 3118
}

int resume_queues(struct kfd_process *p,
		uint32_t num_queues,
		uint32_t *usr_queue_id_array)
{
	uint32_t *queue_ids = NULL;
	int total_resumed = 0;
	int i;

	if (usr_queue_id_array) {
		queue_ids = get_queue_ids(num_queues, usr_queue_id_array);

		if (IS_ERR(queue_ids))
			return PTR_ERR(queue_ids);

		/* mask all queues as invalid.  unmask per successful request */
		q_array_invalidate(num_queues, queue_ids);
	}

	for (i = 0; i < p->n_pdds; i++) {
		struct kfd_process_device *pdd = p->pdds[i];
		struct device_queue_manager *dqm = pdd->dev->dqm;
3119
		struct device *dev = dqm->dev->adev->dev;
3120 3121 3122 3123 3124 3125 3126 3127 3128 3129 3130 3131 3132 3133 3134 3135 3136 3137 3138 3139 3140 3141 3142 3143 3144 3145 3146 3147 3148 3149 3150 3151 3152 3153 3154 3155 3156 3157 3158 3159 3160 3161 3162 3163 3164 3165 3166 3167 3168 3169
		struct qcm_process_device *qpd = &pdd->qpd;
		struct queue *q;
		int r, per_device_resumed = 0;

		dqm_lock(dqm);

		/* unmask queues that resume or already resumed as valid */
		list_for_each_entry(q, &qpd->queues_list, list) {
			int q_idx = QUEUE_NOT_FOUND;

			if (queue_ids)
				q_idx = q_array_get_index(
						q->properties.queue_id,
						num_queues,
						queue_ids);

			if (!queue_ids || q_idx != QUEUE_NOT_FOUND) {
				int err = resume_single_queue(dqm, &pdd->qpd, q);

				if (queue_ids) {
					if (!err) {
						queue_ids[q_idx] &=
							~KFD_DBG_QUEUE_INVALID_MASK;
					} else {
						queue_ids[q_idx] |=
							KFD_DBG_QUEUE_ERROR_MASK;
						break;
					}
				}

				if (dqm->dev->kfd->shared_resources.enable_mes) {
					wake_up_all(&dqm->destroy_wait);
					if (!err)
						total_resumed++;
				} else {
					per_device_resumed++;
				}
			}
		}

		if (!per_device_resumed) {
			dqm_unlock(dqm);
			continue;
		}

		r = execute_queues_cpsch(dqm,
					KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES,
					0,
					USE_DEFAULT_GRACE_PERIOD);
		if (r) {
3170
			dev_err(dev, "Failed to resume process queues\n");
3171 3172 3173 3174 3175 3176 3177 3178 3179 3180 3181 3182 3183 3184 3185 3186 3187 3188 3189 3190 3191 3192 3193 3194 3195 3196 3197 3198 3199 3200 3201 3202 3203 3204 3205 3206 3207 3208 3209 3210 3211 3212 3213 3214 3215 3216 3217 3218 3219 3220 3221
			if (queue_ids) {
				list_for_each_entry(q, &qpd->queues_list, list) {
					int q_idx = q_array_get_index(
							q->properties.queue_id,
							num_queues,
							queue_ids);

					/* mask queue as error on resume fail */
					if (q_idx != QUEUE_NOT_FOUND)
						queue_ids[q_idx] |=
							KFD_DBG_QUEUE_ERROR_MASK;
				}
			}
		} else {
			wake_up_all(&dqm->destroy_wait);
			total_resumed += per_device_resumed;
		}

		dqm_unlock(dqm);
	}

	if (queue_ids) {
		if (copy_to_user((void __user *)usr_queue_id_array, queue_ids,
				num_queues * sizeof(uint32_t)))
			pr_err("copy_to_user failed on queue resume\n");

		kfree(queue_ids);
	}

	return total_resumed;
}

int suspend_queues(struct kfd_process *p,
			uint32_t num_queues,
			uint32_t grace_period,
			uint64_t exception_clear_mask,
			uint32_t *usr_queue_id_array)
{
	uint32_t *queue_ids = get_queue_ids(num_queues, usr_queue_id_array);
	int total_suspended = 0;
	int i;

	if (IS_ERR(queue_ids))
		return PTR_ERR(queue_ids);

	/* mask all queues as invalid.  umask on successful request */
	q_array_invalidate(num_queues, queue_ids);

	for (i = 0; i < p->n_pdds; i++) {
		struct kfd_process_device *pdd = p->pdds[i];
		struct device_queue_manager *dqm = pdd->dev->dqm;
3222
		struct device *dev = dqm->dev->adev->dev;
3223 3224 3225 3226 3227 3228 3229 3230 3231 3232 3233 3234 3235 3236 3237 3238 3239 3240 3241 3242 3243 3244 3245 3246 3247 3248 3249 3250 3251 3252 3253 3254 3255 3256 3257 3258 3259 3260 3261 3262 3263 3264 3265 3266 3267 3268 3269 3270
		struct qcm_process_device *qpd = &pdd->qpd;
		struct queue *q;
		int r, per_device_suspended = 0;

		mutex_lock(&p->event_mutex);
		dqm_lock(dqm);

		/* unmask queues that suspend or already suspended */
		list_for_each_entry(q, &qpd->queues_list, list) {
			int q_idx = q_array_get_index(q->properties.queue_id,
							num_queues,
							queue_ids);

			if (q_idx != QUEUE_NOT_FOUND) {
				int err = suspend_single_queue(dqm, pdd, q);
				bool is_mes = dqm->dev->kfd->shared_resources.enable_mes;

				if (!err) {
					queue_ids[q_idx] &= ~KFD_DBG_QUEUE_INVALID_MASK;
					if (exception_clear_mask && is_mes)
						q->properties.exception_status &=
							~exception_clear_mask;

					if (is_mes)
						total_suspended++;
					else
						per_device_suspended++;
				} else if (err != -EBUSY) {
					r = err;
					queue_ids[q_idx] |= KFD_DBG_QUEUE_ERROR_MASK;
					break;
				}
			}
		}

		if (!per_device_suspended) {
			dqm_unlock(dqm);
			mutex_unlock(&p->event_mutex);
			if (total_suspended)
				amdgpu_amdkfd_debug_mem_fence(dqm->dev->adev);
			continue;
		}

		r = execute_queues_cpsch(dqm,
			KFD_UNMAP_QUEUES_FILTER_DYNAMIC_QUEUES, 0,
			grace_period);

		if (r)
3271
			dev_err(dev, "Failed to suspend process queues.\n");
3272 3273 3274 3275 3276 3277 3278 3279 3280 3281 3282 3283 3284 3285 3286 3287 3288 3289 3290 3291 3292 3293 3294 3295 3296 3297 3298 3299 3300 3301 3302 3303 3304 3305 3306 3307 3308 3309 3310 3311 3312 3313 3314 3315 3316 3317 3318 3319
		else
			total_suspended += per_device_suspended;

		list_for_each_entry(q, &qpd->queues_list, list) {
			int q_idx = q_array_get_index(q->properties.queue_id,
						num_queues, queue_ids);

			if (q_idx == QUEUE_NOT_FOUND)
				continue;

			/* mask queue as error on suspend fail */
			if (r)
				queue_ids[q_idx] |= KFD_DBG_QUEUE_ERROR_MASK;
			else if (exception_clear_mask)
				q->properties.exception_status &=
							~exception_clear_mask;
		}

		dqm_unlock(dqm);
		mutex_unlock(&p->event_mutex);
		amdgpu_device_flush_hdp(dqm->dev->adev, NULL);
	}

	if (total_suspended) {
		struct copy_context_work_handler_workarea copy_context_worker;

		INIT_WORK_ONSTACK(
				&copy_context_worker.copy_context_work,
				copy_context_work_handler);

		copy_context_worker.p = p;

		schedule_work(&copy_context_worker.copy_context_work);


		flush_work(&copy_context_worker.copy_context_work);
		destroy_work_on_stack(&copy_context_worker.copy_context_work);
	}

	if (copy_to_user((void __user *)usr_queue_id_array, queue_ids,
			num_queues * sizeof(uint32_t)))
		pr_err("copy_to_user failed on queue suspend\n");

	kfree(queue_ids);

	return total_suspended;
}

3320 3321 3322 3323 3324 3325 3326 3327 3328 3329 3330 3331 3332 3333 3334 3335 3336 3337 3338 3339 3340 3341 3342 3343 3344 3345 3346 3347 3348 3349 3350 3351 3352 3353 3354 3355
static uint32_t set_queue_type_for_user(struct queue_properties *q_props)
{
	switch (q_props->type) {
	case KFD_QUEUE_TYPE_COMPUTE:
		return q_props->format == KFD_QUEUE_FORMAT_PM4
					? KFD_IOC_QUEUE_TYPE_COMPUTE
					: KFD_IOC_QUEUE_TYPE_COMPUTE_AQL;
	case KFD_QUEUE_TYPE_SDMA:
		return KFD_IOC_QUEUE_TYPE_SDMA;
	case KFD_QUEUE_TYPE_SDMA_XGMI:
		return KFD_IOC_QUEUE_TYPE_SDMA_XGMI;
	default:
		WARN_ONCE(true, "queue type not recognized!");
		return 0xffffffff;
	};
}

void set_queue_snapshot_entry(struct queue *q,
			      uint64_t exception_clear_mask,
			      struct kfd_queue_snapshot_entry *qss_entry)
{
	qss_entry->ring_base_address = q->properties.queue_address;
	qss_entry->write_pointer_address = (uint64_t)q->properties.write_ptr;
	qss_entry->read_pointer_address = (uint64_t)q->properties.read_ptr;
	qss_entry->ctx_save_restore_address =
				q->properties.ctx_save_restore_area_address;
	qss_entry->ctx_save_restore_area_size =
				q->properties.ctx_save_restore_area_size;
	qss_entry->exception_status = q->properties.exception_status;
	qss_entry->queue_id = q->properties.queue_id;
	qss_entry->gpu_id = q->device->id;
	qss_entry->ring_size = (uint32_t)q->properties.queue_size;
	qss_entry->queue_type = set_queue_type_for_user(&q->properties);
	q->properties.exception_status &= ~exception_clear_mask;
}

3356 3357
int debug_lock_and_unmap(struct device_queue_manager *dqm)
{
3358
	struct device *dev = dqm->dev->adev->dev;
3359 3360 3361
	int r;

	if (dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) {
3362
		dev_err(dev, "Unsupported on sched_policy: %i\n", dqm->sched_policy);
3363 3364 3365 3366 3367 3368 3369 3370 3371 3372 3373 3374 3375 3376 3377 3378 3379
		return -EINVAL;
	}

	if (!kfd_dbg_is_per_vmid_supported(dqm->dev))
		return 0;

	dqm_lock(dqm);

	r = unmap_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES, 0, 0, false);
	if (r)
		dqm_unlock(dqm);

	return r;
}

int debug_map_and_unlock(struct device_queue_manager *dqm)
{
3380
	struct device *dev = dqm->dev->adev->dev;
3381 3382 3383
	int r;

	if (dqm->sched_policy == KFD_SCHED_POLICY_NO_HWS) {
3384
		dev_err(dev, "Unsupported on sched_policy: %i\n", dqm->sched_policy);
3385 3386 3387 3388 3389 3390 3391 3392 3393 3394 3395 3396 3397 3398 3399 3400 3401 3402 3403 3404 3405 3406 3407
		return -EINVAL;
	}

	if (!kfd_dbg_is_per_vmid_supported(dqm->dev))
		return 0;

	r = map_queues_cpsch(dqm);

	dqm_unlock(dqm);

	return r;
}

int debug_refresh_runlist(struct device_queue_manager *dqm)
{
	int r = debug_lock_and_unmap(dqm);

	if (r)
		return r;

	return debug_map_and_unlock(dqm);
}

3408 3409 3410 3411 3412 3413 3414 3415 3416 3417 3418 3419 3420 3421 3422 3423 3424 3425 3426 3427 3428 3429 3430 3431 3432 3433
#if defined(CONFIG_DEBUG_FS)

static void seq_reg_dump(struct seq_file *m,
			 uint32_t (*dump)[2], uint32_t n_regs)
{
	uint32_t i, count;

	for (i = 0, count = 0; i < n_regs; i++) {
		if (count == 0 ||
		    dump[i-1][0] + sizeof(uint32_t) != dump[i][0]) {
			seq_printf(m, "%s    %08x: %08x",
				   i ? "\n" : "",
				   dump[i][0], dump[i][1]);
			count = 7;
		} else {
			seq_printf(m, " %08x", dump[i][1]);
			count--;
		}
	}

	seq_puts(m, "\n");
}

int dqm_debugfs_hqds(struct seq_file *m, void *data)
{
	struct device_queue_manager *dqm = data;
3434
	uint32_t xcc_mask = dqm->dev->xcc_mask;
3435 3436
	uint32_t (*dump)[2], n_regs;
	int pipe, queue;
3437
	int r = 0, xcc_id;
3438
	uint32_t sdma_engine_start;
3439

3440
	if (!dqm->sched_running) {
3441
		seq_puts(m, " Device is stopped\n");
3442 3443 3444
		return 0;
	}

3445
	for_each_inst(xcc_id, xcc_mask) {
3446
		r = dqm->dev->kfd2kgd->hqd_dump(dqm->dev->adev,
3447 3448 3449
						KFD_CIK_HIQ_PIPE,
						KFD_CIK_HIQ_QUEUE, &dump,
						&n_regs, xcc_id);
3450
		if (!r) {
3451 3452
			seq_printf(
				m,
3453
				"   Inst %d, HIQ on MEC %d Pipe %d Queue %d\n",
3454 3455 3456
				xcc_id,
				KFD_CIK_HIQ_PIPE / get_pipes_per_mec(dqm) + 1,
				KFD_CIK_HIQ_PIPE % get_pipes_per_mec(dqm),
3457 3458
				KFD_CIK_HIQ_QUEUE);
			seq_reg_dump(m, dump, n_regs);
Oak Zeng's avatar
Oak Zeng committed
3459

3460 3461
			kfree(dump);
		}
Oak Zeng's avatar
Oak Zeng committed
3462

3463 3464
		for (pipe = 0; pipe < get_pipes_per_mec(dqm); pipe++) {
			int pipe_offset = pipe * get_queues_per_pipe(dqm);
3465

3466 3467
			for (queue = 0; queue < get_queues_per_pipe(dqm); queue++) {
				if (!test_bit(pipe_offset + queue,
3468
				      dqm->dev->kfd->shared_resources.cp_queue_bitmap))
3469
					continue;
3470

3471 3472 3473 3474
				r = dqm->dev->kfd2kgd->hqd_dump(dqm->dev->adev,
								pipe, queue,
								&dump, &n_regs,
								xcc_id);
3475 3476
				if (r)
					break;
3477

3478 3479 3480
				seq_printf(m,
					   " Inst %d,  CP Pipe %d, Queue %d\n",
					   xcc_id, pipe, queue);
3481
				seq_reg_dump(m, dump, n_regs);
3482

3483 3484
				kfree(dump);
			}
3485 3486 3487
		}
	}

3488 3489 3490 3491
	sdma_engine_start = dqm->dev->node_id * get_num_all_sdma_engines(dqm);
	for (pipe = sdma_engine_start;
	     pipe < (sdma_engine_start + get_num_all_sdma_engines(dqm));
	     pipe++) {
3492
		for (queue = 0;
3493
		     queue < dqm->dev->kfd->device_info.num_sdma_queues_per_engine;
3494
		     queue++) {
3495
			r = dqm->dev->kfd2kgd->hqd_sdma_dump(
3496
				dqm->dev->adev, pipe, queue, &dump, &n_regs);
3497 3498 3499 3500 3501 3502 3503 3504 3505 3506 3507 3508 3509 3510
			if (r)
				break;

			seq_printf(m, "  SDMA Engine %d, RLC %d\n",
				  pipe, queue);
			seq_reg_dump(m, dump, n_regs);

			kfree(dump);
		}
	}

	return r;
}

3511
int dqm_debugfs_hang_hws(struct device_queue_manager *dqm)
3512 3513 3514 3515
{
	int r = 0;

	dqm_lock(dqm);
3516 3517 3518 3519 3520
	r = pm_debugfs_hang_hws(&dqm->packet_mgr);
	if (r) {
		dqm_unlock(dqm);
		return r;
	}
3521
	dqm->active_runlist = true;
3522 3523
	r = execute_queues_cpsch(dqm, KFD_UNMAP_QUEUES_FILTER_ALL_QUEUES,
				0, USE_DEFAULT_GRACE_PERIOD);
3524 3525 3526 3527 3528
	dqm_unlock(dqm);

	return r;
}

3529
#endif