> From: Janne Grunau <[email protected]> > Date: Fri, 04 Sep 2026 21:22:41 +0200 > > Apple controllers seem to require any queue buffers on the admin queue > to be aligned to the NVMe controller page size. Weirdly, this constraint > does not apply to the i/o queue where any alignment is fine. This has > always been required on pre-M1 controllers and is required starting with > macOS 15 firmware or post-M4 controllers again. On M1/M2/M3 there was a > chicken bit to disable this requirement. > > U-boot appears to always use page-aligned buffers for the admin queue. > Add WARN_ON_ONCE to make it very obvious if/when that changes or wasn't > true to begin with. > > Signed-off-by: Janne Grunau <[email protected]>
Probably a good idea. We aren't really size constrained. Reviewed-by: Mark Kettenis <[email protected]> > --- > drivers/nvme/nvme_apple.c | 7 +++++++ > 1 file changed, 7 insertions(+) > > diff --git a/drivers/nvme/nvme_apple.c b/drivers/nvme/nvme_apple.c > index f615f8fac4a..54821f80c81 100644 > --- a/drivers/nvme/nvme_apple.c > +++ b/drivers/nvme/nvme_apple.c > @@ -12,6 +12,7 @@ > #include <asm/io.h> > #include <asm/arch/rtkit.h> > #include <asm/arch/sart.h> > +#include <linux/bug.h> > #include <linux/iopoll.h> > #include <linux/sizes.h> > > @@ -116,9 +117,15 @@ static void apple_nvme_submit_cmd(struct nvme_queue > *nvmeq, > { > struct apple_nvme_priv *priv = > container_of(nvmeq->dev, struct apple_nvme_priv, ndev); > + u32 page_size = nvmeq->dev->page_size; > struct ans_nvmmu_tcb *tcb; > u16 tail = nvmeq->sq_tail; > > + if (nvmeq->qid == NVME_ADMIN_Q) { > + WARN_ON_ONCE(!IS_ALIGNED(cmd->common.prp1, page_size)); > + WARN_ON_ONCE(!IS_ALIGNED(cmd->common.prp2, page_size)); > + } > + > tcb = ((void *)priv->tcbs[nvmeq->qid]) + tail * ANS_NVMMU_TCB_PITCH; > memset(tcb, 0, sizeof(*tcb)); > tcb->opcode = 0; > > -- > 2.55.0 > >
