diff --git a/distrib/sets/lists/comp/mi b/distrib/sets/lists/comp/mi index b63fd6958..325ca8133 100644 --- a/distrib/sets/lists/comp/mi +++ b/distrib/sets/lists/comp/mi @@ -336,6 +336,7 @@ ./usr/include/dev/ic/nec765reg.h ./usr/include/dev/ic/ns16450reg.h ./usr/include/dev/ic/ns16550reg.h +./usr/include/dev/ic/nvmeio.h ./usr/include/dev/ic/nvmereg.h ./usr/include/dev/ic/nvmevar.h ./usr/include/dev/ic/oosiopreg.h diff --git a/lib/libcrypto/Makefile b/lib/libcrypto/Makefile index 39997b088..564dc0116 100644 --- a/lib/libcrypto/Makefile +++ b/lib/libcrypto/Makefile @@ -1,4 +1,4 @@ -# $OpenBSD: Makefile,v 1.194 2024/04/25 16:14:00 tb Exp $ +# $OpenBSD: Makefile,v 1.195 2024/05/24 19:16:53 tb Exp $ LIB= crypto LIBREBUILD=y @@ -264,7 +264,6 @@ SRCS+= ecb3_enc.c SRCS+= ecb_enc.c SRCS+= ede_cbcm_enc.c SRCS+= enc_read.c -SRCS+= enc_writ.c SRCS+= fcrypt.c SRCS+= fcrypt_b.c SRCS+= ofb64ede.c diff --git a/lib/libcrypto/bytestring/bs_ber.c b/lib/libcrypto/bytestring/bs_ber.c index c9779c896..eb1eed618 100644 --- a/lib/libcrypto/bytestring/bs_ber.c +++ b/lib/libcrypto/bytestring/bs_ber.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bs_ber.c,v 1.2 2021/12/15 18:02:39 jsing Exp $ */ +/* $OpenBSD: bs_ber.c,v 1.3 2024/05/25 15:12:47 tb Exp $ */ /* * Copyright (c) 2014, Google Inc. * @@ -15,6 +15,7 @@ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include #include #include "bytestring.h" diff --git a/lib/libcrypto/bytestring/bs_cbb.c b/lib/libcrypto/bytestring/bs_cbb.c index c8b6f4824..3c66a28e6 100644 --- a/lib/libcrypto/bytestring/bs_cbb.c +++ b/lib/libcrypto/bytestring/bs_cbb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bs_cbb.c,v 1.4 2022/07/07 17:16:05 tb Exp $ */ +/* $OpenBSD: bs_cbb.c,v 1.5 2024/05/25 15:12:47 tb Exp $ */ /* * Copyright (c) 2014, Google Inc. * @@ -15,6 +15,7 @@ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include #include #include diff --git a/lib/libcrypto/bytestring/bs_cbs.c b/lib/libcrypto/bytestring/bs_cbs.c index e2bb54e46..7852d7850 100644 --- a/lib/libcrypto/bytestring/bs_cbs.c +++ b/lib/libcrypto/bytestring/bs_cbs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bs_cbs.c,v 1.2 2021/12/15 18:02:39 jsing Exp $ */ +/* $OpenBSD: bs_cbs.c,v 1.3 2024/05/25 15:12:47 tb Exp $ */ /* * Copyright (c) 2014, Google Inc. * @@ -15,6 +15,7 @@ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include #include #include diff --git a/lib/libcrypto/des/des_local.h b/lib/libcrypto/des/des_local.h index f081adedb..c37128473 100644 --- a/lib/libcrypto/des/des_local.h +++ b/lib/libcrypto/des/des_local.h @@ -1,4 +1,4 @@ -/* $OpenBSD: des_local.h,v 1.2 2023/07/08 07:11:07 beck Exp $ */ +/* $OpenBSD: des_local.h,v 1.3 2024/05/24 19:21:58 tb Exp $ */ /* Copyright (C) 1995-1997 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -73,11 +73,6 @@ __BEGIN_HIDDEN_DECLS #define ITERATIONS 16 -#define HALF_ITERATIONS 8 - -/* used in des_read and des_write */ -#define MAXWRITE (1024*16) -#define BSIZE (MAXWRITE+4) #define c2l(c,l) (l =((DES_LONG)(*((c)++))) , \ l|=((DES_LONG)(*((c)++)))<< 8L, \ @@ -105,20 +100,6 @@ __BEGIN_HIDDEN_DECLS *((c)++)=(unsigned char)(((l)>>16L)&0xff), \ *((c)++)=(unsigned char)(((l)>>24L)&0xff)) -/* replacements for htonl and ntohl since I have no idea what to do - * when faced with machines with 8 byte longs. */ -#define HDRSIZE 4 - -#define n2l(c,l) (l =((DES_LONG)(*((c)++)))<<24L, \ - l|=((DES_LONG)(*((c)++)))<<16L, \ - l|=((DES_LONG)(*((c)++)))<< 8L, \ - l|=((DES_LONG)(*((c)++)))) - -#define l2n(l,c) (*((c)++)=(unsigned char)(((l)>>24L)&0xff), \ - *((c)++)=(unsigned char)(((l)>>16L)&0xff), \ - *((c)++)=(unsigned char)(((l)>> 8L)&0xff), \ - *((c)++)=(unsigned char)(((l) )&0xff)) - /* NOTE - c is not incremented as per l2c */ #define l2cn(l1,l2,c,n) { \ c+=n; \ diff --git a/lib/libcrypto/des/enc_read.c b/lib/libcrypto/des/enc_read.c index d52489e72..35704315e 100644 --- a/lib/libcrypto/des/enc_read.c +++ b/lib/libcrypto/des/enc_read.c @@ -1,4 +1,4 @@ -/* $OpenBSD: enc_read.c,v 1.18 2024/03/29 01:47:29 joshua Exp $ */ +/* $OpenBSD: enc_read.c,v 1.19 2024/05/24 19:16:53 tb Exp $ */ /* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) * All rights reserved. * @@ -56,168 +56,30 @@ * [including the GNU Public Licence.] */ -#include #include #include #include "des_local.h" -/* This has some uglies in it but it works - even over sockets. */ -/*extern int errno;*/ -int DES_rw_mode = DES_PCBC_MODE; - /* - * WARNINGS: - * - * - The data format used by DES_enc_write() and DES_enc_read() - * has a cryptographic weakness: When asked to write more - * than MAXWRITE bytes, DES_enc_write will split the data - * into several chunks that are all encrypted - * using the same IV. So don't use these functions unless you - * are sure you know what you do (in which case you might - * not want to use them anyway). - * - * - This code cannot handle non-blocking sockets. - * - * - This function uses an internal state and thus cannot be - * used on multiple files. + * XXX - remove this file in the next major bump */ +int DES_rw_mode = DES_PCBC_MODE; + int DES_enc_read(int fd, void *buf, int len, DES_key_schedule *sched, DES_cblock *iv) { - /* data to be unencrypted */ - int net_num = 0; - static unsigned char *net = NULL; - /* extra unencrypted data - * for when a block of 100 comes in but is des_read one byte at - * a time. */ - static unsigned char *unnet = NULL; - static int unnet_start = 0; - static int unnet_left = 0; - static unsigned char *tmpbuf = NULL; - int i; - long num = 0, rnum; - unsigned char *p; - - if (tmpbuf == NULL) { - tmpbuf = malloc(BSIZE); - if (tmpbuf == NULL) - return (-1); - } - if (net == NULL) { - net = malloc(BSIZE); - if (net == NULL) - return (-1); - } - if (unnet == NULL) { - unnet = malloc(BSIZE); - if (unnet == NULL) - return (-1); - } - /* left over data from last decrypt */ - if (unnet_left != 0) { - if (unnet_left < len) { - /* we still still need more data but will return - * with the number of bytes we have - should always - * check the return value */ - memcpy(buf, &(unnet[unnet_start]), - unnet_left); - /* eay 26/08/92 I had the next 2 lines - * reversed :-( */ - i = unnet_left; - unnet_start = unnet_left = 0; - } else { - memcpy(buf, &(unnet[unnet_start]), len); - unnet_start += len; - unnet_left -= len; - i = len; - } - return (i); - } - - /* We need to get more data. */ - if (len > MAXWRITE) - len = MAXWRITE; - - /* first - get the length */ - while (net_num < HDRSIZE) { - i = read(fd, (void *)&(net[net_num]), HDRSIZE - net_num); -#ifdef EINTR - if ((i == -1) && (errno == EINTR)) - continue; -#endif - if (i <= 0) - return (0); - net_num += i; - } - - /* we now have at net_num bytes in net */ - p = net; - /* num=0; */ - n2l(p, num); - /* num should be rounded up to the next group of eight - * we make sure that we have read a multiple of 8 bytes from the net. - */ - if ((num > MAXWRITE) || (num < 0)) /* error */ - return (-1); - rnum = (num < 8) ? 8 : ((num + 7)/8*8); - - net_num = 0; - while (net_num < rnum) { - i = read(fd, (void *)&(net[net_num]), rnum - net_num); -#ifdef EINTR - if ((i == -1) && (errno == EINTR)) - continue; -#endif - if (i <= 0) - return (0); - net_num += i; - } - - /* Check if there will be data left over. */ - if (len < num) { - if (DES_rw_mode & DES_PCBC_MODE) - DES_pcbc_encrypt(net, unnet, num, sched, iv, - DES_DECRYPT); - else - DES_cbc_encrypt(net, unnet, num, sched, iv, - DES_DECRYPT); - memcpy(buf, unnet, len); - unnet_start = len; - unnet_left = num - len; - - /* The following line is done because we return num - * as the number of bytes read. */ - num = len; - } else { - /* >output is a multiple of 8 byes, if len < rnum - * >we must be careful. The user must be aware that this - * >routine will write more bytes than he asked for. - * >The length of the buffer must be correct. - * FIXED - Should be ok now 18-9-90 - eay */ - if (len < rnum) { - if (DES_rw_mode & DES_PCBC_MODE) - DES_pcbc_encrypt(net, tmpbuf, num, sched, iv, - DES_DECRYPT); - else - DES_cbc_encrypt(net, tmpbuf, num, sched, iv, - DES_DECRYPT); - - /* eay 26/08/92 fix a bug that returned more - * bytes than you asked for (returned len bytes :-( */ - memcpy(buf, tmpbuf, num); - } else { - if (DES_rw_mode & DES_PCBC_MODE) - DES_pcbc_encrypt(net, buf, num, sched, iv, - DES_DECRYPT); - else - DES_cbc_encrypt(net, buf, num, sched, iv, - DES_DECRYPT); - } - } - return num; + return -1; } LCRYPTO_ALIAS(DES_enc_read); + +int +DES_enc_write(int fd, const void *_buf, int len, + DES_key_schedule *sched, DES_cblock *iv) +{ + return -1; +} +LCRYPTO_ALIAS(DES_enc_write); diff --git a/lib/libcrypto/des/enc_writ.c b/lib/libcrypto/des/enc_writ.c deleted file mode 100644 index 39c613936..000000000 --- a/lib/libcrypto/des/enc_writ.c +++ /dev/null @@ -1,168 +0,0 @@ -/* $OpenBSD: enc_writ.c,v 1.18 2024/03/29 01:47:29 joshua Exp $ */ -/* Copyright (C) 1995-1998 Eric Young (eay@cryptsoft.com) - * All rights reserved. - * - * This package is an SSL implementation written - * by Eric Young (eay@cryptsoft.com). - * The implementation was written so as to conform with Netscapes SSL. - * - * This library is free for commercial and non-commercial use as long as - * the following conditions are aheared to. The following conditions - * apply to all code found in this distribution, be it the RC4, RSA, - * lhash, DES, etc., code; not just the SSL code. The SSL documentation - * included with this distribution is covered by the same copyright terms - * except that the holder is Tim Hudson (tjh@cryptsoft.com). - * - * Copyright remains Eric Young's, and as such any Copyright notices in - * the code are not to be removed. - * If this package is used in a product, Eric Young should be given attribution - * as the author of the parts of the library used. - * This can be in the form of a textual message at program startup or - * in documentation (online or textual) provided with the package. - * - * 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 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. - * 3. All advertising materials mentioning features or use of this software - * must display the following acknowledgement: - * "This product includes cryptographic software written by - * Eric Young (eay@cryptsoft.com)" - * The word 'cryptographic' can be left out if the rouines from the library - * being used are not cryptographic related :-). - * 4. If you include any Windows specific code (or a derivative thereof) from - * the apps directory (application code) you must include an acknowledgement: - * "This product includes software written by Tim Hudson (tjh@cryptsoft.com)" - * - * THIS SOFTWARE IS PROVIDED BY ERIC YOUNG ``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. - * - * The licence and distribution terms for any publically available version or - * derivative of this code cannot be changed. i.e. this code cannot simply be - * copied and put under another distribution licence - * [including the GNU Public Licence.] - */ - -#include -#include -#include -#include - -#include - -#include "des_local.h" - -/* - * WARNINGS: - * - * - The data format used by DES_enc_write() and DES_enc_read() - * has a cryptographic weakness: When asked to write more - * than MAXWRITE bytes, DES_enc_write will split the data - * into several chunks that are all encrypted - * using the same IV. So don't use these functions unless you - * are sure you know what you do (in which case you might - * not want to use them anyway). - * - * - This code cannot handle non-blocking sockets. - */ - -int -DES_enc_write(int fd, const void *_buf, int len, - DES_key_schedule *sched, DES_cblock *iv) -{ -#ifdef _LIBC - extern unsigned long time(); - extern int write(); -#endif - const unsigned char *buf = _buf; - long rnum; - int i, j, k, outnum; - static unsigned char *outbuf = NULL; - unsigned char shortbuf[8]; - unsigned char *p; - const unsigned char *cp; - static int start = 1; - - if (outbuf == NULL) { - outbuf = malloc(BSIZE + HDRSIZE); - if (outbuf == NULL) - return (-1); - } - /* If we are sending less than 8 bytes, the same char will look - * the same if we don't pad it out with random bytes */ - if (start) { - start = 0; - } - - /* lets recurse if we want to send the data in small chunks */ - if (len > MAXWRITE) { - j = 0; - for (i = 0; i < len; i += k) { - k = DES_enc_write(fd, &(buf[i]), - ((len - i) > MAXWRITE) ? MAXWRITE : (len - i), - sched, iv); - if (k < 0) - return (k); - else - j += k; - } - return (j); - } - - /* write length first */ - p = outbuf; - l2n(len, p); - - /* pad short strings */ - if (len < 8) { - cp = shortbuf; - memcpy(shortbuf, buf, len); - arc4random_buf(shortbuf + len, 8 - len); - rnum = 8; - } else { - cp = buf; - rnum = ((len + 7)/8*8); /* round up to nearest eight */ - } - - if (DES_rw_mode & DES_PCBC_MODE) - DES_pcbc_encrypt(cp, &(outbuf[HDRSIZE]), (len < 8) ? 8 : len, - sched, iv, DES_ENCRYPT); - else - DES_cbc_encrypt(cp, &(outbuf[HDRSIZE]), (len < 8) ? 8 : len, - sched, iv, DES_ENCRYPT); - - /* output */ - outnum = rnum + HDRSIZE; - - for (j = 0; j < outnum; j += i) { - /* eay 26/08/92 I was not doing writing from where we - * got up to. */ - i = write(fd, (void *)&(outbuf[j]), outnum - j); - if (i == -1) { -#ifdef EINTR - if (errno == EINTR) - i = 0; - else -#endif - /* This is really a bad error - very bad - * It will stuff-up both ends. */ - return (-1); - } - } - - return (len); -} -LCRYPTO_ALIAS(DES_enc_write); diff --git a/lib/libcrypto/man/DES_set_key.3 b/lib/libcrypto/man/DES_set_key.3 index 16188f1f2..fd09d7773 100644 --- a/lib/libcrypto/man/DES_set_key.3 +++ b/lib/libcrypto/man/DES_set_key.3 @@ -1,4 +1,4 @@ -.\" $OpenBSD: DES_set_key.3,v 1.16 2023/11/16 20:27:43 schwarze Exp $ +.\" $OpenBSD: DES_set_key.3,v 1.17 2024/05/24 19:18:07 tb Exp $ .\" full merge up to: .\" OpenSSL man3/DES_random_key 521738e9 Oct 5 14:58:30 2018 -0400 .\" @@ -115,7 +115,7 @@ .\" copied and put under another distribution licence .\" [including the GNU Public Licence.] .\" -.Dd $Mdocdate: November 16 2023 $ +.Dd $Mdocdate: May 24 2024 $ .Dt DES_SET_KEY 3 .Os .Sh NAME @@ -148,9 +148,7 @@ .Nm DES_string_to_key , .Nm DES_string_to_2keys , .Nm DES_fcrypt , -.Nm DES_crypt , -.Nm DES_enc_read , -.Nm DES_enc_write +.Nm DES_crypt .Nd DES encryption .Sh SYNOPSIS .In openssl/des.h @@ -392,22 +390,6 @@ .Fa "const char *buf" .Fa "const char *salt" .Fc -.Ft int -.Fo DES_enc_read -.Fa "int fd" -.Fa "void *buf" -.Fa "int len" -.Fa "DES_key_schedule *sched" -.Fa "DES_cblock *iv" -.Fc -.Ft int -.Fo DES_enc_write -.Fa "int fd" -.Fa "const void *buf" -.Fa "int len" -.Fa "DES_key_schedule *sched" -.Fa "DES_cblock *iv" -.Fc .Sh DESCRIPTION This library contains a fast implementation of the DES encryption algorithm. @@ -686,71 +668,6 @@ This function calls with a static array passed as the third parameter. This emulates the normal non-thread safe semantics of .Xr crypt 3 . -.Pp -.Fn DES_enc_write -writes -.Fa len -bytes to file descriptor -.Fa fd -from buffer -.Fa buf . -The data is encrypted via -.Em pcbc_encrypt -(default) using -.Fa sched -for the key and -.Fa iv -as a starting vector. -The actual data send down -.Fa fd -consists of 4 bytes (in network byte order) containing the length of the -following encrypted data. -The encrypted data then follows, padded with random data out to a -multiple of 8 bytes. -.Pp -.Fn DES_enc_read -is used to read -.Fa len -bytes from file descriptor -.Fa fd -into buffer -.Fa buf . -The data being read from -.Fa fd -is assumed to have come from -.Fn DES_enc_write -and is decrypted using -.Fa sched -for the key schedule and -.Fa iv -for the initial vector. -.Pp -.Sy Warning : -The data format used by -.Fn DES_enc_write -and -.Fn DES_enc_read -has a cryptographic weakness: when asked to write more than -.Dv MAXWRITE -bytes, -.Fn DES_enc_write -will split the data into several chunks that are all encrypted using the -same IV. -So don't use these functions unless you are sure you know what -you do (in which case you might not want to use them anyway). -They cannot handle non-blocking sockets. -.Fn DES_enc_read -uses an internal state and thus cannot be used on multiple files. -.Pp -.Em DES_rw_mode -is used to specify the encryption mode to use with -.Fn DES_enc_read . -If set to -.Dv DES_PCBC_MODE -(the default), DES_pcbc_encrypt is used. -If set to -.Dv DES_CBC_MODE , -DES_cbc_encrypt is used. .Sh RETURN VALUES .Fn DES_set_key , .Fn DES_key_sched , @@ -802,10 +719,8 @@ with the MIT Kerberos library. .Fn DES_quad_cksum , .Fn DES_string_to_key , .Fn DES_string_to_2keys , -.Fn DES_crypt , -.Fn DES_enc_read , and -.Fn DES_enc_write +.Fn DES_crypt appeared in SSLeay 0.4 or earlier. .Fn DES_ncbc_encrypt first appeared in SSLeay 0.4.2. diff --git a/lib/libssl/bs_ber.c b/lib/libssl/bs_ber.c index 5cace24d9..ea9fb253b 100644 --- a/lib/libssl/bs_ber.c +++ b/lib/libssl/bs_ber.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bs_ber.c,v 1.11 2021/05/16 10:58:27 jsing Exp $ */ +/* $OpenBSD: bs_ber.c,v 1.12 2024/05/25 15:14:26 tb Exp $ */ /* * Copyright (c) 2014, Google Inc. * @@ -15,6 +15,7 @@ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include #include #include "bytestring.h" diff --git a/lib/libssl/bs_cbb.c b/lib/libssl/bs_cbb.c index e2f87be4d..059f9abd0 100644 --- a/lib/libssl/bs_cbb.c +++ b/lib/libssl/bs_cbb.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bs_cbb.c,v 1.28 2022/07/07 17:12:15 tb Exp $ */ +/* $OpenBSD: bs_cbb.c,v 1.29 2024/05/25 15:14:26 tb Exp $ */ /* * Copyright (c) 2014, Google Inc. * @@ -15,6 +15,7 @@ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include #include #include diff --git a/lib/libssl/bs_cbs.c b/lib/libssl/bs_cbs.c index 63c078c9b..76e3bd2a8 100644 --- a/lib/libssl/bs_cbs.c +++ b/lib/libssl/bs_cbs.c @@ -1,4 +1,4 @@ -/* $OpenBSD: bs_cbs.c,v 1.24 2021/12/15 17:36:49 jsing Exp $ */ +/* $OpenBSD: bs_cbs.c,v 1.25 2024/05/25 15:14:26 tb Exp $ */ /* * Copyright (c) 2014, Google Inc. * @@ -15,6 +15,7 @@ * CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. */ +#include #include #include diff --git a/regress/lib/libcrypto/asn1/asn1time.c b/regress/lib/libcrypto/asn1/asn1time.c index 7cc6df8a1..95c5d24db 100644 --- a/regress/lib/libcrypto/asn1/asn1time.c +++ b/regress/lib/libcrypto/asn1/asn1time.c @@ -1,4 +1,4 @@ -/* $OpenBSD: asn1time.c,v 1.26 2024/04/08 19:57:40 beck Exp $ */ +/* $OpenBSD: asn1time.c,v 1.28 2024/05/25 12:47:25 tb Exp $ */ /* * Copyright (c) 2015 Joel Sing * Copyright (c) 2024 Google Inc. diff --git a/sys/dev/ic/ufshci.c b/sys/dev/ic/ufshci.c index 66e31ad0c..7d8d23f18 100644 --- a/sys/dev/ic/ufshci.c +++ b/sys/dev/ic/ufshci.c @@ -1,4 +1,4 @@ -/* $OpenBSD: ufshci.c,v 1.31 2024/05/24 09:51:14 mglocker Exp $ */ +/* $OpenBSD: ufshci.c,v 1.32 2024/05/24 20:34:06 mglocker Exp $ */ /* * Copyright (c) 2022 Marcus Glocker @@ -111,7 +111,7 @@ int ufshci_intr(void *arg) { struct ufshci_softc *sc = arg; - uint32_t status; + uint32_t status, hcs; int handled = 0; status = UFSHCI_READ_4(sc, UFSHCI_REG_IS); @@ -131,6 +131,17 @@ ufshci_intr(void *arg) handled = 1; } + /* If Auto-Hibernate raises an interrupt, it's to yield an error. */ + if (status & UFSHCI_REG_IS_UHES) { + hcs = UFSHCI_READ_4(sc, UFSHCI_REG_HCS); + printf("%s: Auto-Hibernate enter error UPMCRS=0x%x\n", + __func__, UFSHCI_REG_HCS_UPMCRS(hcs)); + } + if (status & UFSHCI_REG_IS_UHXS) { + hcs = UFSHCI_READ_4(sc, UFSHCI_REG_HCS); + printf("%s: Auto-Hibernate exit error UPMCRS=0x%x\n", + __func__, UFSHCI_REG_HCS_UPMCRS(hcs)); + } if (handled == 0) { printf("%s: UNKNOWN interrupt, status=0x%08x\n", @@ -223,6 +234,12 @@ ufshci_attach(struct ufshci_softc *sc) return 1; } + /* Enable Auto-Hibernate Idle Timer (AHIT) and set it to 150ms. */ + if (sc->sc_cap & UFSHCI_REG_AUTOH8) { + UFSHCI_WRITE_4(sc, UFSHCI_REG_AHIT, + UFSHCI_REG_AHIT_TS(UFSHCI_REG_AHIT_TS_1MS) | 150); + } + /* Attach to SCSI layer */ saa.saa_adapter = &ufshci_switch; saa.saa_adapter_softc = sc; @@ -365,8 +382,14 @@ ufshci_init(struct ufshci_softc *sc) */ /* 7.1.1 Host Controller Initialization: 5) */ - UFSHCI_WRITE_4(sc, UFSHCI_REG_IE, - UFSHCI_REG_IE_UTRCE | UFSHCI_REG_IE_UTMRCE); + if (sc->sc_cap & UFSHCI_REG_AUTOH8) { + UFSHCI_WRITE_4(sc, UFSHCI_REG_IE, + UFSHCI_REG_IE_UTRCE | UFSHCI_REG_IE_UTMRCE | + UFSHCI_REG_IS_UHES | UFSHCI_REG_IS_UHXS); + } else { + UFSHCI_WRITE_4(sc, UFSHCI_REG_IE, + UFSHCI_REG_IE_UTRCE | UFSHCI_REG_IE_UTMRCE); + } /* 7.1.1 Host Controller Initialization: 6) */ UFSHCI_WRITE_4(sc, UFSHCI_REG_UICCMD, diff --git a/sys/dev/ic/ufshcireg.h b/sys/dev/ic/ufshcireg.h index dfba3df69..b96bef52e 100644 --- a/sys/dev/ic/ufshcireg.h +++ b/sys/dev/ic/ufshcireg.h @@ -1,4 +1,4 @@ -/* $OpenBSD: ufshcireg.h,v 1.12 2024/05/24 09:51:14 mglocker Exp $ */ +/* $OpenBSD: ufshcireg.h,v 1.13 2024/05/24 20:34:06 mglocker Exp $ */ /* * Copyright (c) 2022 Marcus Glocker @@ -56,6 +56,13 @@ #define UFSHCI_REG_HCMID_MIC(x) ((x >> 0) & 0x000000ff) /* RO */ /* Auto-Hibernate Idle Timer */ #define UFSHCI_REG_AHIT 0x18 +#define UFSHCI_REG_AHIT_TS(x) (x << 10) +#define UFSHCI_REG_AHIT_TS_1US 0x00 +#define UFSHCI_REG_AHIT_TS_10US 0x01 +#define UFSHCI_REG_AHIT_TS_100US 0x02 +#define UFSHCI_REG_AHIT_TS_1MS 0x03 +#define UFSHCI_REG_AHIT_TS_10MS 0x04 +#define UFSHCI_REG_AHIT_TS_100MS 0x05 /* * Operation and Runtime Registers