I would prefer direct hardware kernel interface.

Like linux DMABUFs with userland hardware command ring buffers (I guess this hardware ring buffer instance would be specific to a VMID and a PASID).

You can do that (tinygrad style) if you want.