Skip site navigation (1)Skip section navigation (2)
Date:      Tue, 28 Apr 2020 00:44:05 +0000 (UTC)
From:      Rick Macklem <rmacklem@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-projects@freebsd.org
Subject:   svn commit: r360419 - in projects/nfs-over-tls/sys: amd64/amd64 arm64/arm64 arm64/rockchip bsm cam/ata cam/nvme cam/scsi cddl/contrib/opensolaris/uts/common/fs/zfs compat/freebsd32 conf crypto/ccp ...
Message-ID:  <202004280044.03S0i5PR013992@repo.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: rmacklem
Date: Tue Apr 28 00:44:05 2020
New Revision: 360419
URL: https://svnweb.freebsd.org/changeset/base/360419

Log:
  Merge in an up to date kernel from head.

Deleted:
  projects/nfs-over-tls/sys/riscv/conf/GENERICSF
Modified:
  projects/nfs-over-tls/sys/amd64/amd64/minidump_machdep.c
  projects/nfs-over-tls/sys/arm64/arm64/minidump_machdep.c
  projects/nfs-over-tls/sys/arm64/rockchip/rk805.c
  projects/nfs-over-tls/sys/arm64/rockchip/rk_pinctrl.c
  projects/nfs-over-tls/sys/arm64/rockchip/rk_tsadc.c
  projects/nfs-over-tls/sys/bsm/audit_kevents.h
  projects/nfs-over-tls/sys/cam/ata/ata_da.c
  projects/nfs-over-tls/sys/cam/nvme/nvme_da.c
  projects/nfs-over-tls/sys/cam/scsi/scsi_da.c
  projects/nfs-over-tls/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
  projects/nfs-over-tls/sys/compat/freebsd32/freebsd32_sysent.c
  projects/nfs-over-tls/sys/compat/freebsd32/syscalls.master
  projects/nfs-over-tls/sys/conf/Makefile.riscv
  projects/nfs-over-tls/sys/conf/kern.mk
  projects/nfs-over-tls/sys/crypto/ccp/ccp.c
  projects/nfs-over-tls/sys/dev/acpica/acpi_ec.c
  projects/nfs-over-tls/sys/dev/acpica/acpi_video.c
  projects/nfs-over-tls/sys/dev/atkbdc/psm.c
  projects/nfs-over-tls/sys/dev/cxgbe/crypto/t4_kern_tls.c
  projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_tls.c
  projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_tom.c
  projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_tom.h
  projects/nfs-over-tls/sys/dev/hwpmc/hwpmc_intel.c
  projects/nfs-over-tls/sys/dev/ichiic/ig4_acpi.c
  projects/nfs-over-tls/sys/dev/ichiic/ig4_pci.c
  projects/nfs-over-tls/sys/dev/iicbus/acpi_iicbus.c
  projects/nfs-over-tls/sys/dev/iscsi_initiator/isc_subr.c
  projects/nfs-over-tls/sys/dev/iwm/if_iwm.c
  projects/nfs-over-tls/sys/dev/mlx5/mlx5_en/en.h
  projects/nfs-over-tls/sys/dev/mlx5/mlx5_en/mlx5_en_ethtool.c
  projects/nfs-over-tls/sys/dev/mlx5/mlx5_en/mlx5_en_main.c
  projects/nfs-over-tls/sys/dev/mlx5/mlx5_ifc.h
  projects/nfs-over-tls/sys/dev/pci/pci_host_generic_fdt.c
  projects/nfs-over-tls/sys/dev/sound/pci/hda/hdac.c
  projects/nfs-over-tls/sys/fs/fifofs/fifo_vnops.c
  projects/nfs-over-tls/sys/fs/nfs/nfs_commonsubs.c
  projects/nfs-over-tls/sys/fs/nfs/nfskpiport.h
  projects/nfs-over-tls/sys/fs/nfsserver/nfs_nfsdport.c
  projects/nfs-over-tls/sys/geom/geom.h
  projects/nfs-over-tls/sys/i386/i386/minidump_machdep_base.c
  projects/nfs-over-tls/sys/kern/init_sysent.c
  projects/nfs-over-tls/sys/kern/kern_descrip.c
  projects/nfs-over-tls/sys/kern/kern_mib.c
  projects/nfs-over-tls/sys/kern/kern_shutdown.c
  projects/nfs-over-tls/sys/kern/kern_thread.c
  projects/nfs-over-tls/sys/kern/sys_pipe.c
  projects/nfs-over-tls/sys/kern/syscalls.master
  projects/nfs-over-tls/sys/kern/uipc_ktls.c
  projects/nfs-over-tls/sys/kern/uipc_socket.c
  projects/nfs-over-tls/sys/kern/vfs_mountroot.c
  projects/nfs-over-tls/sys/mips/mips/pmap.c
  projects/nfs-over-tls/sys/net/debugnet.c
  projects/nfs-over-tls/sys/net/if_bridge.c
  projects/nfs-over-tls/sys/net/ifdi_if.m
  projects/nfs-over-tls/sys/net/iflib.c
  projects/nfs-over-tls/sys/net/iflib.h
  projects/nfs-over-tls/sys/net/radix_mpath.c
  projects/nfs-over-tls/sys/net/route.c
  projects/nfs-over-tls/sys/net/route.h
  projects/nfs-over-tls/sys/net/route_var.h
  projects/nfs-over-tls/sys/net/rtsock.c
  projects/nfs-over-tls/sys/net80211/ieee80211_mesh.c
  projects/nfs-over-tls/sys/netgraph/ng_eiface.c
  projects/nfs-over-tls/sys/netinet/in_fib.c
  projects/nfs-over-tls/sys/netinet/in_fib.h
  projects/nfs-over-tls/sys/netinet/ip_input.c
  projects/nfs-over-tls/sys/netinet/ip_output.c
  projects/nfs-over-tls/sys/netinet/sctp_asconf.c
  projects/nfs-over-tls/sys/netinet/sctp_os_bsd.h
  projects/nfs-over-tls/sys/netinet/sctp_output.c
  projects/nfs-over-tls/sys/netinet/sctp_pcb.c
  projects/nfs-over-tls/sys/netinet/sctp_structs.h
  projects/nfs-over-tls/sys/netinet/sctp_timer.c
  projects/nfs-over-tls/sys/netinet/sctp_var.h
  projects/nfs-over-tls/sys/netinet/tcp.h
  projects/nfs-over-tls/sys/netinet/tcp_log_buf.h
  projects/nfs-over-tls/sys/netinet/tcp_offload.c
  projects/nfs-over-tls/sys/netinet/tcp_offload.h
  projects/nfs-over-tls/sys/netinet/tcp_output.c
  projects/nfs-over-tls/sys/netinet/tcp_stacks/bbr.c
  projects/nfs-over-tls/sys/netinet/tcp_stacks/rack.c
  projects/nfs-over-tls/sys/netinet/tcp_subr.c
  projects/nfs-over-tls/sys/netinet/tcp_usrreq.c
  projects/nfs-over-tls/sys/netinet/tcp_var.h
  projects/nfs-over-tls/sys/netinet/toecore.c
  projects/nfs-over-tls/sys/netinet/toecore.h
  projects/nfs-over-tls/sys/netinet/udp_usrreq.c
  projects/nfs-over-tls/sys/netinet6/in6.h
  projects/nfs-over-tls/sys/netinet6/in6_fib.c
  projects/nfs-over-tls/sys/netinet6/in6_fib.h
  projects/nfs-over-tls/sys/netinet6/in6_pcb.c
  projects/nfs-over-tls/sys/netinet6/in6_src.c
  projects/nfs-over-tls/sys/netinet6/ip6_output.c
  projects/nfs-over-tls/sys/netinet6/ip6_var.h
  projects/nfs-over-tls/sys/netinet6/nd6.c
  projects/nfs-over-tls/sys/netinet6/nd6.h
  projects/nfs-over-tls/sys/netinet6/nd6_rtr.c
  projects/nfs-over-tls/sys/netpfil/pf/pf_ioctl.c
  projects/nfs-over-tls/sys/netpfil/pf/pf_norm.c
  projects/nfs-over-tls/sys/nlm/nlm_prot_impl.c
  projects/nfs-over-tls/sys/powerpc/powerpc/minidump_machdep.c
  projects/nfs-over-tls/sys/riscv/include/param.h
  projects/nfs-over-tls/sys/riscv/riscv/elf_machdep.c
  projects/nfs-over-tls/sys/sys/filedesc.h
  projects/nfs-over-tls/sys/sys/kdb.h
  projects/nfs-over-tls/sys/sys/ktls.h
  projects/nfs-over-tls/sys/sys/param.h
  projects/nfs-over-tls/sys/sys/proc.h
  projects/nfs-over-tls/sys/sys/sysent.h
  projects/nfs-over-tls/sys/sys/sysproto.h
  projects/nfs-over-tls/sys/vm/vm_extern.h
  projects/nfs-over-tls/sys/vm/vm_glue.c
  projects/nfs-over-tls/sys/vm/vm_kern.h
  projects/nfs-over-tls/sys/vm/vm_swapout.c
  projects/nfs-over-tls/sys/x86/x86/cpu_machdep.c
