git: 83d6d8877ef7 - main - powerpc64*: port mlx5, OFED, KTLS and krping

From: Piotr Kubaj <pkubaj_at_FreeBSD.org>
Date: Sat, 25 Feb 2023 23:57:02 UTC
The branch main has been updated by pkubaj:

URL: https://cgit.FreeBSD.org/src/commit/?id=83d6d8877ef7dad4f4e8f409a01c9f28139cd026

commit 83d6d8877ef7dad4f4e8f409a01c9f28139cd026
Author:     Piotr Kubaj <pkubaj@FreeBSD.org>
AuthorDate: 2023-02-25 21:09:41 +0000
Commit:     Piotr Kubaj <pkubaj@FreeBSD.org>
CommitDate: 2023-02-25 23:56:37 +0000

    powerpc64*: port mlx5, OFED, KTLS and krping
    
    Summary:
    This review ports mlx5 driver, kernel's OFED stack (userland is already enabled), KTLS and krping to powerpc64 and powerpc64le.
    
    krping requires a small change since it uses assembly for amd64 / i386.
    
    NOTE: On powerpc64le RDMA works fine in the userspace with libmlx5, but on powerpc64 it does not. The problem is that contrib/ofed/libmlx5/doorbell.h checks for SIZEOF_LONG but this macro exists on neither powerpc64* nor amd64. Thus, the file silently goes to the fallback function written for 32-bit architectures. It works fine on little-endian architectures, but causes a hard fail on big-endian. It's possible it may also cause some runtime issues on little-endian.
    Thus, on powerpc64 I verified that RDMA works with krping.
    
    Reviewers: #powerpc, hselasky
    
    Subscribers: bdrewery, imp, emaste, jhibbits
    
    Differential Revision: https://reviews.freebsd.org/D38786
---
 share/mk/src.opts.mk             |  4 ++--
 sys/conf/kern.opts.mk            |  3 ++-
 sys/contrib/rdma/krping/krping.c |  4 ++++
 sys/modules/Makefile             | 13 +++++++++++++
 sys/powerpc/conf/GENERIC64       | 10 ++++++++++
 sys/powerpc/conf/GENERIC64LE     | 10 ++++++++++
 6 files changed, 41 insertions(+), 3 deletions(-)

diff --git a/share/mk/src.opts.mk b/share/mk/src.opts.mk
index fe2159cd4f5e..8008a94ae329 100644
--- a/share/mk/src.opts.mk
+++ b/share/mk/src.opts.mk
@@ -318,8 +318,8 @@ BROKEN_OPTIONS+=LOADER_UBOOT
 BROKEN_OPTIONS+=LOADER_GELI LOADER_LUA
 .endif
 
-# Kernel TLS is enabled by default on amd64 and aarch64
-.if ${__T} == "aarch64" || ${__T} == "amd64"
+# Kernel TLS is enabled by default on amd64, aarch64 and powerpc64*
+.if ${__T} == "aarch64" || ${__T} == "amd64" || ${__T:Mpowerpc64*} != ""
 __DEFAULT_YES_OPTIONS+=OPENSSL_KTLS
 .else
 __DEFAULT_NO_OPTIONS+=OPENSSL_KTLS
diff --git a/sys/conf/kern.opts.mk b/sys/conf/kern.opts.mk
index 5cda70156394..93edc1b6e63f 100644
--- a/sys/conf/kern.opts.mk
+++ b/sys/conf/kern.opts.mk
@@ -84,7 +84,8 @@ BROKEN_OPTIONS+= ZFS
 
 # Things that don't work because the kernel doesn't have the support
 # for them.
-.if ${MACHINE} != "i386" && ${MACHINE} != "amd64"
+.if ${MACHINE} != "i386" && ${MACHINE} != "amd64" && \
+    ${MACHINE_ARCH:Mpowerpc64*} == ""
 BROKEN_OPTIONS+= OFED
 .endif
 
diff --git a/sys/contrib/rdma/krping/krping.c b/sys/contrib/rdma/krping/krping.c
index 182e5f111028..98f129597464 100644
--- a/sys/contrib/rdma/krping/krping.c
+++ b/sys/contrib/rdma/krping/krping.c
@@ -69,9 +69,13 @@ MODULE_DEPEND(krping, linuxkpi, 1, 1, 1);
 static __inline uint64_t
 get_cycles(void)
 {
+#if defined(__amd64__) || defined(__i386__)
 	uint32_t low, high;
 	__asm __volatile("rdtsc" : "=a" (low), "=d" (high));
 	return (low | ((u_int64_t)high << 32));
+#elif defined(__powerpc64__)
+	return __builtin_readcyclecounter();
+#endif
 }
 
 typedef uint64_t cycles_t;
diff --git a/sys/modules/Makefile b/sys/modules/Makefile
index 9c2664460067..4397c7beb56e 100644
--- a/sys/modules/Makefile
+++ b/sys/modules/Makefile
@@ -843,8 +843,21 @@ _nvme=		nvme
 .if ${MACHINE_ARCH:Mpowerpc64*} != ""
 _ipmi=		ipmi
 _ixl=		ixl
