provide an nvme_ops struct to start trying to support apple m1 nvme.
authordlg <dlg@openbsd.org>
Fri, 28 May 2021 02:34:38 +0000 (02:34 +0000)
committerdlg <dlg@openbsd.org>
Fri, 28 May 2021 02:34:38 +0000 (02:34 +0000)
commit0ccab0b00204b8c23f121d4435f856775de77df6
treefd87acbcc38de87afc0d74fa4daf936cec90eff0
parenta4b5505e4eb832e8afabfb4d75b1e999c780bcb5
provide an nvme_ops struct to start trying to support apple m1 nvme.

the Apple NVME Storage (ans) controller is almost but not quite a
vanilla nvme controller. one difference is that it doesnt attach
to a pci bus, so it will need custom bus glue to attach on those
machines. the other differences are around command submission.

vanilla nvme command submission is done via rings where the host
fills in one or more entries on the ring and then posts where the
ring is up to in a doorbell. ans nvme command submission is done
via an array of command slots where the host picks a slot and then
posts every slot number it fills in to a doorbell instead. this is
kind of clever because once a command slot is allocated, you don't
need any coordination between multiple cpus using that array of
slots to fill in and post the entry they were allocated. on the
other hand, it's different, so the code needs to be specialised.

ans also seems to have some weird iommu thing that needs to be
maintained as commands are posted and completed.

the nvme_ops struct will allow vanilla and ans controllers to provide
their own backens for these different semantics.

ok jmatthew@
sys/dev/ic/nvmevar.h