Directory Properties:
  projects/nfs-over-tls/sys/   (props changed)
  projects/nfs-over-tls/sys/cddl/contrib/opensolaris/   (props changed)

Modified: projects/nfs-over-tls/sys/amd64/amd64/minidump_machdep.c
==============================================================================
--- projects/nfs-over-tls/sys/amd64/amd64/minidump_machdep.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/amd64/amd64/minidump_machdep.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -409,7 +409,6 @@ minidumpsys(struct dumperinfo *di)
 	}
 
 	/* Dump memory chunks */
-	/* XXX cluster it up and use blk_dump() */
 	for (i = 0; i < vm_page_dump_size / sizeof(*vm_page_dump); i++) {
 		bits = vm_page_dump[i];
 		while (bits) {

Modified: projects/nfs-over-tls/sys/arm64/arm64/minidump_machdep.c
==============================================================================
--- projects/nfs-over-tls/sys/arm64/arm64/minidump_machdep.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/arm64/arm64/minidump_machdep.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -34,8 +34,6 @@ __FBSDID("$FreeBSD$");
 
 #include "opt_watchdog.h"
 
-#include "opt_watchdog.h"
-
 #include <sys/param.h>
 #include <sys/systm.h>
 #include <sys/conf.h>
@@ -68,7 +66,7 @@ static size_t fragsz;
 static void *dump_va;
 static size_t counter, progress, dumpsize;
 
-static uint64_t tmpbuffer[PAGE_SIZE / sizeof(uint64_t)];
+static uint64_t tmpbuffer[Ln_ENTRIES];
 
 CTASSERT(sizeof(*vm_page_dump) == 8);
 
@@ -210,16 +208,14 @@ blk_write(struct dumperinfo *di, char *ptr, vm_paddr_t
 int
 minidumpsys(struct dumperinfo *di)
 {
+	struct minidumphdr mdhdr;
 	pd_entry_t *l0, *l1, *l2;
 	pt_entry_t *l3;
-	uint32_t pmapsize;
 	vm_offset_t va;
 	vm_paddr_t pa;
-	int error;
 	uint64_t bits;
-	int i, bit;
-	int retry_count;
-	struct minidumphdr mdhdr;
+	uint32_t pmapsize;
+	int bit, error, i, j, retry_count;
 
 	retry_count = 0;
  retry:
@@ -231,11 +227,15 @@ minidumpsys(struct dumperinfo *di)
 		if (!pmap_get_tables(pmap_kernel(), va, &l0, &l1, &l2, &l3))
 			continue;
 
-		/* We should always be using the l2 table for kvm */
-		if (l2 == NULL)
-			continue;
-
-		if ((*l2 & ATTR_DESCR_MASK) == L2_BLOCK) {
+		if ((*l1 & ATTR_DESCR_MASK) == L1_BLOCK) {
+			pa = *l1 & ~ATTR_MASK;
+			for (i = 0; i < Ln_ENTRIES * Ln_ENTRIES;
+			    i++, pa += PAGE_SIZE)
+				if (is_dumpable(pa))
+					dump_add_page(pa);
+			pmapsize += (Ln_ENTRIES - 1) * PAGE_SIZE;
+			va += L1_SIZE - L2_SIZE;
+		} else if ((*l2 & ATTR_DESCR_MASK) == L2_BLOCK) {
 			pa = *l2 & ~ATTR_MASK;
 			for (i = 0; i < Ln_ENTRIES; i++, pa += PAGE_SIZE) {
 				if (is_dumpable(pa))
@@ -327,25 +327,31 @@ minidumpsys(struct dumperinfo *di)
 			error = blk_flush(di);
 			if (error)
 				goto fail;
-		} else if (l2 == NULL) {
+		} else if ((*l1 & ATTR_DESCR_MASK) == L1_BLOCK) {
+			/*
+			 * Handle a 1GB block mapping: write out 512 fake L2
+			 * pages.
+			 */
 			pa = (*l1 & ~ATTR_MASK) | (va & L1_OFFSET);
 
-			/* Generate fake l3 entries based upon the l1 entry */
 			for (i = 0; i < Ln_ENTRIES; i++) {
-				tmpbuffer[i] = pa + (i * PAGE_SIZE) |
-				    ATTR_DEFAULT | L3_PAGE;
+				for (j = 0; j < Ln_ENTRIES; j++) {
+					tmpbuffer[j] = pa + i * L2_SIZE +
+					    j * PAGE_SIZE | ATTR_DEFAULT |
+					    L3_PAGE;
+				}
+				error = blk_write(di, (char *)&tmpbuffer, 0,
+				    PAGE_SIZE);
+				if (error)
+					goto fail;
 			}
-			/* We always write a page, even if it is zero */
-			error = blk_write(di, (char *)&tmpbuffer, 0, PAGE_SIZE);
-			if (error)
-				goto fail;
 			/* flush, in case we reuse tmpbuffer in the same block*/
 			error = blk_flush(di);
 			if (error)
 				goto fail;
 			bzero(&tmpbuffer, sizeof(tmpbuffer));
+			va += L1_SIZE - L2_SIZE;
 		} else if ((*l2 & ATTR_DESCR_MASK) == L2_BLOCK) {
-			/* TODO: Handle an invalid L2 entry */
 			pa = (*l2 & ~ATTR_MASK) | (va & L2_OFFSET);
 
 			/* Generate fake l3 entries based upon the l1 entry */
@@ -353,7 +359,6 @@ minidumpsys(struct dumperinfo *di)
 				tmpbuffer[i] = pa + (i * PAGE_SIZE) |
 				    ATTR_DEFAULT | L3_PAGE;
 			}
-			/* We always write a page, even if it is zero */
 			error = blk_write(di, (char *)&tmpbuffer, 0, PAGE_SIZE);
 			if (error)
 				goto fail;
@@ -366,7 +371,6 @@ minidumpsys(struct dumperinfo *di)
 		} else {
 			pa = *l2 & ~ATTR_MASK;
 
-			/* We always write a page, even if it is zero */
 			error = blk_write(di, NULL, pa, PAGE_SIZE);
 			if (error)
 				goto fail;
@@ -374,7 +378,6 @@ minidumpsys(struct dumperinfo *di)
 	}
 
 	/* Dump memory chunks */
-	/* XXX cluster it up and use blk_dump() */
 	for (i = 0; i < vm_page_dump_size / sizeof(*vm_page_dump); i++) {
 		bits = vm_page_dump[i];
 		while (bits) {

Modified: projects/nfs-over-tls/sys/arm64/rockchip/rk805.c
==============================================================================
--- projects/nfs-over-tls/sys/arm64/rockchip/rk805.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/arm64/rockchip/rk805.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -85,6 +85,11 @@ struct rk805_reg_sc {
 	struct regnode_std_param *param;
 };
 
+struct reg_list {
+	TAILQ_ENTRY(reg_list)	next;
+	struct rk805_reg_sc	*reg;
+};
+
 struct rk805_softc {
 	device_t		dev;
 	struct mtx		mtx;
@@ -93,7 +98,7 @@ struct rk805_softc {
 	struct intr_config_hook	intr_hook;
 	enum rk_pmic_type	type;
 
-	struct rk805_reg_sc	**regs;
+	TAILQ_HEAD(, reg_list)		regs;
 	int			nregs;
 };
 
@@ -619,6 +624,7 @@ rk805_attach(device_t dev)
 	struct rk805_softc *sc;
 	struct rk805_reg_sc *reg;
 	struct rk805_regdef *regdefs;
+	struct reg_list *regp;
 	phandle_t rnode, child;
 	int i;
 
@@ -645,8 +651,7 @@ rk805_attach(device_t dev)
 		return (ENXIO);
 	}
 
-	sc->regs = malloc(sizeof(struct rk805_reg_sc *) * sc->nregs,
-	    M_RK805_REG, M_WAITOK | M_ZERO);
+	TAILQ_INIT(&sc->regs);
 
 	rnode = ofw_bus_find_child(ofw_bus_get_node(dev), "regulators");
 	if (rnode > 0) {
@@ -655,6 +660,8 @@ rk805_attach(device_t dev)
 			    regdefs[i].name);
 			if (child == 0)
 				continue;
+			if (OF_hasprop(child, "regulator-name") != 1)
+				continue;
 			reg = rk805_reg_attach(dev, child, &regdefs[i]);
 			if (reg == NULL) {
 				device_printf(dev,
@@ -662,7 +669,9 @@ rk805_attach(device_t dev)
 				    regdefs[i].name);
 				continue;
 			}
-			sc->regs[i] = reg;
+			regp = malloc(sizeof(*regp), M_DEVBUF, M_WAITOK | M_ZERO);
+			regp->reg = reg;
+			TAILQ_INSERT_TAIL(&sc->regs, regp, next);
 			if (bootverbose)
 				device_printf(dev, "Regulator %s attached\n",
 				    regdefs[i].name);
@@ -685,13 +694,13 @@ rk805_map(device_t dev, phandle_t xref, int ncells,
     pcell_t *cells, intptr_t *id)
 {
 	struct rk805_softc *sc;
-	int i;
+	struct reg_list *regp;
 
 	sc = device_get_softc(dev);
 
-	for (i = 0; i < sc->nregs; i++) {
-		if (sc->regs[i]->xref == xref) {
-			*id = sc->regs[i]->def->id;
+	TAILQ_FOREACH(regp, &sc->regs, next) {
+		if (regp->reg->xref == xref) {
+			*id = regp->reg->def->id;
 			return (0);
 		}
 	}

Modified: projects/nfs-over-tls/sys/arm64/rockchip/rk_pinctrl.c
==============================================================================
--- projects/nfs-over-tls/sys/arm64/rockchip/rk_pinctrl.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/arm64/rockchip/rk_pinctrl.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -932,7 +932,28 @@ rk_pinctrl_configure_pin(struct rk_pinctrl_softc *sc, 
 	/* Find syscon */
 	syscon = sc->conf->get_syscon(sc, bank);
 
-	/* Parse pin function */
+	/* Setup GPIO properties first */
+	rv = rk_pinctrl_handle_io(sc, pin_conf, bank, pin);
+
+	/* Then pin pull-up/down */
+	bias = sc->conf->parse_bias(pin_conf, bank);
+	if (bias >= 0) {
+		reg = sc->conf->get_pd_offset(sc, bank);
+		reg += bank * 0x10 + ((pin / 8) * 0x4);
+		bit = (pin % 8) * 2;
+		mask = (0x3 << bit);
+		SYSCON_MODIFY_4(syscon, reg, mask, bias << bit | (mask << 16));
+	}
+
+	/* Then drive strength */
+	rv = rk_pinctrl_parse_drive(sc, pin_conf, bank, subbank, &drive, &reg);
+	if (rv == 0) {
+		bit = (pin % 8) * 2;
+		mask = (0x3 << bit);
+		SYSCON_MODIFY_4(syscon, reg, mask, drive << bit | (mask << 16));
+	}
+
+	/* Finally set the pin function */
 	reg = sc->conf->iomux_conf[i].offset;
 	switch (sc->conf->iomux_conf[i].nbits) {
 	case 4:
@@ -966,28 +987,6 @@ rk_pinctrl_configure_pin(struct rk_pinctrl_softc *sc, 
 	 * without hi-word write mask.
 	 */
 	SYSCON_MODIFY_4(syscon, reg, mask, function << bit | (mask << 16));
-
-	/* Pull-Up/Down */
-	bias = sc->conf->parse_bias(pin_conf, bank);
-	if (bias >= 0) {
-		reg = sc->conf->get_pd_offset(sc, bank);
-
-		reg += bank * 0x10 + ((pin / 8) * 0x4);
-		bit = (pin % 8) * 2;
-		mask = (0x3 << bit);
-		SYSCON_MODIFY_4(syscon, reg, mask, bias << bit | (mask << 16));
-	}
-
-	/* Drive Strength */
-	rv = rk_pinctrl_parse_drive(sc, pin_conf, bank, subbank, &drive, &reg);
-	if (rv == 0) {
-		bit = (pin % 8) * 2;
-		mask = (0x3 << bit);
-		SYSCON_MODIFY_4(syscon, reg, mask, drive << bit | (mask << 16));
-	}
-
-	/* Input/Outpot + default level */
-	rv = rk_pinctrl_handle_io(sc, pin_conf, bank, pin);
 }
 
 static int

Modified: projects/nfs-over-tls/sys/arm64/rockchip/rk_tsadc.c
==============================================================================
--- projects/nfs-over-tls/sys/arm64/rockchip/rk_tsadc.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/arm64/rockchip/rk_tsadc.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -98,24 +98,19 @@ struct tsensor {
 	int			channel;
 };
 
-enum tsadc_type {
-	RK_TSADC_V2,
-	RK_TSADC_V3
-};
-
 struct rk_calib_entry {
 	uint32_t	raw;
 	int		temp;
 };
 
 struct tsadc_calib_info {
-	bool decrement_mode;
 	struct rk_calib_entry	*table;
 	int			nentries;
 };
 
 struct tsadc_conf {
-	enum tsadc_type		type;
+	int			use_syscon;
+	int			q_sel_ntc;
 	int			shutdown_temp;
 	int			shutdown_mode;
 	int			shutdown_pol;
@@ -188,7 +183,8 @@ struct tsensor rk3288_tsensors[] = {
 };
 
 struct tsadc_conf rk3288_tsadc_conf = {
-	.type = 		RK_TSADC_V2,
+	.use_syscon =		0,
+	.q_sel_ntc =		0,
 	.shutdown_temp =	95000,
 	.shutdown_mode =	1, /* GPIO */
 	.shutdown_pol =		0, /* Low  */
@@ -241,7 +237,8 @@ static struct tsensor rk3328_tsensors[] = {
 };
 
 static struct tsadc_conf rk3328_tsadc_conf = {
-	.type = 		RK_TSADC_V3,
+	.use_syscon =		0,
+	.q_sel_ntc =		1,
 	.shutdown_temp =	95000,
 	.shutdown_mode =	0, /* CRU */
 	.shutdown_pol =		0, /* Low  */
@@ -296,7 +293,8 @@ static struct tsensor rk3399_tsensors[] = {
 };
 
 static struct tsadc_conf rk3399_tsadc_conf = {
-	.type = 		RK_TSADC_V3,
+	.use_syscon =		1,
+	.q_sel_ntc =		1,
 	.shutdown_temp =	95000,
 	.shutdown_mode =	1, /* GPIO */
 	.shutdown_pol =		0, /* Low  */
@@ -444,11 +442,11 @@ tsadc_init(struct tsadc_softc *sc)
 		val |= TSADC_AUTO_CON_POL_HI;
 	else
 		val &= ~TSADC_AUTO_CON_POL_HI;
-	if (sc->conf->type == RK_TSADC_V3)
+	if (sc->conf->q_sel_ntc)
 		val |= TSADC_AUTO_Q_SEL;
 	WR4(sc, TSADC_AUTO_CON, val);
 
-	if (sc->conf->type == RK_TSADC_V2) {
+	if (!sc->conf->use_syscon) {
 		/* V2 init */
 		WR4(sc, TSADC_AUTO_PERIOD, 250); 	/* 250 ms */
 		WR4(sc, TSADC_AUTO_PERIOD_HT, 50);	/*  50 ms */

Modified: projects/nfs-over-tls/sys/bsm/audit_kevents.h
==============================================================================
--- projects/nfs-over-tls/sys/bsm/audit_kevents.h	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/bsm/audit_kevents.h	Tue Apr 28 00:44:05 2020	(r360419)
@@ -658,6 +658,7 @@
 #define	AUE_EXECVEAT		43262	/* FreeBSD/Linux. */
 #define	AUE_SHMRENAME		43263	/* FreeBSD-specific. */
 #define	AUE_REALPATHAT		43264	/* FreeBSD-specific. */
+#define	AUE_CLOSERANGE		43265	/* FreeBSD-specific. */
 
 /*
  * Darwin BSM uses a number of AUE_O_* definitions, which are aliased to the

Modified: projects/nfs-over-tls/sys/cam/ata/ata_da.c
==============================================================================
--- projects/nfs-over-tls/sys/cam/ata/ata_da.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/cam/ata/ata_da.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -109,8 +109,37 @@ typedef enum {
 	ADA_FLAG_ANNOUNCED	= 0x00100000,
 	ADA_FLAG_DIRTY		= 0x00200000,
 	ADA_FLAG_CAN_NCQ_TRIM	= 0x00400000,	/* CAN_TRIM also set */
-	ADA_FLAG_PIM_ATA_EXT	= 0x00800000
+	ADA_FLAG_PIM_ATA_EXT	= 0x00800000,
+	ADA_FLAG_UNMAPPEDIO	= 0x01000000,
+	ADA_FLAG_ROTATING	= 0x02000000
 } ada_flags;
+#define ADA_FLAG_STRING		\
+	"\020"			\
+	"\002CAN_48BIT"		\
+	"\003CAN_FLUSHCACHE"	\
+	"\004CAN_NCQ"		\
+	"\005CAN_DMA"		\
+	"\006NEED_OTAG"		\
+	"\007WAS_OTAG"		\
+	"\010CAN_TRIM"		\
+	"\011OPEN"		\
+	"\012SCTX_INIT"		\
+	"\013CAN_CFA"		\
+	"\014CAN_POWERMGT"	\
+	"\015CAN_DMA48"		\
+	"\016CAN_LOG"		\
+	"\017CAN_IDLOG"		\
+	"\020CAN_SUPCAP"	\
+	"\021CAN_ZONE"		\
+	"\022CAN_WCACHE"	\
+	"\023CAN_RAHEAD"	\
+	"\024PROBED"		\
+	"\025ANNOUNCED"		\
+	"\026DIRTY"		\
+	"\027CAN_NCQ_TRIM"	\
+	"\030PIM_ATA_EXT"	\
+	"\031UNMAPPEDIO"	\
+	"\032ROTATING"
 
 typedef enum {
 	ADA_Q_NONE		= 0x00,
@@ -239,8 +268,6 @@ struct ada_softc {
 	int	 trim_max_ranges;
 	int	 read_ahead;
 	int	 write_cache;
-	int	 unmappedio;
-	int	 rotating;
 #ifdef CAM_TEST_FAILURE
 	int      force_read_error;
 	int      force_write_error;
@@ -806,8 +833,10 @@ static	periph_oninv_t	adaoninvalidate;
 static	periph_dtor_t	adacleanup;
 static	void		adaasync(void *callback_arg, u_int32_t code,
 				struct cam_path *path, void *arg);
-static	int		adazonemodesysctl(SYSCTL_HANDLER_ARGS);
+static	int		adabitsysctl(SYSCTL_HANDLER_ARGS);
+static	int		adaflagssysctl(SYSCTL_HANDLER_ARGS);
 static	int		adazonesupsysctl(SYSCTL_HANDLER_ARGS);
+static	int		adazonesupsysctl(SYSCTL_HANDLER_ARGS);
 static	void		adasysctlinit(void *context, int pending);
 static	int		adagetattr(struct bio *bp);
 static	void		adasetflags(struct ada_softc *softc,
@@ -1488,12 +1517,6 @@ adasysctlinit(void *context, int pending)
 	SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
 		OID_AUTO, "write_cache", CTLFLAG_RW | CTLFLAG_MPSAFE,
 		&softc->write_cache, 0, "Enable disk write cache.");
-	SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
-		OID_AUTO, "unmapped_io", CTLFLAG_RD | CTLFLAG_MPSAFE,
-		&softc->unmappedio, 0, "Unmapped I/O leaf");
-	SYSCTL_ADD_INT(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
-		OID_AUTO, "rotating", CTLFLAG_RD | CTLFLAG_MPSAFE,
-		&softc->rotating, 0, "Rotating media");
 	SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
 		OID_AUTO, "zone_mode",
 		CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_NEEDGIANT,
@@ -1518,6 +1541,18 @@ adasysctlinit(void *context, int pending)
 		SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO,
 		"max_seq_zones", CTLFLAG_RD, &softc->max_seq_zones,
 		"Maximum Number of Open Sequential Write Required Zones");
+	SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+	    OID_AUTO, "flags", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
+	    softc, 0, adaflagssysctl, "A",
+	    "Flags for drive");
+	SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+	    OID_AUTO, "unmapped_io", CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,
+	    &softc->flags, (u_int)ADA_FLAG_UNMAPPEDIO, adabitsysctl, "I",
+	    "Unmapped I/O support *DEPRECATED* gone in FreeBSD 14");
+	SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+	    OID_AUTO, "rotating", CTLTYPE_INT | CTLFLAG_RD | CTLFLAG_MPSAFE,
+	    &softc->flags, (u_int)ADA_FLAG_ROTATING, adabitsysctl, "I",
+	    "Rotating media *DEPRECATED* gone in FreeBSD 14");
 
 #ifdef CAM_TEST_FAILURE
 	/*
@@ -1626,6 +1661,39 @@ adadeletemethodsysctl(SYSCTL_HANDLER_ARGS)
 	return (EINVAL);
 }
 
+static int
+adabitsysctl(SYSCTL_HANDLER_ARGS)
+{
+	u_int *flags = arg1;
+	u_int test = arg2;
+	int tmpout, error;
+
+	tmpout = !!(*flags & test);
+	error = SYSCTL_OUT(req, &tmpout, sizeof(tmpout));
+	if (error || !req->newptr)
+		return (error);
+
+	return (EPERM);
+}
+
+static int
+adaflagssysctl(SYSCTL_HANDLER_ARGS)
+{
+	struct sbuf sbuf;
+	struct ada_softc *softc = arg1;
+	int error;
+
+	sbuf_new_for_sysctl(&sbuf, NULL, 0, req);
+	if (softc->flags != 0)
+		sbuf_printf(&sbuf, "0x%b", (unsigned)softc->flags, ADA_FLAG_STRING);
+	else
+		sbuf_printf(&sbuf, "0");
+	error = sbuf_finish(&sbuf);
+	sbuf_delete(&sbuf);
+
+	return (error);
+}
+
 static void
 adasetflags(struct ada_softc *softc, struct ccb_getdev *cgd)
 {
@@ -1807,11 +1875,12 @@ adaregister(struct cam_periph *periph, void *arg)
 
 	/* Disable queue sorting for non-rotational media by default. */
 	if (cgd->ident_data.media_rotation_rate == ATA_RATE_NON_ROTATING) {
-		softc->rotating = 0;
+		softc->flags &= ~ADA_FLAG_ROTATING;
 	} else {
-		softc->rotating = 1;
+		softc->flags |= ADA_FLAG_ROTATING;
 	}
-	cam_iosched_set_sort_queue(softc->cam_iosched,  softc->rotating ? -1 : 0);
+	cam_iosched_set_sort_queue(softc->cam_iosched,
+	    (softc->flags & ADA_FLAG_ROTATING) ? -1 : 0);
 	softc->disk = disk_alloc();
 	adasetgeom(softc, cgd);
 	softc->disk->d_devstat = devstat_new_entry(periph->periph_name,
@@ -3411,7 +3480,7 @@ adasetgeom(struct ada_softc *softc, struct ccb_getdev 
 		softc->disk->d_delmaxsize = maxio;
 	if ((softc->cpi.hba_misc & PIM_UNMAPPED) != 0) {
 		d_flags |= DISKFLAG_UNMAPPED_BIO;
-		softc->unmappedio = 1;
+		softc->flags |= ADA_FLAG_UNMAPPEDIO;
 	}
 	softc->disk->d_flags = d_flags;
 	strlcpy(softc->disk->d_descr, cgd->ident_data.model,

Modified: projects/nfs-over-tls/sys/cam/nvme/nvme_da.c
==============================================================================
--- projects/nfs-over-tls/sys/cam/nvme/nvme_da.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/cam/nvme/nvme_da.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -48,6 +48,7 @@ __FBSDID("$FreeBSD$");
 #include <sys/cons.h>
 #include <sys/proc.h>
 #include <sys/reboot.h>
+#include <sys/sbuf.h>
 #include <geom/geom.h>
 #include <geom/geom_disk.h>
 #endif /* _KERNEL */
@@ -75,6 +76,11 @@ typedef enum {
 	NDA_FLAG_DIRTY		= 0x0002,
 	NDA_FLAG_SCTX_INIT	= 0x0004,
 } nda_flags;
+#define NDA_FLAG_STRING		\
+	"\020"			\
+	"\001OPEN"		\
+	"\002DIRTY"		\
+	"\003SCTX_INIT"
 
 typedef enum {
 	NDA_Q_4K   = 0x01,
@@ -144,6 +150,7 @@ static	periph_init_t	ndainit;
 static	void		ndaasync(void *callback_arg, u_int32_t code,
 				struct cam_path *path, void *arg);
 static	void		ndasysctlinit(void *context, int pending);
+static	int		ndaflagssysctl(SYSCTL_HANDLER_ARGS);
 static	periph_ctor_t	ndaregister;
 static	periph_dtor_t	ndacleanup;
 static	periph_start_t	ndastart;
@@ -659,6 +666,11 @@ ndasysctlinit(void *context, int pending)
 	    OID_AUTO, "rotating", CTLFLAG_RD, &nda_rotating_media, 1,
 	    "Rotating media");
 
+	SYSCTL_ADD_PROC(&softc->sysctl_ctx, SYSCTL_CHILDREN(softc->sysctl_tree),
+	    OID_AUTO, "flags", CTLTYPE_STRING | CTLFLAG_RD | CTLFLAG_MPSAFE,
+	    softc, 0, ndaflagssysctl, "A",
+	    "Flags for drive");
+
 #ifdef CAM_IO_STATS
 	softc->sysctl_stats_tree = SYSCTL_ADD_NODE(&softc->sysctl_stats_ctx,
 		SYSCTL_CHILDREN(softc->sysctl_tree), OID_AUTO, "stats",
@@ -696,6 +708,24 @@ ndasysctlinit(void *context, int pending)
 	    softc->sysctl_tree);
 
 	cam_periph_release(periph);
+}
+
+static int
+ndaflagssysctl(SYSCTL_HANDLER_ARGS)
+{
+	struct sbuf sbuf;
+	struct nda_softc *softc = arg1;
+	int error;
+
+	sbuf_new_for_sysctl(&sbuf, NULL, 0, req);
+	if (softc->flags != 0)
+		sbuf_printf(&sbuf, "0x%b", (unsigned)softc->flags, NDA_FLAG_STRING);
+	else
+		sbuf_printf(&sbuf, "0");
+	error = sbuf_finish(&sbuf);
+	sbuf_delete(&sbuf);
+
+	return (error);
 }
 
 static int

Modified: projects/nfs-over-tls/sys/cam/scsi/scsi_da.c
==============================================================================
--- projects/nfs-over-tls/sys/cam/scsi/scsi_da.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/cam/scsi/scsi_da.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -342,7 +342,7 @@ struct da_softc {
 	LIST_HEAD(, ccb_hdr) pending_ccbs;
 	int	 refcount;		/* Active xpt_action() calls */
 	da_state state;
-	u_int	 flags;
+	da_flags flags;
 	da_quirks quirks;
 	int	 minimum_cmd_size;
 	int	 error_inject;
@@ -2646,7 +2646,7 @@ daflagssysctl(SYSCTL_HANDLER_ARGS)
 
 	sbuf_new_for_sysctl(&sbuf, NULL, 0, req);
 	if (softc->flags != 0)
-		sbuf_printf(&sbuf, "0x%b", softc->flags, DA_FLAG_STRING);
+		sbuf_printf(&sbuf, "0x%b", (unsigned)softc->flags, DA_FLAG_STRING);
 	else
 		sbuf_printf(&sbuf, "0");
 	error = sbuf_finish(&sbuf);

Modified: projects/nfs-over-tls/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c
==============================================================================
--- projects/nfs-over-tls/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/cddl/contrib/opensolaris/uts/common/fs/zfs/vdev_geom.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -973,18 +973,22 @@ static void
 vdev_geom_close(vdev_t *vd)
 {
 	struct g_consumer *cp;
+	int locked;
 
 	cp = vd->vdev_tsd;
 
 	DROP_GIANT();
-	g_topology_lock();
+	locked = g_topology_locked();
+	if (!locked)
+		g_topology_lock();
 
 	if (!vd->vdev_reopening ||
 	    (cp != NULL && ((cp->flags & G_CF_ORPHAN) != 0 ||
 	    (cp->provider != NULL && cp->provider->error != 0))))
 		vdev_geom_close_locked(vd);
 
-	g_topology_unlock();
+	if (!locked)
+		g_topology_unlock();
 	PICKUP_GIANT();
 }
 

Modified: projects/nfs-over-tls/sys/compat/freebsd32/freebsd32_sysent.c
==============================================================================
--- projects/nfs-over-tls/sys/compat/freebsd32/freebsd32_sysent.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/compat/freebsd32/freebsd32_sysent.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -664,5 +664,5 @@ struct sysent freebsd32_sysent[] = {
 	{ AS(shm_rename_args), (sy_call_t *)sys_shm_rename, AUE_SHMRENAME, NULL, 0, 0, 0, SY_THR_STATIC },	/* 572 = shm_rename */
 	{ AS(sigfastblock_args), (sy_call_t *)sys_sigfastblock, AUE_NULL, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC },	/* 573 = sigfastblock */
 	{ AS(__realpathat_args), (sy_call_t *)sys___realpathat, AUE_REALPATHAT, NULL, 0, 0, 0, SY_THR_STATIC },	/* 574 = __realpathat */
-	{ AS(close_range_args), (sy_call_t *)sys_close_range, AUE_NULL, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC },	/* 575 = close_range */
+	{ AS(close_range_args), (sy_call_t *)sys_close_range, AUE_CLOSERANGE, NULL, 0, 0, SYF_CAPENABLED, SY_THR_STATIC },	/* 575 = close_range */
 };

Modified: projects/nfs-over-tls/sys/compat/freebsd32/syscalls.master
==============================================================================
--- projects/nfs-over-tls/sys/compat/freebsd32/syscalls.master	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/compat/freebsd32/syscalls.master	Tue Apr 28 00:44:05 2020	(r360419)
@@ -1162,7 +1162,7 @@
 573	AUE_NULL	NOPROTO	{ int sigfastblock(int cmd, uint32_t *ptr); }
 574	AUE_REALPATHAT	NOPROTO { int __realpathat(int fd, const char *path, \
 				    char *buf, size_t size, int flags); }
-575	AUE_NULL	NOPROTO	{ int close_range(u_int lowfd, u_int highfd, \
+575	AUE_CLOSERANGE	NOPROTO	{ int close_range(u_int lowfd, u_int highfd, \
 				    int flags); }
 
 ; vim: syntax=off

Modified: projects/nfs-over-tls/sys/conf/Makefile.riscv
==============================================================================
--- projects/nfs-over-tls/sys/conf/Makefile.riscv	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/conf/Makefile.riscv	Tue Apr 28 00:44:05 2020	(r360419)
@@ -19,7 +19,7 @@
 #
 
 # Which version of config(8) is required.
-%VERSREQ=	600017
+%VERSREQ=	600012
 
 .if !defined(S)
 S=	../../..

Modified: projects/nfs-over-tls/sys/conf/kern.mk
==============================================================================
--- projects/nfs-over-tls/sys/conf/kern.mk	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/conf/kern.mk	Tue Apr 28 00:44:05 2020	(r360419)
@@ -150,11 +150,7 @@ INLINE_LIMIT?=	8000
 # code model as "medium" and "medany" respectively.
 #
 .if ${MACHINE_CPUARCH} == "riscv"
-.if ${MACHINE_ARCH:Mriscv*sf}
-CFLAGS+=	-march=rv64imac
-.else
 CFLAGS+=	-march=rv64imafdc
-.endif
 CFLAGS+=	-mabi=lp64
 CFLAGS.clang+=	-mcmodel=medium
 CFLAGS.gcc+=	-mcmodel=medany

Modified: projects/nfs-over-tls/sys/crypto/ccp/ccp.c
==============================================================================
--- projects/nfs-over-tls/sys/crypto/ccp/ccp.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/crypto/ccp/ccp.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -78,6 +78,7 @@ static struct pciid {
 } ccp_ids[] = {
 	{ 0x14561022, "AMD CCP-5a" },
 	{ 0x14681022, "AMD CCP-5b" },
+	{ 0x15df1022, "AMD CCP-5a" },
 };
 
 static struct random_source random_ccp = {

Modified: projects/nfs-over-tls/sys/dev/acpica/acpi_ec.c
==============================================================================
--- projects/nfs-over-tls/sys/dev/acpica/acpi_ec.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/dev/acpica/acpi_ec.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -443,6 +443,8 @@ acpi_ec_probe(device_t dev)
 
     if (buf.Pointer)
 	AcpiOsFree(buf.Pointer);
+
+    ret = rc;
 out:
     if (ret <= 0) {
 	snprintf(desc, sizeof(desc), "Embedded Controller: GPE %#x%s%s",

Modified: projects/nfs-over-tls/sys/dev/acpica/acpi_video.c
==============================================================================
--- projects/nfs-over-tls/sys/dev/acpica/acpi_video.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/dev/acpica/acpi_video.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -642,7 +642,10 @@ acpi_video_vo_destroy(struct acpi_video_output *vo)
 
 	switch (vo->adr & DOD_DEVID_MASK) {
 	case DOD_DEVID_MONITOR:
-		voqh = &crt_units;
+		if ((vo->adr & DOD_DEVID_MASK_FULL) == DOD_DEVID_LCD)
+			voqh = &lcd_units;
+		else
+			voqh = &crt_units;
 		break;
 	case DOD_DEVID_TV:
 		voqh = &tv_units;

Modified: projects/nfs-over-tls/sys/dev/atkbdc/psm.c
==============================================================================
--- projects/nfs-over-tls/sys/dev/atkbdc/psm.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/dev/atkbdc/psm.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -3371,7 +3371,7 @@ proc_synaptics(struct psm_softc *sc, packetbuf_t *pb, 
 				evdev_push_rel(sc->evdev_r, REL_X, *x);
 				evdev_push_rel(sc->evdev_r, REL_Y, -*y);
 				evdev_push_mouse_btn(sc->evdev_r,
-				    guest_buttons);
+				    guest_buttons | sc->extended_buttons);
 				evdev_sync(sc->evdev_r);
 			}
 #endif

Modified: projects/nfs-over-tls/sys/dev/cxgbe/crypto/t4_kern_tls.c
==============================================================================
--- projects/nfs-over-tls/sys/dev/cxgbe/crypto/t4_kern_tls.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/dev/cxgbe/crypto/t4_kern_tls.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -812,11 +812,11 @@ ktls_setup_keys(struct tlspcb *tlsp, const struct ktls
 	if (tlsp->enc_mode == SCMD_CIPH_MODE_AES_GCM) {
 		memcpy(khdr->txsalt, tls->params.iv, SALT_SIZE);
 		t4_init_gmac_hash(tls->params.cipher_key,
-		    tls->params.cipher_key_len * 8,
+		    tls->params.cipher_key_len,
 		    (char *)key + tls->params.cipher_key_len);
 	} else {
 		t4_init_hmac_digest(axf, partial_digest_len,
-		    tls->params.auth_key, tls->params.auth_key_len * 8,
+		    tls->params.auth_key, tls->params.auth_key_len,
 		    (char *)key + tls->params.cipher_key_len);
 	}
 

Modified: projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_tls.c
==============================================================================
--- projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_tls.c	Tue Apr 28 00:06:49 2020	(r360418)
+++ projects/nfs-over-tls/sys/dev/cxgbe/tom/t4_tls.c	Tue Apr 28 00:44:05 2020	(r360419)
@@ -379,7 +379,7 @@ prepare_rxkey_wr(struct tls_keyctx *kwr, struct tls_ke
 	int proto_ver = kctx->proto_ver;
 
 	kwr->u.rxhdr.flitcnt_hmacctrl =
-		((kctx->tx_key_info_size >> 4) << 3) | kctx->hmac_ctrl;
+		((kctx->rx_key_info_size >> 4) << 3) | kctx->hmac_ctrl;
 
 	kwr->u.rxhdr.protover_ciphmode =
 		V_TLS_KEYCTX_TX_WR_PROTOVER(get_proto_ver(proto_ver)) |
@@ -408,7 +408,7 @@ prepare_rxkey_wr(struct tls_keyctx *kwr, struct tls_ke
 		       (IPAD_SIZE + OPAD_SIZE));
 	} else {
 		memcpy(kwr->keys.edkey, kctx->rx.key,
-		       (kctx->tx_key_info_size - SALT_SIZE));
+		       (kctx->rx_key_info_size - SALT_SIZE));
 		memcpy(kwr->u.rxhdr.rxsalt, kctx->rx.salt, SALT_SIZE);
 	}
 }
@@ -674,6 +674,13 @@ program_key_context(struct tcpcb *tp, struct toepcb *t
 
 	if ((G_KEY_GET_LOC(k_ctx->l_p_key) == KEY_WRITE_RX) ||
 	    (tls_ofld->key_location == TLS_SFO_WR_CONTEXTLOC_DDR)) {
+
+		/*
+		 * XXX: The userland library sets tx_key_info_size, not
+		 * rx_key_info_size.
+		 */
+		k_ctx->rx_key_info_size = k_ctx->tx_key_info_size;
+
 		error = tls_program_key_id(toep, k_ctx);
 		if (error) {
 			/* XXX: Only clear quiesce for KEY_WRITE_RX? */
@@ -866,31 +873,37 @@ t4_ctloutput_tls(struct socket *so, struct sockopt *so
 
 #ifdef KERN_TLS
 static void
-init_ktls_key_context(struct ktls_session *tls, struct tls_key_context *k_ctx)
+init_ktls_key_context(struct ktls_session *tls, struct tls_key_context *k_ctx,
+    int direction)
 {
 	struct auth_hash *axf;
-	u_int mac_key_size;
-	char *hash;
+	u_int key_info_size, mac_key_size;
+	char *hash, *key;
 
-	k_ctx->l_p_key = V_KEY_GET_LOC(KEY_WRITE_TX);
-	if (tls->params.tls_vminor == TLS_MINOR_VER_ONE)
-		k_ctx->proto_ver = SCMD_PROTO_VERSION_TLS_1_1;
-	else
-		k_ctx->proto_ver = SCMD_PROTO_VERSION_TLS_1_2;
+	k_ctx->l_p_key = V_KEY_GET_LOC(direction == KTLS_TX ? KEY_WRITE_TX :
+	    KEY_WRITE_RX);
+	k_ctx->proto_ver = tls->params.tls_vmajor << 8 | tls->params.tls_vminor;
 	k_ctx->cipher_secret_size = tls->params.cipher_key_len;
-	k_ctx->tx_key_info_size = sizeof(struct tx_keyctx_hdr) +
+	key_info_size = sizeof(struct tx_keyctx_hdr) +
 	    k_ctx->cipher_secret_size;
-	memcpy(k_ctx->tx.key, tls->params.cipher_key,
-	    tls->params.cipher_key_len);
-	hash = k_ctx->tx.key + tls->params.cipher_key_len;
+	if (direction == KTLS_TX)
+		key = k_ctx->tx.key;
+	else
+		key = k_ctx->rx.key;
+	memcpy(key, tls->params.cipher_key, tls->params.cipher_key_len);
+	hash = key + tls->params.cipher_key_len;
 	if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16) {
 		k_ctx->state.auth_mode = SCMD_AUTH_MODE_GHASH;
 		k_ctx->state.enc_mode = SCMD_CIPH_MODE_AES_GCM;
 		k_ctx->iv_size = 4;
 		k_ctx->mac_first = 0;
 		k_ctx->hmac_ctrl = SCMD_HMAC_CTRL_NOP;
-		k_ctx->tx_key_info_size += GMAC_BLOCK_LEN;
-		memcpy(k_ctx->tx.salt, tls->params.iv, SALT_SIZE);
+		key_info_size += GMAC_BLOCK_LEN;
+		k_ctx->mac_secret_size = 0;
+		if (direction == KTLS_TX)
+			memcpy(k_ctx->tx.salt, tls->params.iv, SALT_SIZE);
+		else
+			memcpy(k_ctx->rx.salt, tls->params.iv, SALT_SIZE);
 		t4_init_gmac_hash(tls->params.cipher_key,
 		    tls->params.cipher_key_len, hash);
 	} else {
@@ -917,29 +930,38 @@ init_ktls_key_context(struct ktls_session *tls, struct
 		k_ctx->iv_size = 8; /* for CBC, iv is 16B, unit of 2B */
 		k_ctx->mac_first = 1;
 		k_ctx->hmac_ctrl = SCMD_HMAC_CTRL_NO_TRUNC;
-		k_ctx->tx_key_info_size += roundup2(mac_key_size, 16) * 2;
+		key_info_size += roundup2(mac_key_size, 16) * 2;
 		k_ctx->mac_secret_size = mac_key_size;
 		t4_init_hmac_digest(axf, mac_key_size, tls->params.auth_key,
 		    tls->params.auth_key_len, hash);
 	}
 
+	if (direction == KTLS_TX)
+		k_ctx->tx_key_info_size = key_info_size;
+	else
+		k_ctx->rx_key_info_size = key_info_size;
 	k_ctx->frag_size = tls->params.max_frame_len;
 	k_ctx->iv_ctrl = 1;
 }
 
 int
-tls_alloc_ktls(struct toepcb *toep, struct ktls_session *tls)
+tls_alloc_ktls(struct toepcb *toep, struct ktls_session *tls, int direction)
 {
+	struct adapter *sc = td_adapter(toep->td);
 	struct tls_key_context *k_ctx;
-	int error;
+	int error, key_offset;
 
 	if (toep->tls.mode == TLS_MODE_TLSOM)
 		return (EINVAL);
 	if (!can_tls_offload(td_adapter(toep->td)))
 		return (EINVAL);
 	switch (ulp_mode(toep)) {
+	case ULP_MODE_TLS:
+		break;
 	case ULP_MODE_NONE:
 	case ULP_MODE_TCPDDP:
+		if (direction != KTLS_TX)
+			return (EINVAL);
 		break;
 	default:
 		return (EINVAL);
@@ -987,48 +1009,81 @@ tls_alloc_ktls(struct toepcb *toep, struct ktls_sessio
 	    tls->params.tls_vminor > TLS_MINOR_VER_TWO)
 		return (EPROTONOSUPPORT);
 
+	/* Bail if we already have a key. */
+	if (direction == KTLS_TX) {
+		if (toep->tls.tx_key_addr != -1)
+			return (EOPNOTSUPP);
+	} else {
+		if (toep->tls.rx_key_addr != -1)
+			return (EOPNOTSUPP);
+	}
+
 	/*
 	 * XXX: This assumes no key renegotation.  If KTLS ever supports
 	 * that we will want to allocate TLS sessions dynamically rather
 	 * than as a static member of toep.
 	 */
 	k_ctx = &toep->tls.k_ctx;
-	init_ktls_key_context(tls, k_ctx);
+	init_ktls_key_context(tls, k_ctx, direction);
 
-	toep->tls.scmd0.seqno_numivs =
-		(V_SCMD_SEQ_NO_CTRL(3) |
-		 V_SCMD_PROTO_VERSION(k_ctx->proto_ver) |
-		 V_SCMD_ENC_DEC_CTRL(SCMD_ENCDECCTRL_ENCRYPT) |
-		 V_SCMD_CIPH_AUTH_SEQ_CTRL((k_ctx->mac_first == 0)) |
-		 V_SCMD_CIPH_MODE(k_ctx->state.enc_mode) |
-		 V_SCMD_AUTH_MODE(k_ctx->state.auth_mode) |
-		 V_SCMD_HMAC_CTRL(k_ctx->hmac_ctrl) |
-		 V_SCMD_IV_SIZE(k_ctx->iv_size));
+	error = tls_program_key_id(toep, k_ctx);
+	if (error)
+		return (error);
 
-	toep->tls.scmd0.ivgen_hdrlen =
-		(V_SCMD_IV_GEN_CTRL(k_ctx->iv_ctrl) |
-		 V_SCMD_KEY_CTX_INLINE(0) |
-		 V_SCMD_TLS_FRAG_ENABLE(1));
+	if (direction == KTLS_TX) {
+		toep->tls.scmd0.seqno_numivs =
+			(V_SCMD_SEQ_NO_CTRL(3) |
+			 V_SCMD_PROTO_VERSION(get_proto_ver(k_ctx->proto_ver)) |
+			 V_SCMD_ENC_DEC_CTRL(SCMD_ENCDECCTRL_ENCRYPT) |
+			 V_SCMD_CIPH_AUTH_SEQ_CTRL((k_ctx->mac_first == 0)) |
+			 V_SCMD_CIPH_MODE(k_ctx->state.enc_mode) |
+			 V_SCMD_AUTH_MODE(k_ctx->state.auth_mode) |
+			 V_SCMD_HMAC_CTRL(k_ctx->hmac_ctrl) |
+			 V_SCMD_IV_SIZE(k_ctx->iv_size));
 
-	if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
-		toep->tls.iv_len = 8;
-	else
-		toep->tls.iv_len = AES_BLOCK_LEN;
+		toep->tls.scmd0.ivgen_hdrlen =
+			(V_SCMD_IV_GEN_CTRL(k_ctx->iv_ctrl) |
+			 V_SCMD_KEY_CTX_INLINE(0) |
+			 V_SCMD_TLS_FRAG_ENABLE(1));
 
-	toep->tls.mac_length = k_ctx->mac_secret_size;
+		if (tls->params.cipher_algorithm == CRYPTO_AES_NIST_GCM_16)
+			toep->tls.iv_len = 8;
+		else
+			toep->tls.iv_len = AES_BLOCK_LEN;
 
-	toep->tls.tx_key_addr = -1;
+		toep->tls.mac_length = k_ctx->mac_secret_size;
 
-	error = tls_program_key_id(toep, k_ctx);
-	if (error)
-		return (error);
+		toep->tls.fcplenmax = get_tp_plen_max(&toep->tls);
+		toep->tls.expn_per_ulp = tls->params.tls_hlen +
+		    tls->params.tls_tlen;
+		toep->tls.pdus_per_ulp = 1;
+		toep->tls.adjusted_plen = toep->tls.expn_per_ulp +
+		    toep->tls.k_ctx.frag_size;
+	} else {
+		/* Stop timer on handshake completion */
+		tls_stop_handshake_timer(toep);
 
-	toep->tls.fcplenmax = get_tp_plen_max(&toep->tls);
-	toep->tls.expn_per_ulp = tls->params.tls_hlen + tls->params.tls_tlen;
-	toep->tls.pdus_per_ulp = 1;
-	toep->tls.adjusted_plen = toep->tls.expn_per_ulp +
-	    toep->tls.k_ctx.frag_size;
+		toep->flags &= ~TPF_FORCE_CREDITS;
 
+		/*
+		 * RX key tags are an index into the key portion of MA
+		 * memory stored as an offset from the base address in
+		 * units of 64 bytes.
+		 */
+		key_offset = toep->tls.rx_key_addr - sc->vres.key.start;
+		t4_set_tls_keyid(toep, key_offset / 64);
+		t4_set_tls_tcb_field(toep, W_TCB_ULP_RAW,
+				 V_TCB_ULP_RAW(M_TCB_ULP_RAW),
+				 V_TCB_ULP_RAW((V_TF_TLS_KEY_SIZE(3) |
+						V_TF_TLS_CONTROL(1) |
+						V_TF_TLS_ACTIVE(1) |
+						V_TF_TLS_ENABLE(1))));
+		t4_set_tls_tcb_field(toep, W_TCB_TLS_SEQ,
+				 V_TCB_TLS_SEQ(M_TCB_TLS_SEQ),
+				 V_TCB_TLS_SEQ(0));
+		t4_clear_rx_quiesce(toep);
+	}
+
 	toep->tls.mode = TLS_MODE_KTLS;
 
 	return (0);
@@ -1671,7 +1726,7 @@ t4_push_ktls(struct adapter *sc, struct toepcb *toep, 
 	    ("%s: flowc_wr not sent for tid %u.", __func__, toep->tid));
 
 	KASSERT(ulp_mode(toep) == ULP_MODE_NONE ||
-	    ulp_mode(toep) == ULP_MODE_TCPDDP,
+	    ulp_mode(toep) == ULP_MODE_TCPDDP || ulp_mode(toep) == ULP_MODE_TLS,
 	    ("%s: ulp_mode %u for toep %p", __func__, ulp_mode(toep), toep));
 	KASSERT(tls_tx_key(toep),
 	    ("%s: TX key not set for toep %p", __func__, toep));
@@ -1956,6 +2011,10 @@ do_rx_tls_cmp(struct sge_iq *iq, const struct rss_head
 	struct socket *so;
 	struct sockbuf *sb;
 	struct mbuf *tls_data;
+#ifdef KERN_TLS
+	struct tls_get_record *tgr;
+	struct mbuf *control;
+#endif
 	int len, pdu_length, rx_credits;
 
 	KASSERT(toep->tid == tid, ("%s: toep tid/atid mismatch", __func__));
@@ -1982,6 +2041,7 @@ do_rx_tls_cmp(struct sge_iq *iq, const struct rss_head
 
 	pdu_length = G_CPL_RX_TLS_CMP_PDULENGTH(be32toh(cpl->pdulength_length));

*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***



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