+_mlx5=		mlx5
 _nvram=		opal_nvram
+.if ${MK_OFED} != "no" || defined(ALL_MODULES)
+_ibcore=	ibcore
+_ipoib=		ipoib
+_iser=		iser
+_mlx5ib=	mlx5ib
+_rdma=		rdma
+.endif
+.if (${MK_INET_SUPPORT} != "no" && ${MK_INET6_SUPPORT} != "no") || \
+       defined(ALL_MODULES)
+_mlx5en=	mlx5en
+.endif
 .endif
+
 .if ${MACHINE_CPUARCH} == "powerpc" && ${MACHINE_ARCH} != "powerpcspe"
 # Don't build powermac_nvram for powerpcspe, it's never supported.
 _nvram+=	powermac_nvram
diff --git a/sys/powerpc/conf/GENERIC64 b/sys/powerpc/conf/GENERIC64
index ab36e2032203..6c40b031bee6 100644
--- a/sys/powerpc/conf/GENERIC64
+++ b/sys/powerpc/conf/GENERIC64
@@ -49,6 +49,7 @@ options 	TCP_BLACKBOX		# Enhanced TCP event logging
 options 	TCP_HHOOK		# hhook(9) framework for TCP
 options 	TCP_RFC7413		# TCP Fast Open
 options 	SCTP_SUPPORT		# Allow kldload of SCTP
+options		KERN_TLS		# TLS transmit & receive offload
 options 	FFS			# Berkeley Fast Filesystem
 options 	SOFTUPDATES		# Enable FFS soft updates support
 options 	UFS_ACL			# Support for access control lists
@@ -128,6 +129,8 @@ device		pci
 options 	PCI_HP			# PCI-Express native HotPlug
 device		agp
 
+options		COMPAT_LINUXKPI
+
 # ATA controllers
 device		ahci		# AHCI-compatible SATA controllers
 device		ata		# Legacy ATA/SATA controllers
@@ -189,6 +192,12 @@ device		fxp		# Intel EtherExpress PRO/100B (82557, 82558)
 device		re		# RealTek 8139C+/8169/8169S/8110S
 device		rl		# RealTek 8129/8139
 
+# Nvidia/Mellanox Connect-X 4 and later, Ethernet only
+# mlx5ib requires ibcore infra and is not included by default
+device		mlx5		# Base driver
+device		mlxfw		# Firmware update
+device		mlx5en		# Ethernet driver
+
 # Pseudo devices.
 device		crypto		# core crypto support
 device		loop		# Network loopback
@@ -199,6 +208,7 @@ device		md		# Memory "disks"
 device		ofwd		# Open Firmware disks
 device		gif		# IPv6 and IPv4 tunneling
 device		firmware	# firmware assist module
+device		xz		# lzma decompression
 
 # The `bpf' device enables the Berkeley Packet Filter.
 # Be aware of the administrative consequences of enabling this!
diff --git a/sys/powerpc/conf/GENERIC64LE b/sys/powerpc/conf/GENERIC64LE
index ffb43628d2b1..99d1975442f7 100644
--- a/sys/powerpc/conf/GENERIC64LE
+++ b/sys/powerpc/conf/GENERIC64LE
@@ -46,6 +46,7 @@ options 	TCP_BLACKBOX		# Enhanced TCP event logging
 options 	TCP_HHOOK		# hhook(9) framework for TCP
 options 	TCP_RFC7413		# TCP Fast Open
 options 	SCTP_SUPPORT		# Allow kldload of SCTP
+options		KERN_TLS		# TLS transmit & receive offload
 options 	FFS			# Berkeley Fast Filesystem
 options 	SOFTUPDATES		# Enable FFS soft updates support
 options 	UFS_ACL			# Support for access control lists
@@ -123,6 +124,8 @@ device		pci
 options 	PCI_HP			# PCI-Express native HotPlug
 device		agp
 
+options		COMPAT_LINUXKPI
+
 # ATA controllers
 device		ahci		# AHCI-compatible SATA controllers
 device		ata		# Legacy ATA/SATA controllers
@@ -184,6 +187,12 @@ device		fxp		# Intel EtherExpress PRO/100B (82557, 82558)
 device		re		# RealTek 8139C+/8169/8169S/8110S
 device		rl		# RealTek 8129/8139
 
+# Nvidia/Mellanox Connect-X 4 and later, Ethernet only
+# mlx5ib requires ibcore infra and is not included by default
+device		mlx5		# Base driver
+device		mlxfw		# Firmware update
+device		mlx5en		# Ethernet driver
+
 # Pseudo devices.
 device		crypto		# core crypto support
 device		loop		# Network loopback
@@ -194,6 +203,7 @@ device		md		# Memory "disks"
 device		ofwd		# Open Firmware disks
 device		gif		# IPv6 and IPv4 tunneling
 device		firmware	# firmware assist module
+device		xz		# lzma decompression
 
 # The `bpf' device enables the Berkeley Packet Filter.
 # Be aware of the administrative consequences of enabling this!