Skip site navigation (1)Skip section navigation (2)
Date:      Sun, 26 Mar 2017 00:40:35 +0000 (UTC)
From:      Konstantin Belousov <kib@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r315968 - head/sys/x86/iommu
Message-ID:  <201703260040.v2Q0eZSd072270@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: kib
Date: Sun Mar 26 00:40:35 2017
New Revision: 315968
URL: https://svnweb.freebsd.org/changeset/base/315968

Log:
  Provide less laborius way to enable busdma DMAR to only short list of devices.
  
  Kernel environment variable hw.busdma.default can take values 'bounce'
  and 'dmar' and selects corresponding busdma backend as default.
  Per-device environment variable hw.busdma.pci<domain>.<bus>.<slot>.<func>
  takes the same values and overrides hw.busdma.default for the given device.
  
  Note that even with hw.busdma.default=bounce, DMA translation engines
  are still started if DMARs are enabled, to disable them use
  hw.dmar.dma tunable, as before.
  
  Sponsored by:	The FreeBSD Foundation
  MFC after: 1 week

Modified:
  head/sys/x86/iommu/busdma_dmar.c

Modified: head/sys/x86/iommu/busdma_dmar.c
==============================================================================
--- head/sys/x86/iommu/busdma_dmar.c	Sat Mar 25 22:58:37 2017	(r315967)
+++ head/sys/x86/iommu/busdma_dmar.c	Sun Mar 26 00:40:35 2017	(r315968)
@@ -74,14 +74,34 @@ static bool
 dmar_bus_dma_is_dev_disabled(int domain, int bus, int slot, int func)
 {
 	char str[128], *env;
+	int default_bounce;
+	bool ret;
+	static const char bounce_str[] = "bounce";
+	static const char dmar_str[] = "dmar";
+
+	default_bounce = 0;
+	env = kern_getenv("hw.busdma.default");
+	if (env != NULL) {
+		if (strcmp(env, bounce_str) == 0)
+			default_bounce = 1;
+		else if (strcmp(env, dmar_str) == 0)
+			default_bounce = 0;
+		freeenv(env);
+	}
 
-	snprintf(str, sizeof(str), "hw.busdma.pci%d.%d.%d.%d.bounce",
+	snprintf(str, sizeof(str), "hw.busdma.pci%d.%d.%d.%d",
 	    domain, bus, slot, func);
 	env = kern_getenv(str);
 	if (env == NULL)
-		return (false);
+		return (default_bounce != 0);
+	if (strcmp(env, bounce_str) == 0)
+		ret = true;
+	else if (strcmp(env, dmar_str) == 0)
+		ret = false;
+	else
+		ret = default_bounce != 0;
 	freeenv(env);
-	return (true);
+	return (ret);
 }
 
 /*



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201703260040.v2Q0eZSd072270>