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
This commit is contained in:
Andriy Gapon 2019-10-10 07:39:41 +00:00
parent f2521a76ed
commit d0c0856f63
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=353381
15 changed files with 304 additions and 173 deletions

112
share/man/man4/superio.4 Normal file
View File

@ -0,0 +1,112 @@
.\"
.\" SPDX-License-Identifier: BSD-2-Clause-FreeBSD
.\"
.\" Copyright (c) 2019 Andriy Gapon <avg@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@FreeBSD.org .

190
share/man/man9/superio.9 Normal file
View File

@ -0,0 +1,190 @@
.\"
.\" SPDX-License-Identifier: BSD-2-Clause-FreeBSD
.\"
.\" Copyright (c) 2019 Andriy Gapon <avg@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@FreeBSD.org

View File

@ -120,9 +120,3 @@ atomic_cas_64(volatile uint64_t *target, uint64_t cmp, uint64_t newval)
return (oldval);
}
#endif
void
membar_producer(void)
{
/* nothing */
}

View File

@ -47,7 +47,7 @@ extern uint64_t atomic_cas_64(volatile uint64_t *target, uint64_t cmp,
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)

View File

@ -1,35 +0,0 @@
/*-
* Copyright (C) 2015 Andrew Turner
* All rights reserved.
*
* 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$
*/
#include <machine/asm.h>
ENTRY(membar_producer)
dmb ish
ret
END(membar_producer)

View File

@ -1,34 +0,0 @@
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright (c) 2004, 2010, Oracle and/or its affiliates. All rights reserved.
*/
.file "atomic.s"
#define _ASM
#include <sys/asm_linkage.h>
ENTRY(membar_producer)
sfence
ret
SET_SIZE(membar_producer)

View File

@ -131,9 +131,3 @@
popl %esi
ret
SET_SIZE(atomic_load_64)
ENTRY(membar_producer)
lock
xorl $0, (%esp)
ret
SET_SIZE(membar_producer)

View File

@ -1,33 +0,0 @@
/*-
* Copyright (C) 2010 Nathan Whitehorn
* All rights reserved.
*
* 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 ``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 TOOLS GMBH 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$
*/
#include <machine/asm.h>
ENTRY(membar_producer)
eieio
blr

View File

@ -1,52 +0,0 @@
/*
* CDDL HEADER START
*
* The contents of this file are subject to the terms of the
* Common Development and Distribution License (the "License").
* You may not use this file except in compliance with the License.
*
* You can obtain a copy of the license at usr/src/OPENSOLARIS.LICENSE
* or http://www.opensolaris.org/os/licensing.
* See the License for the specific language governing permissions
* and limitations under the License.
*
* When distributing Covered Code, include this CDDL HEADER in each
* file and include the License file at usr/src/OPENSOLARIS.LICENSE.
* If applicable, add the following below this CDDL HEADER, with the
* fields enclosed by brackets "[]" replaced with your own identifying
* information: Portions Copyright [yyyy] [name of copyright owner]
*
* CDDL HEADER END
*/
/*
* Copyright 2007 Sun Microsystems, Inc. All rights reserved.
* Use is subject to license terms.
*/
.ident "%Z%%M% %I% %E% SMI"
.file "%M%"
#define _ASM
#include <sys/asm_linkage.h>
#include <machine/asi.h>
/* Userland needs different ASIs. */
#ifdef _KERNEL
#define __ASI_ATOMIC ASI_N
#else
#define __ASI_ATOMIC ASI_P
#endif
/*
* Spitfires and Blackbirds have a problem with membars in the
* delay slot (SF_ERRATA_51). For safety's sake, we assume
* that the whole world needs the workaround.
*/
ENTRY(membar_producer)
membar #StoreStore
retl
nop
SET_SIZE(membar_producer)

View File

@ -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

View File

@ -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}"

View File

@ -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}"

View File

@ -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}"

View File

@ -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}"

View File

@ -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