v86 0.3.4 → 0.3.7
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/Readme.md +4 -4
- package/bios/seabios/.config +113 -0
- package/bios/seabios/.config.old +114 -0
- package/bios/seabios/.gitignore +4 -0
- package/bios/seabios/COPYING +674 -0
- package/bios/seabios/COPYING.LESSER +165 -0
- package/bios/seabios/Makefile +286 -0
- package/bios/seabios/README +17 -0
- package/bios/seabios/docs/Build_overview.md +104 -0
- package/bios/seabios/docs/Contributing.md +20 -0
- package/bios/seabios/docs/Debugging.md +111 -0
- package/bios/seabios/docs/Developer_Documentation.md +25 -0
- package/bios/seabios/docs/Developer_links.md +86 -0
- package/bios/seabios/docs/Download.md +27 -0
- package/bios/seabios/docs/Execution_and_code_flow.md +178 -0
- package/bios/seabios/docs/Linking_overview.md +160 -0
- package/bios/seabios/docs/Mailinglist.md +8 -0
- package/bios/seabios/docs/Memory_Model.md +253 -0
- package/bios/seabios/docs/README +5 -0
- package/bios/seabios/docs/Releases.md +482 -0
- package/bios/seabios/docs/Runtime_config.md +193 -0
- package/bios/seabios/docs/SeaBIOS.md +17 -0
- package/bios/seabios/docs/SeaVGABIOS.md +39 -0
- package/bios/seabios/out/autoconf.h +117 -0
- package/bios/seabios/out/include/config/acpi/dsdt.h +0 -0
- package/bios/seabios/out/include/config/acpi.h +0 -0
- package/bios/seabios/out/include/config/ahci.h +0 -0
- package/bios/seabios/out/include/config/apmbios.h +0 -0
- package/bios/seabios/out/include/config/ata/dma.h +0 -0
- package/bios/seabios/out/include/config/ata/pio32.h +0 -0
- package/bios/seabios/out/include/config/ata.h +0 -0
- package/bios/seabios/out/include/config/auto.conf +69 -0
- package/bios/seabios/out/include/config/auto.conf.cmd +9 -0
- package/bios/seabios/out/include/config/boot.h +0 -0
- package/bios/seabios/out/include/config/bootorder.h +0 -0
- package/bios/seabios/out/include/config/build/vgabios.h +0 -0
- package/bios/seabios/out/include/config/call32/smm.h +0 -0
- package/bios/seabios/out/include/config/cdrom/boot.h +0 -0
- package/bios/seabios/out/include/config/cdrom/emu.h +0 -0
- package/bios/seabios/out/include/config/debug/level.h +0 -0
- package/bios/seabios/out/include/config/drives.h +0 -0
- package/bios/seabios/out/include/config/entry/extrastack.h +0 -0
- package/bios/seabios/out/include/config/esp/scsi.h +0 -0
- package/bios/seabios/out/include/config/flash/floppy.h +0 -0
- package/bios/seabios/out/include/config/floppy.h +0 -0
- package/bios/seabios/out/include/config/fw/romfile/load.h +0 -0
- package/bios/seabios/out/include/config/hardware/irq.h +0 -0
- package/bios/seabios/out/include/config/kbd/call/int15/4f.h +0 -0
- package/bios/seabios/out/include/config/keyboard.h +0 -0
- package/bios/seabios/out/include/config/lpt.h +0 -0
- package/bios/seabios/out/include/config/lsi/scsi.h +0 -0
- package/bios/seabios/out/include/config/malloc/uppermemory.h +0 -0
- package/bios/seabios/out/include/config/megasas.h +0 -0
- package/bios/seabios/out/include/config/mouse.h +0 -0
- package/bios/seabios/out/include/config/mpt/scsi.h +0 -0
- package/bios/seabios/out/include/config/mptable.h +0 -0
- package/bios/seabios/out/include/config/mtrr/init.h +0 -0
- package/bios/seabios/out/include/config/optionroms.h +0 -0
- package/bios/seabios/out/include/config/override/pci/id.h +0 -0
- package/bios/seabios/out/include/config/pcibios.h +0 -0
- package/bios/seabios/out/include/config/pirtable.h +0 -0
- package/bios/seabios/out/include/config/pmm.h +0 -0
- package/bios/seabios/out/include/config/pmtimer.h +0 -0
- package/bios/seabios/out/include/config/pnpbios.h +0 -0
- package/bios/seabios/out/include/config/ps2port.h +0 -0
- package/bios/seabios/out/include/config/pvscsi.h +0 -0
- package/bios/seabios/out/include/config/qemu/hardware.h +0 -0
- package/bios/seabios/out/include/config/qemu.h +0 -0
- package/bios/seabios/out/include/config/rom/size.h +0 -0
- package/bios/seabios/out/include/config/rtc/timer.h +0 -0
- package/bios/seabios/out/include/config/s3/resume.h +0 -0
- package/bios/seabios/out/include/config/sdcard.h +0 -0
- package/bios/seabios/out/include/config/serial.h +0 -0
- package/bios/seabios/out/include/config/tcgbios.h +0 -0
- package/bios/seabios/out/include/config/threads.h +0 -0
- package/bios/seabios/out/include/config/tristate.conf +4 -0
- package/bios/seabios/out/include/config/tsc/timer.h +0 -0
- package/bios/seabios/out/include/config/use/smm.h +0 -0
- package/bios/seabios/out/include/config/vga/allocate/extra/stack.h +0 -0
- package/bios/seabios/out/include/config/vga/bochs/stdvga.h +0 -0
- package/bios/seabios/out/include/config/vga/bochs.h +0 -0
- package/bios/seabios/out/include/config/vga/did.h +0 -0
- package/bios/seabios/out/include/config/vga/extra/stack/size.h +0 -0
- package/bios/seabios/out/include/config/vga/fixup/asm.h +0 -0
- package/bios/seabios/out/include/config/vga/pci.h +0 -0
- package/bios/seabios/out/include/config/vga/stdvga/ports.h +0 -0
- package/bios/seabios/out/include/config/vga/vbe.h +0 -0
- package/bios/seabios/out/include/config/vga/vid.h +0 -0
- package/bios/seabios/out/include/config/vgahooks.h +0 -0
- package/bios/seabios/out/include/config/virtio/blk.h +0 -0
- package/bios/seabios/out/include/config/virtio/scsi.h +0 -0
- package/bios/seabios/out/include/config/xen.h +0 -0
- package/bios/seabios/out/scripts/kconfig/conf +0 -0
- package/bios/seabios/out/scripts/kconfig/conf.o +0 -0
- package/bios/seabios/out/scripts/kconfig/zconf.hash.c +289 -0
- package/bios/seabios/out/scripts/kconfig/zconf.lex.c +2420 -0
- package/bios/seabios/out/scripts/kconfig/zconf.tab.c +2538 -0
- package/bios/seabios/out/scripts/kconfig/zconf.tab.o +0 -0
- package/bios/seabios/scripts/acpi_extract.py +366 -0
- package/bios/seabios/scripts/acpi_extract_preprocess.py +41 -0
- package/bios/seabios/scripts/buildrom.py +56 -0
- package/bios/seabios/scripts/buildversion.py +134 -0
- package/bios/seabios/scripts/checkrom.py +95 -0
- package/bios/seabios/scripts/checkstack.py +226 -0
- package/bios/seabios/scripts/checksum.py +16 -0
- package/bios/seabios/scripts/encodeint.py +21 -0
- package/bios/seabios/scripts/gen-offsets.sh +17 -0
- package/bios/seabios/scripts/kconfig/.gitignore +22 -0
- package/bios/seabios/scripts/kconfig/Makefile +331 -0
- package/bios/seabios/scripts/kconfig/POTFILES.in +12 -0
- package/bios/seabios/scripts/kconfig/check.sh +13 -0
- package/bios/seabios/scripts/kconfig/conf.c +718 -0
- package/bios/seabios/scripts/kconfig/confdata.c +1250 -0
- package/bios/seabios/scripts/kconfig/expr.c +1168 -0
- package/bios/seabios/scripts/kconfig/expr.h +241 -0
- package/bios/seabios/scripts/kconfig/gconf.c +1542 -0
- package/bios/seabios/scripts/kconfig/gconf.glade +661 -0
- package/bios/seabios/scripts/kconfig/images.c +326 -0
- package/bios/seabios/scripts/kconfig/kxgettext.c +235 -0
- package/bios/seabios/scripts/kconfig/lex.zconf.c +2430 -0
- package/bios/seabios/scripts/kconfig/list.h +131 -0
- package/bios/seabios/scripts/kconfig/lkc.h +200 -0
- package/bios/seabios/scripts/kconfig/lkc_proto.h +57 -0
- package/bios/seabios/scripts/kconfig/lxdialog/.gitignore +4 -0
- package/bios/seabios/scripts/kconfig/lxdialog/BIG.FAT.WARNING +4 -0
- package/bios/seabios/scripts/kconfig/lxdialog/check-lxdialog.sh +87 -0
- package/bios/seabios/scripts/kconfig/lxdialog/checklist.c +332 -0
- package/bios/seabios/scripts/kconfig/lxdialog/dialog.h +257 -0
- package/bios/seabios/scripts/kconfig/lxdialog/inputbox.c +301 -0
- package/bios/seabios/scripts/kconfig/lxdialog/menubox.c +437 -0
- package/bios/seabios/scripts/kconfig/lxdialog/textbox.c +408 -0
- package/bios/seabios/scripts/kconfig/lxdialog/util.c +713 -0
- package/bios/seabios/scripts/kconfig/lxdialog/yesno.c +114 -0
- package/bios/seabios/scripts/kconfig/mconf.c +1036 -0
- package/bios/seabios/scripts/kconfig/menu.c +697 -0
- package/bios/seabios/scripts/kconfig/merge_config.sh +150 -0
- package/bios/seabios/scripts/kconfig/nconf.c +1556 -0
- package/bios/seabios/scripts/kconfig/nconf.gui.c +656 -0
- package/bios/seabios/scripts/kconfig/nconf.h +96 -0
- package/bios/seabios/scripts/kconfig/qconf.cc +1795 -0
- package/bios/seabios/scripts/kconfig/qconf.h +338 -0
- package/bios/seabios/scripts/kconfig/streamline_config.pl +647 -0
- package/bios/seabios/scripts/kconfig/symbol.c +1373 -0
- package/bios/seabios/scripts/kconfig/util.c +157 -0
- package/bios/seabios/scripts/kconfig/zconf.gperf +48 -0
- package/bios/seabios/scripts/kconfig/zconf.hash.c_shipped +289 -0
- package/bios/seabios/scripts/kconfig/zconf.l +363 -0
- package/bios/seabios/scripts/kconfig/zconf.lex.c_shipped +2420 -0
- package/bios/seabios/scripts/kconfig/zconf.tab.c_shipped +2538 -0
- package/bios/seabios/scripts/kconfig/zconf.y +733 -0
- package/bios/seabios/scripts/layoutrom.py +705 -0
- package/bios/seabios/scripts/python23compat.py +14 -0
- package/bios/seabios/scripts/readserial.py +190 -0
- package/bios/seabios/scripts/tarball.sh +36 -0
- package/bios/seabios/scripts/test-build.sh +90 -0
- package/bios/seabios/scripts/transdump.py +53 -0
- package/bios/seabios/scripts/vgafixup.py +96 -0
- package/bios/seabios/src/Kconfig +579 -0
- package/bios/seabios/src/apm.c +215 -0
- package/bios/seabios/src/asm-offsets.c +23 -0
- package/bios/seabios/src/biosvar.h +130 -0
- package/bios/seabios/src/block.c +623 -0
- package/bios/seabios/src/block.h +121 -0
- package/bios/seabios/src/bmp.c +117 -0
- package/bios/seabios/src/boot.c +793 -0
- package/bios/seabios/src/bootsplash.c +255 -0
- package/bios/seabios/src/bregs.h +80 -0
- package/bios/seabios/src/byteorder.h +71 -0
- package/bios/seabios/src/cdrom.c +322 -0
- package/bios/seabios/src/clock.c +506 -0
- package/bios/seabios/src/code16gcc.s +1 -0
- package/bios/seabios/src/config.h +108 -0
- package/bios/seabios/src/cp437.c +275 -0
- package/bios/seabios/src/cp437.h +1 -0
- package/bios/seabios/src/disk.c +779 -0
- package/bios/seabios/src/e820map.c +152 -0
- package/bios/seabios/src/e820map.h +26 -0
- package/bios/seabios/src/entryfuncs.S +165 -0
- package/bios/seabios/src/farptr.h +208 -0
- package/bios/seabios/src/font.c +139 -0
- package/bios/seabios/src/fw/acpi-dsdt-cpu-hotplug.dsl +78 -0
- package/bios/seabios/src/fw/acpi-dsdt-dbug.dsl +26 -0
- package/bios/seabios/src/fw/acpi-dsdt-hpet.dsl +36 -0
- package/bios/seabios/src/fw/acpi-dsdt-isa.dsl +102 -0
- package/bios/seabios/src/fw/acpi-dsdt-pci-crs.dsl +90 -0
- package/bios/seabios/src/fw/acpi-dsdt.dsl +342 -0
- package/bios/seabios/src/fw/acpi-dsdt.hex +554 -0
- package/bios/seabios/src/fw/acpi.c +685 -0
- package/bios/seabios/src/fw/biostables.c +491 -0
- package/bios/seabios/src/fw/coreboot.c +569 -0
- package/bios/seabios/src/fw/csm.c +347 -0
- package/bios/seabios/src/fw/dev-pci.h +52 -0
- package/bios/seabios/src/fw/dev-piix.h +29 -0
- package/bios/seabios/src/fw/dev-q35.h +52 -0
- package/bios/seabios/src/fw/lzmadecode.c +398 -0
- package/bios/seabios/src/fw/lzmadecode.h +67 -0
- package/bios/seabios/src/fw/mptable.c +197 -0
- package/bios/seabios/src/fw/mtrr.c +105 -0
- package/bios/seabios/src/fw/multiboot.c +111 -0
- package/bios/seabios/src/fw/paravirt.c +624 -0
- package/bios/seabios/src/fw/paravirt.h +63 -0
- package/bios/seabios/src/fw/pciinit.c +1187 -0
- package/bios/seabios/src/fw/pirtable.c +103 -0
- package/bios/seabios/src/fw/q35-acpi-dsdt.dsl +450 -0
- package/bios/seabios/src/fw/romfile_loader.c +259 -0
- package/bios/seabios/src/fw/romfile_loader.h +91 -0
- package/bios/seabios/src/fw/shadow.c +208 -0
- package/bios/seabios/src/fw/smbios.c +585 -0
- package/bios/seabios/src/fw/smm.c +269 -0
- package/bios/seabios/src/fw/smp.c +194 -0
- package/bios/seabios/src/fw/ssdt-misc.dsl +104 -0
- package/bios/seabios/src/fw/ssdt-misc.hex +88 -0
- package/bios/seabios/src/fw/ssdt-pcihp.dsl +36 -0
- package/bios/seabios/src/fw/ssdt-pcihp.hex +38 -0
- package/bios/seabios/src/fw/ssdt-proc.dsl +48 -0
- package/bios/seabios/src/fw/ssdt-proc.hex +35 -0
- package/bios/seabios/src/fw/xen.c +149 -0
- package/bios/seabios/src/fw/xen.h +125 -0
- package/bios/seabios/src/gen-defs.h +19 -0
- package/bios/seabios/src/hw/ahci.c +697 -0
- package/bios/seabios/src/hw/ahci.h +201 -0
- package/bios/seabios/src/hw/ata.c +1046 -0
- package/bios/seabios/src/hw/ata.h +163 -0
- package/bios/seabios/src/hw/blockcmd.c +372 -0
- package/bios/seabios/src/hw/blockcmd.h +114 -0
- package/bios/seabios/src/hw/dma.c +67 -0
- package/bios/seabios/src/hw/esp-scsi.c +241 -0
- package/bios/seabios/src/hw/esp-scsi.h +8 -0
- package/bios/seabios/src/hw/floppy.c +741 -0
- package/bios/seabios/src/hw/lsi-scsi.c +221 -0
- package/bios/seabios/src/hw/lsi-scsi.h +8 -0
- package/bios/seabios/src/hw/megasas.c +405 -0
- package/bios/seabios/src/hw/megasas.h +8 -0
- package/bios/seabios/src/hw/mpt-scsi.c +319 -0
- package/bios/seabios/src/hw/mpt-scsi.h +8 -0
- package/bios/seabios/src/hw/nvme-int.h +199 -0
- package/bios/seabios/src/hw/nvme.c +708 -0
- package/bios/seabios/src/hw/nvme.h +17 -0
- package/bios/seabios/src/hw/pci.c +133 -0
- package/bios/seabios/src/hw/pci.h +47 -0
- package/bios/seabios/src/hw/pci_ids.h +2632 -0
- package/bios/seabios/src/hw/pci_regs.h +556 -0
- package/bios/seabios/src/hw/pcidevice.c +192 -0
- package/bios/seabios/src/hw/pcidevice.h +76 -0
- package/bios/seabios/src/hw/pic.c +115 -0
- package/bios/seabios/src/hw/pic.h +60 -0
- package/bios/seabios/src/hw/ps2port.c +543 -0
- package/bios/seabios/src/hw/ps2port.h +67 -0
- package/bios/seabios/src/hw/pvscsi.c +333 -0
- package/bios/seabios/src/hw/pvscsi.h +8 -0
- package/bios/seabios/src/hw/ramdisk.c +108 -0
- package/bios/seabios/src/hw/rtc.c +100 -0
- package/bios/seabios/src/hw/rtc.h +75 -0
- package/bios/seabios/src/hw/sdcard.c +572 -0
- package/bios/seabios/src/hw/serialio.c +113 -0
- package/bios/seabios/src/hw/serialio.h +29 -0
- package/bios/seabios/src/hw/timer.c +259 -0
- package/bios/seabios/src/hw/tpm_drivers.c +636 -0
- package/bios/seabios/src/hw/tpm_drivers.h +127 -0
- package/bios/seabios/src/hw/usb-ehci.c +650 -0
- package/bios/seabios/src/hw/usb-ehci.h +177 -0
- package/bios/seabios/src/hw/usb-hid.c +442 -0
- package/bios/seabios/src/hw/usb-hid.h +29 -0
- package/bios/seabios/src/hw/usb-hub.c +205 -0
- package/bios/seabios/src/hw/usb-hub.h +64 -0
- package/bios/seabios/src/hw/usb-msc.c +222 -0
- package/bios/seabios/src/hw/usb-msc.h +10 -0
- package/bios/seabios/src/hw/usb-ohci.c +568 -0
- package/bios/seabios/src/hw/usb-ohci.h +144 -0
- package/bios/seabios/src/hw/usb-uas.c +289 -0
- package/bios/seabios/src/hw/usb-uas.h +9 -0
- package/bios/seabios/src/hw/usb-uhci.c +571 -0
- package/bios/seabios/src/hw/usb-uhci.h +128 -0
- package/bios/seabios/src/hw/usb-xhci.c +1161 -0
- package/bios/seabios/src/hw/usb-xhci.h +133 -0
- package/bios/seabios/src/hw/usb.c +499 -0
- package/bios/seabios/src/hw/usb.h +254 -0
- package/bios/seabios/src/hw/virtio-blk.c +211 -0
- package/bios/seabios/src/hw/virtio-blk.h +43 -0
- package/bios/seabios/src/hw/virtio-pci.c +501 -0
- package/bios/seabios/src/hw/virtio-pci.h +151 -0
- package/bios/seabios/src/hw/virtio-ring.c +147 -0
- package/bios/seabios/src/hw/virtio-ring.h +121 -0
- package/bios/seabios/src/hw/virtio-scsi.c +220 -0
- package/bios/seabios/src/hw/virtio-scsi.h +47 -0
- package/bios/seabios/src/jpeg.c +1055 -0
- package/bios/seabios/src/kbd.c +599 -0
- package/bios/seabios/src/list.h +91 -0
- package/bios/seabios/src/malloc.c +561 -0
- package/bios/seabios/src/malloc.h +70 -0
- package/bios/seabios/src/memmap.h +21 -0
- package/bios/seabios/src/misc.c +195 -0
- package/bios/seabios/src/mouse.c +342 -0
- package/bios/seabios/src/optionroms.c +475 -0
- package/bios/seabios/src/output.c +584 -0
- package/bios/seabios/src/output.h +68 -0
- package/bios/seabios/src/pcibios.c +241 -0
- package/bios/seabios/src/pmm.c +176 -0
- package/bios/seabios/src/pnpbios.c +88 -0
- package/bios/seabios/src/post.c +337 -0
- package/bios/seabios/src/resume.c +157 -0
- package/bios/seabios/src/romfile.c +146 -0
- package/bios/seabios/src/romfile.h +21 -0
- package/bios/seabios/src/romlayout.S +698 -0
- package/bios/seabios/src/sercon.c +677 -0
- package/bios/seabios/src/serial.c +317 -0
- package/bios/seabios/src/sha1.c +147 -0
- package/bios/seabios/src/sha1.h +8 -0
- package/bios/seabios/src/stacks.c +771 -0
- package/bios/seabios/src/stacks.h +68 -0
- package/bios/seabios/src/std/LegacyBios.h +985 -0
- package/bios/seabios/src/std/acpi.h +323 -0
- package/bios/seabios/src/std/bda.h +174 -0
- package/bios/seabios/src/std/disk.h +175 -0
- package/bios/seabios/src/std/mptable.h +77 -0
- package/bios/seabios/src/std/multiboot.h +260 -0
- package/bios/seabios/src/std/optionrom.h +59 -0
- package/bios/seabios/src/std/pirtable.h +35 -0
- package/bios/seabios/src/std/pmm.h +19 -0
- package/bios/seabios/src/std/pnpbios.h +24 -0
- package/bios/seabios/src/std/smbios.h +167 -0
- package/bios/seabios/src/std/tcg.h +554 -0
- package/bios/seabios/src/std/vbe.h +156 -0
- package/bios/seabios/src/std/vga.h +63 -0
- package/bios/seabios/src/string.c +251 -0
- package/bios/seabios/src/string.h +31 -0
- package/bios/seabios/src/system.c +357 -0
- package/bios/seabios/src/tcgbios.c +2014 -0
- package/bios/seabios/src/tcgbios.h +19 -0
- package/bios/seabios/src/types.h +156 -0
- package/bios/seabios/src/util.h +251 -0
- package/bios/seabios/src/version.c +5 -0
- package/bios/seabios/src/vgahooks.c +355 -0
- package/bios/seabios/src/x86.c +23 -0
- package/bios/seabios/src/x86.h +277 -0
- package/bios/seabios/vgasrc/Kconfig +211 -0
- package/bios/seabios/vgasrc/bochsdisplay.c +59 -0
- package/bios/seabios/vgasrc/bochsvga.c +447 -0
- package/bios/seabios/vgasrc/bochsvga.h +57 -0
- package/bios/seabios/vgasrc/cbvga.c +337 -0
- package/bios/seabios/vgasrc/clext.c +627 -0
- package/bios/seabios/vgasrc/geodevga.c +434 -0
- package/bios/seabios/vgasrc/geodevga.h +89 -0
- package/bios/seabios/vgasrc/ramfb.c +163 -0
- package/bios/seabios/vgasrc/stdvga.c +485 -0
- package/bios/seabios/vgasrc/stdvga.h +81 -0
- package/bios/seabios/vgasrc/stdvgaio.c +186 -0
- package/bios/seabios/vgasrc/stdvgamodes.c +534 -0
- package/bios/seabios/vgasrc/swcursor.c +96 -0
- package/bios/seabios/vgasrc/vbe.c +432 -0
- package/bios/seabios/vgasrc/vgabios.c +1131 -0
- package/bios/seabios/vgasrc/vgabios.h +88 -0
- package/bios/seabios/vgasrc/vgaentry.S +161 -0
- package/bios/seabios/vgasrc/vgafb.c +661 -0
- package/bios/seabios/vgasrc/vgafb.h +42 -0
- package/bios/seabios/vgasrc/vgafonts.c +785 -0
- package/bios/seabios/vgasrc/vgahw.h +152 -0
- package/bios/seabios/vgasrc/vgainit.c +202 -0
- package/bios/seabios/vgasrc/vgalayout.lds.S +23 -0
- package/bios/seabios/vgasrc/vgautil.h +103 -0
- package/bios/seabios/vgasrc/vgaversion.c +6 -0
- package/build/binaries.js +1 -1
- package/build/index-debug.cjs +1 -1
- package/build/index-debug.js +1 -1
- package/build/index.cjs +1 -1
- package/build/index.js +1 -1
- package/build/v86-debug.wasm +0 -0
- package/build/v86.wasm +0 -0
- package/package.json +1 -1
|
@@ -0,0 +1,319 @@
|
|
|
1
|
+
// MPT Fusion boot support.
|
|
2
|
+
//
|
|
3
|
+
// Copyright (c) 2012 Verizon, Inc.
|
|
4
|
+
// Copyright (C) 2016 Paolo Bonzini <pbonzini@redhat.com>
|
|
5
|
+
//
|
|
6
|
+
// This file may be distributed under the terms of the GNU LGPLv3 license.
|
|
7
|
+
|
|
8
|
+
#include "biosvar.h" // GET_GLOBALFLAT
|
|
9
|
+
#include "block.h" // struct drive_s
|
|
10
|
+
#include "blockcmd.h" // scsi_drive_setup
|
|
11
|
+
#include "config.h" // CONFIG_*
|
|
12
|
+
#include "fw/paravirt.h" // runningOnQEMU
|
|
13
|
+
#include "malloc.h" // free
|
|
14
|
+
#include "output.h" // dprintf
|
|
15
|
+
#include "pcidevice.h" // foreachpci
|
|
16
|
+
#include "pci_ids.h" // PCI_DEVICE_ID
|
|
17
|
+
#include "pci_regs.h" // PCI_VENDOR_ID
|
|
18
|
+
#include "stacks.h" // run_thread
|
|
19
|
+
#include "std/disk.h" // DISK_RET_SUCCESS
|
|
20
|
+
#include "string.h" // memset
|
|
21
|
+
#include "util.h" // usleep
|
|
22
|
+
|
|
23
|
+
#define MPT_REG_DOORBELL 0x00
|
|
24
|
+
#define MPT_REG_WRITE_SEQ 0x04
|
|
25
|
+
#define MPT_REG_HOST_DIAG 0x08
|
|
26
|
+
#define MPT_REG_TEST 0x0c
|
|
27
|
+
#define MPT_REG_DIAG_DATA 0x10
|
|
28
|
+
#define MPT_REG_DIAG_ADDR 0x14
|
|
29
|
+
#define MPT_REG_ISTATUS 0x30
|
|
30
|
+
#define MPT_REG_IMASK 0x34
|
|
31
|
+
#define MPT_REG_REQ_Q 0x40
|
|
32
|
+
#define MPT_REG_REP_Q 0x44
|
|
33
|
+
|
|
34
|
+
#define MPT_DOORBELL_MSG_RESET 0x40
|
|
35
|
+
#define MPT_DOORBELL_HANDSHAKE 0x42
|
|
36
|
+
|
|
37
|
+
#define MPT_IMASK_DOORBELL 0x01
|
|
38
|
+
#define MPT_IMASK_REPLY 0x08
|
|
39
|
+
|
|
40
|
+
struct mpt_lun_s {
|
|
41
|
+
struct drive_s drive;
|
|
42
|
+
struct pci_device *pci;
|
|
43
|
+
u32 iobase;
|
|
44
|
+
u8 target;
|
|
45
|
+
u8 lun;
|
|
46
|
+
};
|
|
47
|
+
|
|
48
|
+
u8 reply_msg[4] __attribute((aligned(4))) VARLOW;
|
|
49
|
+
|
|
50
|
+
#define MPT_MESSAGE_HDR_FUNCTION_SCSI_IO_REQUEST (0x00)
|
|
51
|
+
#define MPT_MESSAGE_HDR_FUNCTION_IOC_INIT (0x02)
|
|
52
|
+
|
|
53
|
+
static struct MptIOCInitRequest
|
|
54
|
+
{
|
|
55
|
+
u8 WhoInit; /* Which system sent this init request. */
|
|
56
|
+
u8 Reserved1; /* Reserved */
|
|
57
|
+
u8 ChainOffset; /* Chain offset in the SG list. */
|
|
58
|
+
u8 Function; /* Function to execute. */
|
|
59
|
+
u8 Flags; /* Flags */
|
|
60
|
+
u8 MaxDevices; /* Max devices the driver can handle. */
|
|
61
|
+
u8 MaxBuses; /* Max buses the driver can handle. */
|
|
62
|
+
u8 MessageFlags; /* Message flags. */
|
|
63
|
+
u32 MessageContext; /* Message context ID. */
|
|
64
|
+
u16 ReplyFrameSize; /* Reply frame size. */
|
|
65
|
+
u16 Reserved2; /* Reserved */
|
|
66
|
+
u32 HostMfaHighAddr; /* Upper 32bit of the message frames. */
|
|
67
|
+
u32 SenseBufferHighAddr; /* Upper 32bit of the sense buffer. */
|
|
68
|
+
} MptIOCInitRequest = {
|
|
69
|
+
.WhoInit = 2,
|
|
70
|
+
.Function = MPT_MESSAGE_HDR_FUNCTION_IOC_INIT,
|
|
71
|
+
.MaxDevices = 8,
|
|
72
|
+
.MaxBuses = 1,
|
|
73
|
+
.ReplyFrameSize = sizeof(reply_msg),
|
|
74
|
+
.HostMfaHighAddr = 0,
|
|
75
|
+
.SenseBufferHighAddr = 0
|
|
76
|
+
};
|
|
77
|
+
|
|
78
|
+
struct MptIOCInitReply {
|
|
79
|
+
u8 WhoInit; /* Which subsystem sent this init request. */
|
|
80
|
+
u8 Reserved1; /* Reserved */
|
|
81
|
+
u8 MessageLength; /* Message length */
|
|
82
|
+
u8 Function; /* Function. */
|
|
83
|
+
u8 Flags; /* Flags */
|
|
84
|
+
u8 MaxDevices; /* Maximum number of devices the driver can handle. */
|
|
85
|
+
u8 MaxBuses; /* Maximum number of busses the driver can handle. */
|
|
86
|
+
u8 MessageFlags; /* Message flags. */
|
|
87
|
+
u32 MessageContext; /* Message context ID */
|
|
88
|
+
u16 Reserved2; /* Reserved */
|
|
89
|
+
u16 IOCStatus; /* IO controller status. */
|
|
90
|
+
u32 IOCLogInfo; /* IO controller log information. */
|
|
91
|
+
};
|
|
92
|
+
|
|
93
|
+
typedef struct MptSCSIIORequest {
|
|
94
|
+
u8 TargetID; /* Target ID */
|
|
95
|
+
u8 Bus; /* Bus number */
|
|
96
|
+
u8 ChainOffset; /* Chain offset */
|
|
97
|
+
u8 Function; /* Function number. */
|
|
98
|
+
u8 CDBLength; /* CDB length. */
|
|
99
|
+
u8 SenseBufferLength; /* Sense buffer length. */
|
|
100
|
+
u8 Reserved; /* Reserved */
|
|
101
|
+
u8 MessageFlags; /* Message flags. */
|
|
102
|
+
u32 MessageContext; /* Message context ID. */
|
|
103
|
+
u8 LUN[8]; /* LUN */
|
|
104
|
+
u32 Control; /* Control values. */
|
|
105
|
+
u8 CDB[16]; /* The CDB. */
|
|
106
|
+
u32 DataLength; /* Data length. */
|
|
107
|
+
u32 SenseBufferLowAddr; /* Sense buffer low 32bit address. */
|
|
108
|
+
} __attribute__((packed)) MptSCSIIORequest_t;
|
|
109
|
+
|
|
110
|
+
#define MPT_POLL_TIMEOUT 60000
|
|
111
|
+
|
|
112
|
+
typedef struct MptSGEntrySimple32 {
|
|
113
|
+
u32 FlagsLength;
|
|
114
|
+
u32 DataBufferAddressLow;
|
|
115
|
+
} __attribute__((packed)) MptSGEntrySimple32_t;
|
|
116
|
+
|
|
117
|
+
static int
|
|
118
|
+
mpt_scsi_cmd(u32 iobase, struct disk_op_s *op,
|
|
119
|
+
u8 *cdb, u16 target, u16 lun, u16 blocksize)
|
|
120
|
+
{
|
|
121
|
+
u32 end = timer_calc(MPT_POLL_TIMEOUT);
|
|
122
|
+
|
|
123
|
+
u8 sense_buf[18];
|
|
124
|
+
struct scsi_req {
|
|
125
|
+
MptSCSIIORequest_t scsi_io;
|
|
126
|
+
MptSGEntrySimple32_t sge;
|
|
127
|
+
} __attribute__((packed, aligned(4))) req = {
|
|
128
|
+
.scsi_io = {
|
|
129
|
+
.TargetID = target,
|
|
130
|
+
.Bus = 0,
|
|
131
|
+
.Function = MPT_MESSAGE_HDR_FUNCTION_SCSI_IO_REQUEST,
|
|
132
|
+
.CDBLength = 16,
|
|
133
|
+
.SenseBufferLength = 18,
|
|
134
|
+
.MessageContext = end & 0x7fffffff,
|
|
135
|
+
.DataLength = op->count * blocksize,
|
|
136
|
+
.SenseBufferLowAddr = (u32)MAKE_FLATPTR(GET_SEG(SS), &sense_buf[0]),
|
|
137
|
+
},
|
|
138
|
+
.sge = {
|
|
139
|
+
/* end of list, simple entry, end of buffer, last element */
|
|
140
|
+
.FlagsLength = (op->count * blocksize) | 0xD1000000,
|
|
141
|
+
.DataBufferAddressLow = (u32)op->buf_fl,
|
|
142
|
+
}
|
|
143
|
+
};
|
|
144
|
+
|
|
145
|
+
req.scsi_io.LUN[1] = lun;
|
|
146
|
+
memcpy(req.scsi_io.CDB, cdb, 16);
|
|
147
|
+
if (blocksize) {
|
|
148
|
+
if (scsi_is_read(op)) {
|
|
149
|
+
req.scsi_io.Control = 2 << 24;
|
|
150
|
+
} else {
|
|
151
|
+
req.scsi_io.Control = 1 << 24;
|
|
152
|
+
req.sge.FlagsLength |= 0x04000000;
|
|
153
|
+
}
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
outl((u32)MAKE_FLATPTR(GET_SEG(SS), &req), iobase + MPT_REG_REQ_Q);
|
|
157
|
+
|
|
158
|
+
for (;;) {
|
|
159
|
+
if (timer_check(end)) {
|
|
160
|
+
return DISK_RET_ETIMEOUT;
|
|
161
|
+
}
|
|
162
|
+
|
|
163
|
+
u32 istatus = inl(iobase + MPT_REG_ISTATUS);
|
|
164
|
+
if (istatus & MPT_IMASK_REPLY) {
|
|
165
|
+
u32 resp = inl(iobase + MPT_REG_REP_Q);
|
|
166
|
+
/* another read to turn interrupt off */
|
|
167
|
+
inl(iobase + MPT_REG_REP_Q);
|
|
168
|
+
if (resp == req.scsi_io.MessageContext) {
|
|
169
|
+
return DISK_RET_SUCCESS;
|
|
170
|
+
} else if (resp & 0x80000000) {
|
|
171
|
+
outl((u32)&reply_msg[0], iobase + MPT_REG_REP_Q);
|
|
172
|
+
return DISK_RET_EBADTRACK;
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
usleep(50);
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
int
|
|
180
|
+
mpt_scsi_process_op(struct disk_op_s *op)
|
|
181
|
+
{
|
|
182
|
+
if (!CONFIG_MPT_SCSI)
|
|
183
|
+
return DISK_RET_EBADTRACK;
|
|
184
|
+
|
|
185
|
+
u8 cdbcmd[16];
|
|
186
|
+
int blocksize = scsi_fill_cmd(op, cdbcmd, sizeof(cdbcmd));
|
|
187
|
+
if (blocksize < 0)
|
|
188
|
+
return default_process_op(op);
|
|
189
|
+
|
|
190
|
+
struct mpt_lun_s *llun_gf =
|
|
191
|
+
container_of(op->drive_fl, struct mpt_lun_s, drive);
|
|
192
|
+
u16 target = GET_GLOBALFLAT(llun_gf->target);
|
|
193
|
+
u16 lun = GET_GLOBALFLAT(llun_gf->lun);
|
|
194
|
+
u32 iobase = GET_GLOBALFLAT(llun_gf->iobase);
|
|
195
|
+
return mpt_scsi_cmd(iobase, op, cdbcmd, target, lun, blocksize);
|
|
196
|
+
}
|
|
197
|
+
|
|
198
|
+
static void
|
|
199
|
+
mpt_scsi_init_lun(struct mpt_lun_s *llun, struct pci_device *pci,
|
|
200
|
+
u32 iobase, u8 target, u8 lun)
|
|
201
|
+
{
|
|
202
|
+
memset(llun, 0, sizeof(*llun));
|
|
203
|
+
llun->drive.type = DTYPE_MPT_SCSI;
|
|
204
|
+
llun->drive.cntl_id = pci->bdf;
|
|
205
|
+
llun->pci = pci;
|
|
206
|
+
llun->target = target;
|
|
207
|
+
llun->lun = lun;
|
|
208
|
+
llun->iobase = iobase;
|
|
209
|
+
}
|
|
210
|
+
|
|
211
|
+
static int
|
|
212
|
+
mpt_scsi_add_lun(u32 lun, struct drive_s *tmpl_drv)
|
|
213
|
+
{
|
|
214
|
+
struct mpt_lun_s *tmpl_llun =
|
|
215
|
+
container_of(tmpl_drv, struct mpt_lun_s, drive);
|
|
216
|
+
struct mpt_lun_s *llun = malloc_fseg(sizeof(*llun));
|
|
217
|
+
if (!llun) {
|
|
218
|
+
warn_noalloc();
|
|
219
|
+
return -1;
|
|
220
|
+
}
|
|
221
|
+
mpt_scsi_init_lun(llun, tmpl_llun->pci, tmpl_llun->iobase,
|
|
222
|
+
tmpl_llun->target, lun);
|
|
223
|
+
|
|
224
|
+
char *name = znprintf(MAXDESCSIZE, "mpt %pP %d:%d",
|
|
225
|
+
llun->pci, llun->target, llun->lun);
|
|
226
|
+
int prio = bootprio_find_scsi_device(llun->pci, llun->target, llun->lun);
|
|
227
|
+
int ret = scsi_drive_setup(&llun->drive, name, prio);
|
|
228
|
+
free(name);
|
|
229
|
+
if (ret) {
|
|
230
|
+
goto fail;
|
|
231
|
+
}
|
|
232
|
+
return 0;
|
|
233
|
+
|
|
234
|
+
fail:
|
|
235
|
+
free(llun);
|
|
236
|
+
return -1;
|
|
237
|
+
}
|
|
238
|
+
|
|
239
|
+
static void
|
|
240
|
+
mpt_scsi_scan_target(struct pci_device *pci, u32 iobase, u8 target)
|
|
241
|
+
{
|
|
242
|
+
struct mpt_lun_s llun0;
|
|
243
|
+
|
|
244
|
+
mpt_scsi_init_lun(&llun0, pci, iobase, target, 0);
|
|
245
|
+
|
|
246
|
+
if (scsi_rep_luns_scan(&llun0.drive, mpt_scsi_add_lun) < 0)
|
|
247
|
+
scsi_sequential_scan(&llun0.drive, 8, mpt_scsi_add_lun);
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
static inline void
|
|
251
|
+
mpt_out_doorbell(u8 func, u8 arg, u16 iobase)
|
|
252
|
+
{
|
|
253
|
+
outl((func << 24) | (arg << 16), iobase + MPT_REG_DOORBELL);
|
|
254
|
+
}
|
|
255
|
+
|
|
256
|
+
static void
|
|
257
|
+
init_mpt_scsi(void *data)
|
|
258
|
+
{
|
|
259
|
+
struct pci_device *pci = data;
|
|
260
|
+
u16 *msg_in_p;
|
|
261
|
+
u32 iobase = pci_enable_iobar(pci, PCI_BASE_ADDRESS_0);
|
|
262
|
+
if (!iobase)
|
|
263
|
+
return;
|
|
264
|
+
struct MptIOCInitReply MptIOCInitReply;
|
|
265
|
+
pci_enable_busmaster(pci);
|
|
266
|
+
|
|
267
|
+
dprintf(1, "found mpt-scsi(%04x) at %pP, io @ %x\n"
|
|
268
|
+
, pci->device, pci, iobase);
|
|
269
|
+
|
|
270
|
+
// reset
|
|
271
|
+
mpt_out_doorbell(MPT_DOORBELL_MSG_RESET, 0, iobase);
|
|
272
|
+
outl(MPT_IMASK_DOORBELL|MPT_IMASK_REPLY , iobase + MPT_REG_IMASK);
|
|
273
|
+
outl(0, iobase + MPT_REG_ISTATUS);
|
|
274
|
+
|
|
275
|
+
// send IOC Init message through the doorbell
|
|
276
|
+
mpt_out_doorbell(MPT_DOORBELL_HANDSHAKE,
|
|
277
|
+
sizeof(MptIOCInitRequest)/sizeof(u32),
|
|
278
|
+
iobase);
|
|
279
|
+
|
|
280
|
+
outsl(iobase + MPT_REG_DOORBELL,
|
|
281
|
+
(u32 *)&MptIOCInitRequest,
|
|
282
|
+
sizeof(MptIOCInitRequest)/sizeof(u32));
|
|
283
|
+
|
|
284
|
+
// Read the reply 16 bits at a time. Cannot use insl
|
|
285
|
+
// because the port is 32 bits wide.
|
|
286
|
+
msg_in_p = (u16 *)&MptIOCInitReply;
|
|
287
|
+
while(msg_in_p != (u16 *)(&MptIOCInitReply + 1))
|
|
288
|
+
*msg_in_p++ = (u16)inl(iobase + MPT_REG_DOORBELL);
|
|
289
|
+
|
|
290
|
+
// Eat doorbell interrupt
|
|
291
|
+
outl(0, iobase + MPT_REG_ISTATUS);
|
|
292
|
+
|
|
293
|
+
// Post reply message used for SCSI errors
|
|
294
|
+
outl((u32)&reply_msg[0], iobase + MPT_REG_REP_Q);
|
|
295
|
+
|
|
296
|
+
int i;
|
|
297
|
+
for (i = 0; i < 7; i++)
|
|
298
|
+
mpt_scsi_scan_target(pci, iobase, i);
|
|
299
|
+
}
|
|
300
|
+
|
|
301
|
+
void
|
|
302
|
+
mpt_scsi_setup(void)
|
|
303
|
+
{
|
|
304
|
+
ASSERT32FLAT();
|
|
305
|
+
if (!CONFIG_MPT_SCSI || !runningOnQEMU()) {
|
|
306
|
+
return;
|
|
307
|
+
}
|
|
308
|
+
|
|
309
|
+
dprintf(3, "init MPT\n");
|
|
310
|
+
|
|
311
|
+
struct pci_device *pci;
|
|
312
|
+
foreachpci(pci) {
|
|
313
|
+
if (pci->vendor == PCI_VENDOR_ID_LSI_LOGIC
|
|
314
|
+
&& (pci->device == PCI_DEVICE_ID_LSI_53C1030
|
|
315
|
+
|| pci->device == PCI_DEVICE_ID_LSI_SAS1068
|
|
316
|
+
|| pci->device == PCI_DEVICE_ID_LSI_SAS1068E))
|
|
317
|
+
run_thread(init_mpt_scsi, pci);
|
|
318
|
+
}
|
|
319
|
+
}
|
|
@@ -0,0 +1,199 @@
|
|
|
1
|
+
// NVMe datastructures and constants
|
|
2
|
+
//
|
|
3
|
+
// Copyright 2017 Amazon.com, Inc. or its affiliates.
|
|
4
|
+
//
|
|
5
|
+
// This file may be distributed under the terms of the GNU LGPLv3 license.
|
|
6
|
+
|
|
7
|
+
#ifndef __NVME_INT_H
|
|
8
|
+
#define __NVME_INT_H
|
|
9
|
+
|
|
10
|
+
#include "types.h" // u32
|
|
11
|
+
#include "pcidevice.h" // struct pci_device
|
|
12
|
+
|
|
13
|
+
/* Data structures */
|
|
14
|
+
|
|
15
|
+
/* The register file of a NVMe host controller. This struct follows the naming
|
|
16
|
+
scheme in the NVMe specification. */
|
|
17
|
+
struct nvme_reg {
|
|
18
|
+
u64 cap; /* controller capabilities */
|
|
19
|
+
u32 vs; /* version */
|
|
20
|
+
u32 intms; /* interrupt mask set */
|
|
21
|
+
u32 intmc; /* interrupt mask clear */
|
|
22
|
+
u32 cc; /* controller configuration */
|
|
23
|
+
u32 _res0;
|
|
24
|
+
u32 csts; /* controller status */
|
|
25
|
+
u32 _res1;
|
|
26
|
+
u32 aqa; /* admin queue attributes */
|
|
27
|
+
u64 asq; /* admin submission queue base address */
|
|
28
|
+
u64 acq; /* admin completion queue base address */
|
|
29
|
+
};
|
|
30
|
+
|
|
31
|
+
/* Submission queue entry */
|
|
32
|
+
struct nvme_sqe {
|
|
33
|
+
union {
|
|
34
|
+
u32 dword[16];
|
|
35
|
+
struct {
|
|
36
|
+
u32 cdw0; /* Command DWORD 0 */
|
|
37
|
+
u32 nsid; /* Namespace ID */
|
|
38
|
+
u64 _res0;
|
|
39
|
+
u64 mptr; /* metadata ptr */
|
|
40
|
+
|
|
41
|
+
u64 dptr_prp1;
|
|
42
|
+
u64 dptr_prp2;
|
|
43
|
+
};
|
|
44
|
+
};
|
|
45
|
+
};
|
|
46
|
+
|
|
47
|
+
/* Completion queue entry */
|
|
48
|
+
struct nvme_cqe {
|
|
49
|
+
union {
|
|
50
|
+
u32 dword[4];
|
|
51
|
+
struct {
|
|
52
|
+
u32 cdw0;
|
|
53
|
+
u32 _res0;
|
|
54
|
+
u16 sq_head;
|
|
55
|
+
u16 sq_id;
|
|
56
|
+
u16 cid;
|
|
57
|
+
u16 status;
|
|
58
|
+
};
|
|
59
|
+
};
|
|
60
|
+
};
|
|
61
|
+
|
|
62
|
+
/* The common part of every submission or completion queue. */
|
|
63
|
+
struct nvme_queue {
|
|
64
|
+
u32 *dbl; /* doorbell */
|
|
65
|
+
u16 mask; /* length - 1 */
|
|
66
|
+
};
|
|
67
|
+
|
|
68
|
+
struct nvme_cq {
|
|
69
|
+
struct nvme_queue common;
|
|
70
|
+
struct nvme_cqe *cqe;
|
|
71
|
+
|
|
72
|
+
/* We have read upto (but not including) this entry in the queue. */
|
|
73
|
+
u16 head;
|
|
74
|
+
|
|
75
|
+
/* The current phase bit the controller uses to indicate that it has written
|
|
76
|
+
a new entry. This is inverted after each wrap. */
|
|
77
|
+
unsigned phase : 1;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
struct nvme_sq {
|
|
81
|
+
struct nvme_queue common;
|
|
82
|
+
struct nvme_sqe *sqe;
|
|
83
|
+
|
|
84
|
+
/* Corresponding completion queue. We only support a single SQ per CQ. */
|
|
85
|
+
struct nvme_cq *cq;
|
|
86
|
+
|
|
87
|
+
/* The last entry the controller has fetched. */
|
|
88
|
+
u16 head;
|
|
89
|
+
|
|
90
|
+
/* The last value we have written to the tail doorbell. */
|
|
91
|
+
u16 tail;
|
|
92
|
+
};
|
|
93
|
+
|
|
94
|
+
struct nvme_ctrl {
|
|
95
|
+
struct pci_device *pci;
|
|
96
|
+
struct nvme_reg volatile *reg;
|
|
97
|
+
|
|
98
|
+
u32 doorbell_stride; /* in bytes */
|
|
99
|
+
|
|
100
|
+
struct nvme_sq admin_sq;
|
|
101
|
+
struct nvme_cq admin_cq;
|
|
102
|
+
|
|
103
|
+
u32 ns_count;
|
|
104
|
+
struct nvme_namespace *ns;
|
|
105
|
+
|
|
106
|
+
struct nvme_sq io_sq;
|
|
107
|
+
struct nvme_cq io_cq;
|
|
108
|
+
};
|
|
109
|
+
|
|
110
|
+
struct nvme_namespace {
|
|
111
|
+
struct drive_s drive;
|
|
112
|
+
struct nvme_ctrl *ctrl;
|
|
113
|
+
|
|
114
|
+
u32 ns_id;
|
|
115
|
+
|
|
116
|
+
u64 lba_count; /* The total amount of sectors. */
|
|
117
|
+
|
|
118
|
+
u32 block_size;
|
|
119
|
+
u32 metadata_size;
|
|
120
|
+
|
|
121
|
+
/* Page aligned buffer of size NVME_PAGE_SIZE. */
|
|
122
|
+
char *dma_buffer;
|
|
123
|
+
};
|
|
124
|
+
|
|
125
|
+
/* Data structures for NVMe admin identify commands */
|
|
126
|
+
|
|
127
|
+
struct nvme_identify_ctrl {
|
|
128
|
+
u16 vid;
|
|
129
|
+
u16 ssvid;
|
|
130
|
+
char sn[20];
|
|
131
|
+
char mn[40];
|
|
132
|
+
char fr[8];
|
|
133
|
+
|
|
134
|
+
char _boring[516 - 72];
|
|
135
|
+
|
|
136
|
+
u32 nn; /* number of namespaces */
|
|
137
|
+
};
|
|
138
|
+
|
|
139
|
+
struct nvme_identify_ns_list {
|
|
140
|
+
u32 ns_id[1024];
|
|
141
|
+
};
|
|
142
|
+
|
|
143
|
+
struct nvme_lba_format {
|
|
144
|
+
u16 ms;
|
|
145
|
+
u8 lbads;
|
|
146
|
+
u8 rp;
|
|
147
|
+
u8 res;
|
|
148
|
+
};
|
|
149
|
+
|
|
150
|
+
struct nvme_identify_ns {
|
|
151
|
+
u64 nsze;
|
|
152
|
+
u64 ncap;
|
|
153
|
+
u64 nuse;
|
|
154
|
+
u8 nsfeat;
|
|
155
|
+
u8 nlbaf;
|
|
156
|
+
u8 flbas;
|
|
157
|
+
|
|
158
|
+
char _boring[128 - 27];
|
|
159
|
+
|
|
160
|
+
struct nvme_lba_format lbaf[16];
|
|
161
|
+
};
|
|
162
|
+
|
|
163
|
+
union nvme_identify {
|
|
164
|
+
struct nvme_identify_ns ns;
|
|
165
|
+
struct nvme_identify_ctrl ctrl;
|
|
166
|
+
struct nvme_identify_ns_list ns_list;
|
|
167
|
+
};
|
|
168
|
+
|
|
169
|
+
/* NVMe constants */
|
|
170
|
+
|
|
171
|
+
#define NVME_CAP_CSS_NVME (1ULL << 37)
|
|
172
|
+
|
|
173
|
+
#define NVME_CSTS_FATAL (1U << 1)
|
|
174
|
+
#define NVME_CSTS_RDY (1U << 0)
|
|
175
|
+
|
|
176
|
+
#define NVME_CC_EN (1U << 0)
|
|
177
|
+
|
|
178
|
+
#define NVME_SQE_OPC_ADMIN_CREATE_IO_SQ 1U
|
|
179
|
+
#define NVME_SQE_OPC_ADMIN_CREATE_IO_CQ 5U
|
|
180
|
+
#define NVME_SQE_OPC_ADMIN_IDENTIFY 6U
|
|
181
|
+
|
|
182
|
+
#define NVME_SQE_OPC_IO_WRITE 1U
|
|
183
|
+
#define NVME_SQE_OPC_IO_READ 2U
|
|
184
|
+
|
|
185
|
+
#define NVME_ADMIN_IDENTIFY_CNS_ID_NS 0U
|
|
186
|
+
#define NVME_ADMIN_IDENTIFY_CNS_ID_CTRL 1U
|
|
187
|
+
#define NVME_ADMIN_IDENTIFY_CNS_GET_NS_LIST 2U
|
|
188
|
+
|
|
189
|
+
#define NVME_CQE_DW3_P (1U << 16)
|
|
190
|
+
|
|
191
|
+
#define NVME_PAGE_SIZE 4096
|
|
192
|
+
|
|
193
|
+
/* Length for the queue entries. */
|
|
194
|
+
#define NVME_SQE_SIZE_LOG 6
|
|
195
|
+
#define NVME_CQE_SIZE_LOG 4
|
|
196
|
+
|
|
197
|
+
#endif
|
|
198
|
+
|
|
199
|
+
/* EOF */
|