svn commit: r353381 - in head: share/man/man4 share/man/man9 sys/cddl/compat/opensolaris/kern sys/cddl/compat/opensolaris/sys sys/cddl/contrib/opensolaris/common/atomic/aarch64 sys/cddl/contrib/ope...

Andriy Gapon avg at FreeBSD.org
Thu Oct 10 07:39:43 UTC 2019


Author: avg
Date: Thu Oct 10 07:39:41 2019
New Revision: 353381
URL: https://svnweb.freebsd.org/changeset/base/353381

Log:
  emulate illumos membar_producer with atomic_thread_fence_rel
  
  membar_producer is supposed to be a store-store barrier.
  Also, in the code that FreeBSD has ported from illumos membar_producer
  is used only with regular stores to regular memory (with respect to
  caching).
  
  We do not have an MI primitive for the store-store barrier, so
  atomic_thread_fence_rel is the closest we have as it provides
  (load | store) -> store barrier.
  
  Previously, membar_producer was an empty function call on all 32-bit
  arm-s, 32-bit powerpc, riscv and all mips variants.  I think that it was
  inadequate.
  On other platforms, such as amd64, arm64, i386, powerpc64, sparc64,
  membar_producer was implemented using stronger primitives than required
  for a store-store barrier with respect to regular memory access.
  For example, it used sfence on amd64 and lock-ed nop in i386 (despite TSO).
  On powerpc64 we now use recommended lwsync instead of eieio.
  On sparc64 FreeBSD uses TSO mode.
  On arm64/aarch64 we now use dmb sy instead of dmb ish.  Not sure if this
  is an improvement, actually.
  
  After this change we can drop opensolaris_atomic.S for aarch64, amd64,
  powerpc64 and sparc64 as all required atomic operations have either
  direct or light-weight mapping to FreeBSD native atomic operations.
  
  Discussed with:	kib
  MFC after:	4 weeks

Added:
  head/share/man/man4/superio.4   (contents, props changed)
  head/share/man/man9/superio.9   (contents, props changed)
Deleted:
  head/sys/cddl/contrib/opensolaris/common/atomic/aarch64/opensolaris_atomic.S
  head/sys/cddl/contrib/opensolaris/common/atomic/amd64/opensolaris_atomic.S
  head/sys/cddl/contrib/opensolaris/common/atomic/powerpc64/opensolaris_atomic.S
  head/sys/cddl/contrib/opensolaris/common/atomic/sparc64/opensolaris_atomic.S
Modified:
  head/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c
  head/sys/cddl/compat/opensolaris/sys/atomic.h
  head/sys/cddl/contrib/opensolaris/common/atomic/i386/opensolaris_atomic.S
  head/sys/conf/files.amd64
  head/sys/conf/files.arm
  head/sys/conf/files.arm64
  head/sys/conf/files.powerpc
  head/sys/conf/files.riscv
  head/sys/conf/files.sparc64

