From owner-svn-src-head@freebsd.org Fri Oct 2 18:28:02 2020 Return-Path: Delivered-To: svn-src-head@mailman.nyi.freebsd.org Received: from mx1.freebsd.org (mx1.freebsd.org [IPv6:2610:1c1:1:606c::19:1]) by mailman.nyi.freebsd.org (Postfix) with ESMTP id 07B8E43399F; Fri, 2 Oct 2020 18:28:02 +0000 (UTC) (envelope-from manu@FreeBSD.org) Received: from mxrelay.nyi.freebsd.org (mxrelay.nyi.freebsd.org [IPv6:2610:1c1:1:606c::19:3]) (using TLSv1.3 with cipher TLS_AES_256_GCM_SHA384 (256/256 bits) key-exchange X25519 server-signature RSA-PSS (4096 bits) server-digest SHA256 client-signature RSA-PSS (4096 bits) client-digest SHA256) (Client CN "mxrelay.nyi.freebsd.org", Issuer "Let's Encrypt Authority X3" (verified OK)) by mx1.freebsd.org (Postfix) with ESMTPS id 4C2z4x6SlHz4VGm; Fri, 2 Oct 2020 18:28:01 +0000 (UTC) (envelope-from manu@FreeBSD.org) Received: from repo.freebsd.org (repo.freebsd.org [IPv6:2610:1c1:1:6068::e6a:0]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (Client did not present a certificate) by mxrelay.nyi.freebsd.org (Postfix) with ESMTPS id C1E5D261F8; Fri, 2 Oct 2020 18:28:01 +0000 (UTC) (envelope-from manu@FreeBSD.org) Received: from repo.freebsd.org ([127.0.1.37]) by repo.freebsd.org (8.15.2/8.15.2) with ESMTP id 092IS1H5023930; Fri, 2 Oct 2020 18:28:01 GMT (envelope-from manu@FreeBSD.org) Received: (from manu@localhost) by repo.freebsd.org (8.15.2/8.15.2/Submit) id 092IS0nS023923; Fri, 2 Oct 2020 18:28:00 GMT (envelope-from manu@FreeBSD.org) Message-Id: <202010021828.092IS0nS023923@repo.freebsd.org> X-Authentication-Warning: repo.freebsd.org: manu set sender to manu@FreeBSD.org using -f From: Emmanuel Vadot Date: Fri, 2 Oct 2020 18:28:00 +0000 (UTC) To: src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org Subject: svn commit: r366373 - in head/sys: compat/linuxkpi/common/include/linux compat/linuxkpi/common/src conf modules/linuxkpi X-SVN-Group: head X-SVN-Commit-Author: manu X-SVN-Commit-Paths: in head/sys: compat/linuxkpi/common/include/linux compat/linuxkpi/common/src conf modules/linuxkpi X-SVN-Commit-Revision: 366373 X-SVN-Commit-Repository: base MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit X-BeenThere: svn-src-head@freebsd.org X-Mailman-Version: 2.1.33 Precedence: list List-Id: SVN commit messages for the src tree for head/-current List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 02 Oct 2020 18:28:02 -0000 Author: manu Date: Fri Oct 2 18:28:00 2020 New Revision: 366373 URL: https://svnweb.freebsd.org/changeset/base/366373 Log: linuxkpi: Add dmi_* function dmi function are used to get smbios values. The DRM subsystem and drivers use it to enabled (or not) quirks. Reviewed by: hselasky Sponsored by: The FreeBSD Foundation Differential Revision: https://reviews.freebsd.org/D26046 Added: head/sys/compat/linuxkpi/common/include/linux/dmi.h (contents, props changed) head/sys/compat/linuxkpi/common/include/linux/mod_devicetable.h (contents, props changed) head/sys/compat/linuxkpi/common/src/linux_dmi.c (contents, props changed) Modified: head/sys/compat/linuxkpi/common/include/linux/fs.h head/sys/conf/files head/sys/modules/linuxkpi/Makefile Added: head/sys/compat/linuxkpi/common/include/linux/dmi.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/compat/linuxkpi/common/include/linux/dmi.h Fri Oct 2 18:28:00 2020 (r366373) @@ -0,0 +1,46 @@ +/*- + * Copyright (c) 2020 The FreeBSD Foundation + * + * This software was developed by Emmanuel Vadot under sponsorship + * from the FreeBSD Foundation. + * + * 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$ + */ + +#ifndef __LINUX_DMI_H__ +#define __LINUX_DMI_H__ + +#include + +int linux_dmi_check_system(const struct dmi_system_id *); +bool linux_dmi_match(enum dmi_field, const char *); +const struct dmi_system_id *linux_dmi_first_match(const struct dmi_system_id *); +const char *linux_dmi_get_system_info(int); + +#define dmi_check_system(sysid) linux_dmi_check_system(sysid) +#define dmi_match(f, str) linux_dmi_match(f, str) +#define dmi_first_match(sysid) linux_dmi_first_match(sysid) +#define dmi_get_system_info(sysid) linux_dmi_get_system_info(sysid) + +#endif /* __LINUX_DMI_H__ */ Modified: head/sys/compat/linuxkpi/common/include/linux/fs.h ============================================================================== --- head/sys/compat/linuxkpi/common/include/linux/fs.h Fri Oct 2 18:26:41 2020 (r366372) +++ head/sys/compat/linuxkpi/common/include/linux/fs.h Fri Oct 2 18:28:00 2020 (r366373) @@ -180,7 +180,7 @@ struct file_operations { #define FMODE_READ FREAD #define FMODE_WRITE FWRITE #define FMODE_EXEC FEXEC - +#define FMODE_UNSIGNED_OFFSET 0x2000 int __register_chrdev(unsigned int major, unsigned int baseminor, unsigned int count, const char *name, const struct file_operations *fops); Added: head/sys/compat/linuxkpi/common/include/linux/mod_devicetable.h ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/compat/linuxkpi/common/include/linux/mod_devicetable.h Fri Oct 2 18:28:00 2020 (r366373) @@ -0,0 +1,72 @@ +/*- + * Copyright (c) 2020 The FreeBSD Foundation + * + * This software was developed by Emmanuel Vadot under sponsorship + * from the FreeBSD Foundation. + * + * 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$ + */ + +#ifndef __LINUX_MOD_DEVICETABLE_H__ +#define __LINUX_MOD_DEVICETABLE_H__ + +enum dmi_field { + DMI_NONE, + DMI_BIOS_VENDOR, + DMI_BIOS_VERSION, + DMI_BIOS_DATE, + DMI_SYS_VENDOR, + DMI_PRODUCT_NAME, + DMI_PRODUCT_VERSION, + DMI_PRODUCT_SERIAL, + DMI_PRODUCT_UUID, + DMI_BOARD_VENDOR, + DMI_BOARD_NAME, + DMI_BOARD_VERSION, + DMI_BOARD_SERIAL, + DMI_BOARD_ASSET_TAG, + DMI_CHASSIS_VENDOR, + DMI_CHASSIS_TYPE, + DMI_CHASSIS_VERSION, + DMI_CHASSIS_SERIAL, + DMI_CHASSIS_ASSET_TAG, + DMI_STRING_MAX, +}; + +struct dmi_strmatch { + unsigned char slot; + char substr[79]; +}; + +struct dmi_system_id { + int (*callback)(const struct dmi_system_id *); + const char *ident; + struct dmi_strmatch matches[4]; + void *driver_data; +}; + +#define DMI_MATCH(a, b) { .slot = a, .substr = b } +#define DMI_EXACT_MATCH(a, b) { .slot = a, .substr = b, } + +#endif /* __LINUX_MOD_DEVICETABLE_H__ */ Added: head/sys/compat/linuxkpi/common/src/linux_dmi.c ============================================================================== --- /dev/null 00:00:00 1970 (empty, because file is newly added) +++ head/sys/compat/linuxkpi/common/src/linux_dmi.c Fri Oct 2 18:28:00 2020 (r366373) @@ -0,0 +1,140 @@ +/*- + * Copyright (c) 2020 The FreeBSD Foundation + * + * This software was developed by Emmanuel Vadot under sponsorship + * from the FreeBSD Foundation. + * + * 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 +#include +#include + +#include + +static char *dmi_data[DMI_STRING_MAX]; + +static void +linux_dmi_preload(void *arg) +{ + + dmi_data[DMI_BIOS_VENDOR] = kern_getenv("smbios.bios.vendor"); + dmi_data[DMI_BIOS_VERSION] = kern_getenv("smbios.bios.version"); + dmi_data[DMI_BIOS_DATE] = kern_getenv("smbios.bios.reldate"); + dmi_data[DMI_SYS_VENDOR] = kern_getenv("smbios.system.maker"); + dmi_data[DMI_PRODUCT_NAME] = kern_getenv("smbios.system.product"); + dmi_data[DMI_PRODUCT_VERSION] = kern_getenv("smbios.system.version"); + dmi_data[DMI_PRODUCT_SERIAL] = kern_getenv("smbios.system.serial"); + dmi_data[DMI_PRODUCT_UUID] = kern_getenv("smbios.system.uuid"); + dmi_data[DMI_BOARD_VENDOR] = kern_getenv("smbios.planar.maker"); + dmi_data[DMI_BOARD_NAME] = kern_getenv("smbios.planar.product"); + dmi_data[DMI_BOARD_VERSION] = kern_getenv("smbios.planar.version"); + dmi_data[DMI_BOARD_SERIAL] = kern_getenv("smbios.planar.serial"); + dmi_data[DMI_BOARD_ASSET_TAG] = kern_getenv("smbios.planar.tag"); + dmi_data[DMI_CHASSIS_VENDOR] = kern_getenv("smbios.chassis.maker"); + dmi_data[DMI_CHASSIS_TYPE] = kern_getenv("smbios.chassis.type"); + dmi_data[DMI_CHASSIS_VERSION] = kern_getenv("smbios.chassis.version"); + dmi_data[DMI_CHASSIS_SERIAL] = kern_getenv("smbios.chassis.serial"); + dmi_data[DMI_CHASSIS_ASSET_TAG] = kern_getenv("smbios.chassis.tag"); +} +SYSINIT(linux_dmi_preload, SI_SUB_DRIVERS, SI_ORDER_ANY, linux_dmi_preload, NULL); + +/* Match a system against a field */ +bool +linux_dmi_match(enum dmi_field f, const char *str) +{ + + if (f < DMI_STRING_MAX && + dmi_data[f] != NULL && + strcmp(dmi_data[f], str) == 0) + return(true); + return (false); +} + +/* Match a system against the struct, all matches must be ok */ +static bool +linux_dmi_matches(const struct dmi_system_id *dsi) +{ + int i; + + for (i = 0; i < nitems(dsi->matches); i++) { + if (dsi->matches[i].slot == DMI_NONE) + break; + if (dmi_match(dsi->matches[i].slot, + dsi->matches[i].substr) == false) + return (false); + } + + return (true); +} + +/* Return the string matching the field */ +const char * +linux_dmi_get_system_info(int field) +{ + + if (field < DMI_STRING_MAX) + return (dmi_data[field]); + return (NULL); +} + +/* + * Match a system against the structs list + * If a match is found return the corresponding structure. + */ +const struct dmi_system_id * +linux_dmi_first_match(const struct dmi_system_id *list) +{ + const struct dmi_system_id *dsi; + + for (dsi = list; dsi->matches[0].slot != 0; dsi++) { + if (linux_dmi_matches(dsi)) + return (dsi); + } + + return (NULL); +} + +/* + * Match a system against the structs list + * For each match call the callback with the corresponding data + * Return the number of matches. + */ +int +linux_dmi_check_system(const struct dmi_system_id *sysid) +{ + const struct dmi_system_id *dsi; + int matches = 0; + + for (dsi = sysid; dsi->matches[0].slot != 0; dsi++) { + if (linux_dmi_matches(dsi)) { + matches++; + if (dsi->callback && dsi->callback(dsi)) + break; + } + } + + return (matches); +} Modified: head/sys/conf/files ============================================================================== --- head/sys/conf/files Fri Oct 2 18:26:41 2020 (r366372) +++ head/sys/conf/files Fri Oct 2 18:28:00 2020 (r366373) @@ -4510,6 +4510,8 @@ compat/linuxkpi/common/src/linux_compat.c optional com compile-with "${LINUXKPI_C}" compat/linuxkpi/common/src/linux_current.c optional compat_linuxkpi \ compile-with "${LINUXKPI_C}" +compat/linuxkpi/common/src/linux_dmi.c optional compat_linuxkpi \ + compile-with "${LINUXKPI_C}" compat/linuxkpi/common/src/linux_hrtimer.c optional compat_linuxkpi \ compile-with "${LINUXKPI_C}" compat/linuxkpi/common/src/linux_kthread.c optional compat_linuxkpi \ Modified: head/sys/modules/linuxkpi/Makefile ============================================================================== --- head/sys/modules/linuxkpi/Makefile Fri Oct 2 18:26:41 2020 (r366372) +++ head/sys/modules/linuxkpi/Makefile Fri Oct 2 18:28:00 2020 (r366373) @@ -4,6 +4,7 @@ KMOD= linuxkpi SRCS= linux_compat.c \ linux_current.c \ + linux_dmi.c \ linux_hrtimer.c \ linux_idr.c \ linux_kmod.c \