Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit b1db5513 authored by Christophe Lombard's avatar Christophe Lombard Committed by Michael Ellerman
Browse files

cxl: Add support for ASB_Notify on POWER9



The POWER9 core supports a new feature: ASB_Notify which requires the
support of the Special Purpose Register: TIDR.

The ASB_Notify command, generated by the AFU, will attempt to
wake-up the host thread identified by the particular LPID:PID:TID.

This patch assign a unique TIDR (thread id) for the current thread which
will be used in the process element entry.

Signed-off-by: default avatarChristophe Lombard <clombard@linux.vnet.ibm.com>
Reviewed-by: default avatarPhilippe Bergheaud <felix@linux.vnet.ibm.com>
Acked-by: default avatarFrederic Barrat <fbarrat@linux.vnet.ibm.com>
Reviewed-by: default avatarVaibhav Jain <vaibhav@linux.vnet.ibm.com>
Acked-by: default avatarAndrew Donnellan <andrew.donnellan@au1.ibm.com>
Signed-off-by: default avatarMichael Ellerman <mpe@ellerman.id.au>
parent 074db39e
Loading
Loading
Loading
Loading
+1 −0
Original line number Diff line number Diff line
@@ -1590,6 +1590,7 @@ int set_thread_tidr(struct task_struct *t)

	return 0;
}
EXPORT_SYMBOL_GPL(set_thread_tidr);

#endif /* CONFIG_PPC64 */

+2 −0
Original line number Diff line number Diff line
@@ -45,6 +45,8 @@ int cxl_context_init(struct cxl_context *ctx, struct cxl_afu *afu, bool master)
	ctx->pid = NULL; /* Set in start work ioctl */
	mutex_init(&ctx->mapping_lock);
	ctx->mapping = NULL;
	ctx->tidr = 0;
	ctx->assign_tidr = false;

	if (cxl_is_power8()) {
		spin_lock_init(&ctx->sste_lock);
+3 −0
Original line number Diff line number Diff line
@@ -630,6 +630,9 @@ struct cxl_context {
	struct list_head extra_irq_contexts;

	struct mm_struct *mm;

	u16 tidr;
	bool assign_tidr;
};

struct cxl_irq_info;
+2 −1
Original line number Diff line number Diff line
@@ -199,10 +199,11 @@ int cxllib_get_PE_attributes(struct task_struct *task,
		 */
		attr->pid = mm->context.id;
		mmput(mm);
		attr->tid = task->thread.tidr;
	} else {
		attr->pid = 0;
	}
		attr->tid = 0;
	}
	return 0;
}
EXPORT_SYMBOL_GPL(cxllib_get_PE_attributes);
+13 −2
Original line number Diff line number Diff line
@@ -173,7 +173,7 @@ static long afu_ioctl_start_work(struct cxl_context *ctx,
	 * flags are set it's invalid
	 */
	if (work.reserved1 || work.reserved2 || work.reserved3 ||
	    work.reserved4 || work.reserved5 || work.reserved6 ||
	    work.reserved4 || work.reserved5 ||
	    (work.flags & ~CXL_START_WORK_ALL)) {
		rc = -EINVAL;
		goto out;
@@ -186,12 +186,16 @@ static long afu_ioctl_start_work(struct cxl_context *ctx,
		rc =  -EINVAL;
		goto out;
	}

	if ((rc = afu_register_irqs(ctx, work.num_interrupts)))
		goto out;

	if (work.flags & CXL_START_WORK_AMR)
		amr = work.amr & mfspr(SPRN_UAMOR);

	if (work.flags & CXL_START_WORK_TID)
		ctx->assign_tidr = true;

	ctx->mmio_err_ff = !!(work.flags & CXL_START_WORK_ERR_FF);

	/*
@@ -263,8 +267,15 @@ static long afu_ioctl_start_work(struct cxl_context *ctx,
		goto out;
	}

	ctx->status = STARTED;
	rc = 0;
	if (work.flags & CXL_START_WORK_TID) {
		work.tid = ctx->tidr;
		if (copy_to_user(uwork, &work, sizeof(work)))
			rc = -EFAULT;
	}

	ctx->status = STARTED;

out:
	mutex_unlock(&ctx->status_mutex);
	return rc;
Loading