Added: head/share/man/man4/superio.4
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/man/man4/superio.4	Thu Oct 10 07:39:41 2019	(r353381)
@@ -0,0 +1,112 @@
+.\"
+.\" SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+.\"
+.\" Copyright (c) 2019 Andriy Gapon <avg at FreeBSD.org>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd October 9, 2019
+.Dt SUPERIO 4
+.Os
+.Sh NAME
+.Nm superio
+.Nd Super I/O controller and bus driver
+.Sh SYNOPSIS
+To compile this driver into the kernel,
+place the following line in your
+kernel configuration file:
+.Bd -ragged -offset indent
+.Cd "device superio"
+.Ed
+.Pp
+Alternatively, to load the driver as a
+module at boot time, place the following line in
+.Xr loader.conf 5 :
+.Bd -literal -offset indent
+superio_load="YES"
+.Ed
+.Sh DESCRIPTION
+Super I/O is an I/O controller that combines various low-bandwidth devices
+that can be functionally unrelated otherwise.
+A typical Super I/O can contain devices such as
+.Bl -bullet -compact
+.It
+a floppy disk controller
+.It
+a parallel port
+.It
+a serial port
+.It
+a PS/2 mouse and keyboard controller
+.It
+a hardware monitoring controller
+.It
+a watchdog timer
+.It
+a controller for general purpose input-output
+.El
+.Pp
+The
+.Nm
+driver provides support for devices residing in the Super I/O controller
+that can only be accessed or discovered using the controller's interface.
+Some of the Super I/O devices have standardized interfaces.
+Such devices either use well-known legacy resources or they are advertised
+via ACPI or both.
+They can be configured either using ISA bus hints or they are auto-aconfigured by
+.Xr acpi 4 .
+The
+.Nm
+driver is not designed to interact with that kind of devices.
+They can be handled by their respective drivers without any knowledge of the
+Super I/O specifics.
+For instance,
+.Xr fdc 4
+provides access to the floppy disk controller.
+.Pp
+There are other Super I/O devices that do not have any standardized interface.
+Drivers for those devices can be written using facilities of the
+.Nm
+driver.
+.Pp
+The driver itself attaches to the ISA bus as all supported controllers are
+accessed via LPC I/O ports.
+.Pp
+The
+.Nm
+driver is unusual as it is both a controller driver for a variety of Super I/O
+controllers and a bus driver for supported devices in those controllers.
+.Sh HARDWARE
+The
+.Nm
+driver supports a multitude of Super I/O controllers produced by Nuvoton,
+formerly known as Winbond, and ITE.
+.Sh SEE ALSO
+.Pp
+.Xr superio 9
+.Sh HISTORY
+The
+.Nm
+driver was written by
+.An Andriy Gapon Aq Mt avg at FreeBSD.org .

