Index | Thread | Search

From:
joshua stein <jcs@jcs.org>
Subject:
Re: nvme: use I/O submission queue entry size reported by controller
To:
tech@openbsd.org
Date:
Fri, 29 May 2026 16:04:06 -0500

Download raw body.

Thread
  • Mark Kettenis:

    nvme: use I/O submission queue entry size reported by controller

    • joshua stein:

      nvme: use I/O submission queue entry size reported by controller

  • On Thu, 28 May 2026 at 23:48:27 +0200, Mark Kettenis wrote:
    > > Date: Sun, 17 May 2026 12:25:57 -0500
    > > From: joshua stein <jcs@jcs.org>
    > > 
    > > On at least the Apple T2 NVMe, 128-byte submission queue entries on
    > > I/O queues are required instead of the standard 64 bytes.
    > > 
    > > This gets NVMe working on the 2018 Mac Mini.  Also tested on a 
    > > non-Apple NVMe but more tests would be helpful.
    > 
    > Unfortunately this breaks the NVMe on my 2023 Mac mini.  It advertises
    > 128-byte submission queue entries, but only works with 64-byte ones.
    
    Because of course it does.  Well done, Apple.
    
    ok
    
    
    > Index: dev/ic/nvme.c
    > ===================================================================
    > RCS file: /cvs/src/sys/dev/ic/nvme.c,v
    > diff -u -p -r1.127 nvme.c
    > --- dev/ic/nvme.c	27 May 2026 15:04:14 -0000	1.127
    > +++ dev/ic/nvme.c	28 May 2026 21:37:35 -0000
    > @@ -1288,10 +1288,12 @@ nvme_identify(struct nvme_softc *sc, u_i
    >  
    >  	sc->sc_nn = lemtoh32(&identify->nn);
    >  
    > -	/* use maximum I/O SQE size reported */
    > -	sc->sc_sqe_size = 1 << (identify->sqes >> 4);
    > -	if (sc->sc_sqe_size < sizeof(struct nvme_sqe))
    > -		sc->sc_sqe_size = sizeof(struct nvme_sqe);
    > +	if (sc->sc_sqe_size == 0) {
    > +		/* use maximum I/O SQE size reported */
    > +		sc->sc_sqe_size = 1 << (identify->sqes >> 4);
    > +		if (sc->sc_sqe_size < sizeof(struct nvme_sqe))
    > +			sc->sc_sqe_size = sizeof(struct nvme_sqe);
    > +	}
    >  
    >  	/*
    >  	 * At least one Apple NVMe device presents a second, bogus disk that is
    > Index: arch/arm64/dev/aplns.c
    > ===================================================================
    > RCS file: /cvs/src/sys/arch/arm64/dev/aplns.c,v
    > diff -u -p -r1.17 aplns.c
    > --- arch/arm64/dev/aplns.c	11 Jan 2026 12:47:48 -0000	1.17
    > +++ arch/arm64/dev/aplns.c	28 May 2026 21:37:35 -0000
    > @@ -234,6 +234,7 @@ nvme_ans_attach(struct device *parent, s
    >  	sc->sc_ios = faa->fa_reg[0].size;
    >  	sc->sc_ops = &nvme_ans_ops;
    >  	sc->sc_openings = 1;
    > +	sc->sc_sqe_size = sizeof(struct nvme_sqe);
    >  
    >  	if (nvme_attach(sc) != 0) {
    >  		/* error printed by nvme_attach() */
    > 
    
    
  • Mark Kettenis:

    nvme: use I/O submission queue entry size reported by controller