svn commit: r365577 - in head/sys: dev/iommu x86/iommu

Ruslan Bukin br at FreeBSD.org
Thu Sep 10 14:12:26 UTC 2020


Author: br
Date: Thu Sep 10 14:12:25 2020
New Revision: 365577
URL: https://svnweb.freebsd.org/changeset/base/365577

Log:
  Move the rid variable to the generic iommu context.
  It could be used in various IOMMU platforms, not only DMAR.
  
  Reviewed by:	kib
  Sponsored by:	DARPA, AFRL
  Differential Revision:	https://reviews.freebsd.org/D26373

Modified:
  head/sys/dev/iommu/iommu.h
  head/sys/x86/iommu/intel_ctx.c
  head/sys/x86/iommu/intel_dmar.h

Modified: head/sys/dev/iommu/iommu.h
==============================================================================
--- head/sys/dev/iommu/iommu.h	Thu Sep 10 14:11:29 2020	(r365576)
+++ head/sys/dev/iommu/iommu.h	Thu Sep 10 14:12:25 2020	(r365577)
@@ -135,6 +135,7 @@ struct iommu_ctx {
 	u_long loads;			/* atomic updates, for stat only */
 	u_long unloads;			/* same */
 	u_int flags;			/* (u) */
+	uint16_t rid;			/* (c) pci RID */
 };
 
 /* struct iommu_ctx flags */

Modified: head/sys/x86/iommu/intel_ctx.c
==============================================================================
--- head/sys/x86/iommu/intel_ctx.c	Thu Sep 10 14:11:29 2020	(r365576)
+++ head/sys/x86/iommu/intel_ctx.c	Thu Sep 10 14:12:25 2020	(r365577)
@@ -118,9 +118,9 @@ dmar_map_ctx_entry(struct dmar_ctx *ctx, struct sf_buf
 
 	dmar = CTX2DMAR(ctx);
 
-	ctxp = dmar_map_pgtbl(dmar->ctx_obj, 1 +
-	    PCI_RID2BUS(ctx->rid), IOMMU_PGF_NOALLOC | IOMMU_PGF_WAITOK, sfp);
-	ctxp += ctx->rid & 0xff;
+	ctxp = dmar_map_pgtbl(dmar->ctx_obj, 1 + PCI_RID2BUS(ctx->context.rid),
+	    IOMMU_PGF_NOALLOC | IOMMU_PGF_WAITOK, sfp);
+	ctxp += ctx->context.rid & 0xff;
 	return (ctxp);
 }
 
@@ -386,7 +386,7 @@ dmar_ctx_alloc(struct dmar_domain *domain, uint16_t ri
 	ctx->context.domain = DOM2IODOM(domain);
 	ctx->context.tag = malloc(sizeof(struct bus_dma_tag_iommu),
 	    M_DMAR_CTX, M_WAITOK | M_ZERO);
-	ctx->rid = rid;
+	ctx->context.rid = rid;
 	ctx->refs = 1;
 	return (ctx);
 }
@@ -643,8 +643,9 @@ dmar_move_ctx_to_domain(struct dmar_domain *domain, st
 	error = dmar_flush_for_ctx_entry(dmar, true);
 	/* If flush failed, rolling back would not work as well. */
 	printf("dmar%d rid %x domain %d->%d %s-mapped\n",
-	    dmar->iommu.unit, ctx->rid, old_domain->domain, domain->domain,
-	    (domain->iodom.flags & IOMMU_DOMAIN_IDMAP) != 0 ? "id" : "re");
+	    dmar->iommu.unit, ctx->context.rid, old_domain->domain,
+	    domain->domain, (domain->iodom.flags & IOMMU_DOMAIN_IDMAP) != 0 ?
+	    "id" : "re");
 	dmar_unref_domain_locked(dmar, old_domain);
 	TD_PINNED_ASSERT;
 	return (error);
@@ -776,7 +777,7 @@ dmar_find_ctx_locked(struct dmar_unit *dmar, uint16_t 
 
 	LIST_FOREACH(domain, &dmar->domains, link) {
 		LIST_FOREACH(ctx, &domain->contexts, link) {
-			if (ctx->rid == rid)
+			if (ctx->context.rid == rid)
 				return (ctx);
 		}
 	}

Modified: head/sys/x86/iommu/intel_dmar.h
==============================================================================
--- head/sys/x86/iommu/intel_dmar.h	Thu Sep 10 14:11:29 2020	(r365576)
+++ head/sys/x86/iommu/intel_dmar.h	Thu Sep 10 14:12:25 2020	(r365577)
@@ -75,7 +75,6 @@ struct dmar_domain {
 
 struct dmar_ctx {
 	struct iommu_ctx context;
-	uint16_t rid;			/* (c) pci RID */
 	uint64_t last_fault_rec[2];	/* Last fault reported */
 	LIST_ENTRY(dmar_ctx) link;	/* (u) Member in the domain list */
 	u_int refs;			/* (u) References from tags */


More information about the svn-src-head mailing list