Added: head/share/man/man9/superio.9
==============================================================================
--- /dev/null	00:00:00 1970	(empty, because file is newly added)
+++ head/share/man/man9/superio.9	Thu Oct 10 07:39:41 2019	(r353381)
@@ -0,0 +1,190 @@
+.\"
+.\" SPDX-License-Identifier: BSD-2-Clause-FreeBSD
+.\"
+.\" Copyright (c) 2019 Andriy Gapon <avg at FreeBSD.org>
+.\"
+.\" Redistribution and use in source and binary forms, with or without
+.\" modification, are permitted provided that the following conditions
+.\" are met:
+.\" 1. Redistributions of source code must retain the above copyright
+.\"    notice, this list of conditions and the following disclaimer.
+.\" 2. Redistributions in binary form must reproduce the above copyright
+.\"    notice, this list of conditions and the following disclaimer in the
+.\"    documentation and/or other materials provided with the distribution.
+.\"
+.\" THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+.\" SUCH DAMAGE.
+.\"
+.\" $FreeBSD$
+.\"
+.Dd October 9, 2019
+.Dt SUPERIO 9
+.Os
+.Sh NAME
+.Nm superio ,
+.Nm superio_devid ,
+.Nm superio_dev_disable ,
+.Nm superio_dev_enable ,
+.Nm superio_dev_enabled ,
+.Nm superio_find_dev ,
+.Nm superio_get_dma ,
+.Nm superio_get_iobase ,
+.Nm superio_get_irq ,
+.Nm superio_get_ldn ,
+.Nm superio_get_type ,
+.Nm superio_read ,
+.Nm superio_revid ,
+.Nm superio_vendor ,
+.Nm superio_write
+.Nd Super I/O bus interface
+.Sh SYNOPSIS
+.In sys/bus.h
+.In dev/superio/superio.h
+.Ft uint16_t
+.Fn superio_devid "device_t dev"
+.Ft void
+.Fn superio_dev_disable "device_t dev" "uint8_t mask"
+.Ft void
+.Fn superio_dev_enable "device_t dev" "uint8_t mask"
+.Ft bool
+.Fn superio_dev_enabled "device_t dev" "uint8_t mask"
+.Ft device_t
+.Fn superio_find_dev "device_t dev" "superio_dev_type_t type" "int ldn"
+.Ft uint8_t
+.Fn superio_get_dma "device_t dev"
+.Ft uint16_t
+.Fn superio_get_iobase "device_t dev"
+.Ft uint8_t
+.Fn superio_get_irq "device_t dev"
+.Ft uint8_t
+.Fn superio_get_ldn "device_t dev"
+.Ft superio_dev_type_t
+.Fn superio_get_type "device_t dev"
+.Ft uint8_t
+.Fn superio_read "device_t dev" "uint8_t reg"
+.Ft uint8_t
+.Fn superio_revid "device_t dev"
+.Ft superio_vendor_t
+.Fn superio_vendor "device_t dev"
+.Ft void
+.Fn superio_write "device_t dev" "uint8_t reg" "uint8_t val"
+.Sh DESCRIPTION
+The
+.Nm
+set of functions are used for managing Super I/O devices.
+The functions provide support for
+raw configuration access,
+locating devices,
+device information,
+and
+device configuration.
+.Ss The controller interface
+The
+.Fn superio_vendor
+function is used to get a vendor of the Super I/O controller
+.Fa dev .
+Possible return values are
+.Dv SUPERIO_VENDOR_ITE
+and
+.Dv SUPERIO_VENDOR_NUVOTON .
+.Pp
+The
+.Fn superio_devid
+function is used to get a device ID of the Super I/O controller
+.Fa dev .
+.Pp
+The
+.Fn superio_revid
+function is used to get a revision ID of the Super I/O controller
+.Fa dev .
+.Pp
+The
+.Fn superio_find_dev
+function is used to find a device on the
+.Xr superio 4
+bus, specified by
+.Fa dev,
+that has the requested type and logical device number.
+Either of those, but not both, can be a wildcard.
+Supported types are
+.Dv SUPERIO_DEV_GPIO ,
+.Dv SUPERIO_DEV_HWM ,
+and
+.Dv SUPERIO_DEV_WDT.
+The wildcard value for
+.Fa type
+is
+.Dv SUPERIO_DEV_NONE.
+The wildcard value for
+.Fa ldn
+is -1.
+.Ss The device interface
+The
+.Fn superio_read
+function is used to read data from the Super I/O configuration register
+of the device
+.Fa dev.
+.Pp
+The
+.Fn superio_write
+function is used to write data to the Super I/O configuration register
+of the device
+.Fa dev.
+.Pp
+The
+.Fn superio_dev_enable ,
+.Fn superio_dev_disable ,
+and
+.Fn superio_dev_enabled
+functions are used to enable, disable, or check status of the device
+.Fa dev.
+The
+.Fa mask
+parameter selects sub-functions of a device that supports them.
+For devices that do not have sub-functions,
+.Fa mask
+should be set to 1.
+.Ss The accessor interface
+The
+.Fn superio_get_dma
+is used to get a DMA channel number configured for the device
+.Fa dev .
+.Pp
+The
+.Fn superio_get_iobase
+is used to get a base I/O port configured for the device
+.Fa dev .
+The device may expose additional or alternative configuration access via
+the I/O ports.
+.Pp
+The
+.Fn superio_get_irq
+is used to get an interrupt number configured for the device
+.Fa dev .
+.Pp
+The
+.Fn superio_get_ldn
+is used to get a Logical Device Number of the device
+.Fa dev .
+.Pp
+The
+.Fn superio_get_type
+is used to get a type of the device
+.Fa dev .
+.Pp
+.Sh SEE ALSO
+.Xr superio 4 ,
+.Xr device 9 ,
+.Xr driver 9 ,
+.Sh AUTHORS
+This manual page was written by
+.An Andriy Gapon Mt avg at FreeBSD.org

Modified: head/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c
==============================================================================
--- head/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c	Thu Oct 10 03:12:17 2019	(r353380)
+++ head/sys/cddl/compat/opensolaris/kern/opensolaris_atomic.c	Thu Oct 10 07:39:41 2019	(r353381)
@@ -120,9 +120,3 @@ atomic_cas_64(volatile uint64_t *target, uint64_t cmp,
 	return (oldval);
 }
 #endif
