From 05439a4e3bffa302adb7c067207984a563a2b2d2 Mon Sep 17 00:00:00 2001 From: Matheus Date: Tue, 22 Nov 2022 13:38:02 -0300 Subject: [PATCH] nvme: detection --- src/arch/x86_64/main.c | 4 +++- src/sys/Makefile | 2 +- src/sys/block/Makefile | 12 ++++++++++++ src/sys/block/nvme.c | 40 ++++++++++++++++++++++++++++++++++++++++ 4 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 src/sys/block/Makefile create mode 100644 src/sys/block/nvme.c diff --git a/src/arch/x86_64/main.c b/src/arch/x86_64/main.c index 767b01ae..df12db5b 100644 --- a/src/arch/x86_64/main.c +++ b/src/arch/x86_64/main.c @@ -66,7 +66,7 @@ void kmain(){ consoledev_init(); pseudodevs_init(); - + #ifdef USE_E9 e9out_init(); @@ -76,6 +76,8 @@ void kmain(){ fb_init(); pci_enumerate(); + + nvme_init(); cpu_state_init(); diff --git a/src/sys/Makefile b/src/sys/Makefile index c6584189..c811dafa 100644 --- a/src/sys/Makefile +++ b/src/sys/Makefile @@ -1,5 +1,5 @@ objects := $(patsubst %.c,%.o,$(wildcard *.c)) -subdirs := mm sched syscalls pseudodevs +subdirs := mm sched syscalls pseudodevs block OBJPATH=$(OBJDIR)/sys/ export diff --git a/src/sys/block/Makefile b/src/sys/block/Makefile new file mode 100644 index 00000000..1d6ce393 --- /dev/null +++ b/src/sys/block/Makefile @@ -0,0 +1,12 @@ +objects := $(patsubst %.c,%.o,$(wildcard *.c)) +subdirs := +OBJPATH=$(OBJDIR) +export + +all: $(subdirs) $(objects) + for subdir in $(subdirs) ; do $(MAKE) -C $${subdir} ; done + +%.o: %.c + $(CC) $(CFLAGS) -o $@ $< + mkdir -p $(OBJPATH) + cp $@ $(OBJPATH)/$@ diff --git a/src/sys/block/nvme.c b/src/sys/block/nvme.c new file mode 100644 index 00000000..ee177efd --- /dev/null +++ b/src/sys/block/nvme.c @@ -0,0 +1,40 @@ +#include +#include + +typedef struct{ + uint64_t cap; + uint32_t vs; + uint32_t intms; + uint32_t intmc; + uint32_t cc; + uint32_t csts; + uint32_t aqa; + uint32_t asq; + uint64_t acq; +} __attribute__((packed)) nvme_bar0; + +int nvme_initctlr(pci_enumeration* pci){ + + void* bar0p = getbarmemaddr(pci->header, 0); + + nvme_bar0* bar0 = vmm_alloc(2, ARCH_MMU_MAP_READ | ARCH_MMU_MAP_WRITE); + + if(!bar0) + _panic("Out of memory", NULL); + + if(!vmm_map(bar0p, bar0, 2, ARCH_MMU_MAP_READ | ARCH_MMU_MAP_WRITE)) + _panic("Out of memory", NULL); + + printf("NVMe: controller detected: %02x:%02x.%x v%u cap %lx\n", pci->bus, pci->device, pci->function, bar0->vs, bar0->cap); +} + +void nvme_init(){ + + pci_enumeration* e = pci_getdevicecs(1, 8, 0); + + if(!e) + return; + + nvme_initctlr(e); + +}