-
-void
-membar_producer(void)
-{
-	/* nothing */
-}

Modified: head/sys/cddl/compat/opensolaris/sys/atomic.h
==============================================================================
--- head/sys/cddl/compat/opensolaris/sys/atomic.h	Thu Oct 10 03:12:17 2019	(r353380)
+++ head/sys/cddl/compat/opensolaris/sys/atomic.h	Thu Oct 10 07:39:41 2019	(r353381)
@@ -47,7 +47,7 @@ extern uint64_t atomic_cas_64(volatile uint64_t *targe
     uint64_t newval);
 #endif
 
-extern void membar_producer(void);
+#define	membar_producer	atomic_thread_fence_rel
 
 static __inline uint32_t
 atomic_add_32_nv(volatile uint32_t *target, int32_t delta)

Modified: head/sys/cddl/contrib/opensolaris/common/atomic/i386/opensolaris_atomic.S
==============================================================================
--- head/sys/cddl/contrib/opensolaris/common/atomic/i386/opensolaris_atomic.S	Thu Oct 10 03:12:17 2019	(r353380)
+++ head/sys/cddl/contrib/opensolaris/common/atomic/i386/opensolaris_atomic.S	Thu Oct 10 07:39:41 2019	(r353381)
@@ -131,9 +131,3 @@
 	popl	%esi
 	ret
 	SET_SIZE(atomic_load_64)
-
-	ENTRY(membar_producer)
-	lock
-	xorl	$0, (%esp)
-	ret
-	SET_SIZE(membar_producer)

Modified: head/sys/conf/files.amd64
==============================================================================
--- head/sys/conf/files.amd64	Thu Oct 10 03:12:17 2019	(r353380)
+++ head/sys/conf/files.amd64	Thu Oct 10 07:39:41 2019	(r353381)
@@ -141,7 +141,6 @@ amd64/amd64/vm_machdep.c	standard
 amd64/cloudabi32/cloudabi32_sysvec.c		optional compat_cloudabi32
 amd64/cloudabi64/cloudabi64_sysvec.c		optional compat_cloudabi64
 amd64/pci/pci_cfgreg.c		optional	pci
-cddl/contrib/opensolaris/common/atomic/amd64/opensolaris_atomic.S	optional zfs | dtrace compile-with "${ZFS_S}"
 cddl/dev/dtrace/amd64/dtrace_asm.S			optional dtrace compile-with "${DTRACE_S}"
 cddl/dev/dtrace/amd64/dtrace_subr.c			optional dtrace compile-with "${DTRACE_C}"
 crypto/aesni/aeskeys_amd64.S	optional aesni

Modified: head/sys/conf/files.arm
==============================================================================
--- head/sys/conf/files.arm	Thu Oct 10 03:12:17 2019	(r353380)
+++ head/sys/conf/files.arm	Thu Oct 10 07:39:41 2019	(r353381)
@@ -94,7 +94,7 @@ board_id.h			standard				   \
 	compile-with	"${AWK} -f $S/arm/conf/genboardid.awk $S/arm/conf/mach-types > board_id.h" \
 	no-obj no-implicit-rule before-depend				   \
 	clean		"board_id.h"
-cddl/compat/opensolaris/kern/opensolaris_atomic.c	optional zfs | dtrace compile-with "${CDDL_C}"
+cddl/compat/opensolaris/kern/opensolaris_atomic.c	optional !armv7 !armv6 zfs | !armv7 !armv6 dtrace compile-with "${CDDL_C}"
 cddl/dev/dtrace/arm/dtrace_asm.S			optional dtrace compile-with "${DTRACE_S}"
 cddl/dev/dtrace/arm/dtrace_subr.c			optional dtrace compile-with "${DTRACE_C}"
 cddl/dev/fbt/arm/fbt_isa.c				optional dtrace_fbt | dtraceall compile-with "${FBT_C}"

Modified: head/sys/conf/files.arm64
==============================================================================
--- head/sys/conf/files.arm64	Thu Oct 10 03:12:17 2019	(r353380)
+++ head/sys/conf/files.arm64	Thu Oct 10 07:39:41 2019	(r353381)
@@ -271,7 +271,6 @@ libkern/bcmp.c			standard
 libkern/memcmp.c		standard
 libkern/memset.c		standard
 libkern/arm64/crc32c_armv8.S	standard
-cddl/contrib/opensolaris/common/atomic/aarch64/opensolaris_atomic.S	optional zfs | dtrace compile-with "${CDDL_C}"
 cddl/dev/dtrace/aarch64/dtrace_asm.S			optional dtrace compile-with "${DTRACE_S}"
 cddl/dev/dtrace/aarch64/dtrace_subr.c			optional dtrace compile-with "${DTRACE_C}"
 cddl/dev/fbt/aarch64/fbt_isa.c				optional dtrace_fbt | dtraceall compile-with "${FBT_C}"

Modified: head/sys/conf/files.powerpc
==============================================================================
--- head/sys/conf/files.powerpc	Thu Oct 10 03:12:17 2019	(r353380)
+++ head/sys/conf/files.powerpc	Thu Oct 10 07:39:41 2019	(r353381)
@@ -16,7 +16,6 @@ font.h				optional	sc			\
 #
 # There is only an asm version on ppc64.
 cddl/compat/opensolaris/kern/opensolaris_atomic.c			optional zfs powerpc | dtrace powerpc | zfs powerpcspe | dtrace powerpcspe compile-with "${ZFS_C}"
-cddl/contrib/opensolaris/common/atomic/powerpc64/opensolaris_atomic.S	optional zfs powerpc64 | dtrace powerpc64 compile-with "${ZFS_S}"
 cddl/dev/dtrace/powerpc/dtrace_asm.S		optional dtrace compile-with "${DTRACE_S}"
 cddl/dev/dtrace/powerpc/dtrace_subr.c		optional dtrace compile-with "${DTRACE_C}"
 cddl/dev/fbt/powerpc/fbt_isa.c			optional dtrace_fbt | dtraceall compile-with "${FBT_C}"

Modified: head/sys/conf/files.riscv
==============================================================================
--- head/sys/conf/files.riscv	Thu Oct 10 03:12:17 2019	(r353380)
+++ head/sys/conf/files.riscv	Thu Oct 10 07:39:41 2019	(r353381)
@@ -1,5 +1,4 @@
 # $FreeBSD$
-cddl/compat/opensolaris/kern/opensolaris_atomic.c	optional zfs | dtrace compile-with "${CDDL_C}"
 cddl/dev/dtrace/riscv/dtrace_asm.S			optional dtrace compile-with "${DTRACE_S}"
 cddl/dev/dtrace/riscv/dtrace_subr.c			optional dtrace compile-with "${DTRACE_C}"
 cddl/dev/fbt/riscv/fbt_isa.c				optional dtrace_fbt | dtraceall compile-with "${FBT_C}"

Modified: head/sys/conf/files.sparc64
==============================================================================
--- head/sys/conf/files.sparc64	Thu Oct 10 03:12:17 2019	(r353380)
+++ head/sys/conf/files.sparc64	Thu Oct 10 07:39:41 2019	(r353381)
@@ -17,7 +17,6 @@ sunkbdmap.h			optional	sunkbd_dflt_keymap	\
 	no-obj no-implicit-rule before-depend				\
 	clean		"sunkbdmap.h"
 #
-cddl/contrib/opensolaris/common/atomic/sparc64/opensolaris_atomic.S	optional zfs compile-with "${ZFS_S}"
 crypto/blowfish/bf_enc.c	optional	crypto | ipsec | ipsec_support
 crypto/des/des_enc.c		optional	crypto | ipsec | ipsec_support | netsmb
 dev/atkbdc/atkbd.c		optional	atkbd atkbdc


More information about the svn-src-head mailing list