Skip to content

Commit

Permalink
Starting to rewrite HDA driver in C (#124)
Browse files Browse the repository at this point in the history
Also: Disable Rust
  • Loading branch information
pimnik98 authored Jan 21, 2024
2 parents 79e3cdb + d3a29a4 commit 320c6b1
Show file tree
Hide file tree
Showing 12 changed files with 132 additions and 6 deletions.
1 change: 1 addition & 0 deletions .gitignore
Original file line number Diff line number Diff line change
Expand Up @@ -9,6 +9,7 @@
*.sea
*.vhd
*.tmp
*.pcap
.vscode/
*.d
/rust/target
Expand Down
6 changes: 3 additions & 3 deletions Makefile
Original file line number Diff line number Diff line change
Expand Up @@ -109,11 +109,11 @@ clean:
-rm -f rust/target -r

# Линковка файлов
$(KERNEL): $(KERNEL_NEED) $(RUST_SOURCES) rust/Cargo.toml
$(MAKE) build_rust
$(KERNEL): $(KERNEL_NEED) # $(RUST_SOURCES) rust/Cargo.toml
# $(MAKE) build_rust
@echo -e '\x1b[32mLINK \x1b[0m' $(KERNEL)
@rm -f $(KERNEL)
@$(LD) $(LDFLAGS) -o $(KERNEL) $(KERNEL_NEED) $(RUST_OBJ_RELEASE)
@$(LD) $(LDFLAGS) -o $(KERNEL) $(KERNEL_NEED) # $(RUST_OBJ_RELEASE)
@#llvm-strip -s $(KERNEL) # I know I strip all symbols so making unwind useless. (Fix it later)
@bash tools/genmap.sh
@bash tools/insertmap.sh
Expand Down
1 change: 1 addition & 0 deletions config.mk
Original file line number Diff line number Diff line change
Expand Up @@ -198,6 +198,7 @@ SOURCES=\
kernel/src/sys/file_descriptors.c \
kernel/src/net/stack.c \
kernel/src/toys/pavi.c \
kernel/src/drv/audio/hda.c \
$(GAMEBOY) \
kernel/src/kernel.c \
# kernel/src/lib/duktape.c \
Expand Down
Binary file removed iso/boot/ramdisk
Binary file not shown.
8 changes: 8 additions & 0 deletions kernel/include/drv/audio/hda.h
Original file line number Diff line number Diff line change
@@ -0,0 +1,8 @@
//
// Created by ndraey on 21.01.24.
//

#pragma once

void hda_init();
void hda_reset();
1 change: 1 addition & 0 deletions kernel/include/drv/pci.h
Original file line number Diff line number Diff line change
Expand Up @@ -81,4 +81,5 @@ void pci_print_list();
void pci_write(uint8_t bus, uint8_t slot, uint8_t func, uint32_t offset, uint32_t value);
void pci_find_device_by_class_and_subclass(uint16_t class, uint16_t subclass, uint16_t *vendor_ret, uint16_t *deviceid_ret,
uint8_t *bus_ret, uint8_t *slot_ret, uint8_t *func_ret);
void pci_enable_bus_mastering(uint8_t bus, uint8_t slot, uint8_t func);
uint32_t pci_read32(uint8_t bus, uint8_t slot, uint8_t function, uint8_t offset);
3 changes: 2 additions & 1 deletion kernel/include/sys/acpi.h
Original file line number Diff line number Diff line change
Expand Up @@ -8,4 +8,5 @@ extern uint32_t system_processors_found;

RSDPDescriptor* rsdp_find();
void find_facp(size_t rsdt_addr);
void find_apic(size_t rsdt_addr);
void find_apic(size_t rsdt_addr);
void acpi_scan_all_tables(uint32_t rsdt_addr);
67 changes: 67 additions & 0 deletions kernel/src/drv/audio/hda.c
Original file line number Diff line number Diff line change
@@ -0,0 +1,67 @@
//
// Created by ndraey on 21.01.24.
//

#include "drv/pci.h"
#include "drv/audio/hda.h"
#include "io/ports.h"
#include "io/tty.h"
#include "mem/pmm.h"

uint8_t hda_bus = 0,
hda_slot = 0,
hda_func = 0;

uint16_t hda_vendor = 0,
hda_device = 0;

uint32_t hda_addr = 0;

#define WRITE32(reg, value) *(volatile uint32_t*)(hda_addr + (reg)) = (value)
#define READ32(reg) (*(volatile uint32_t*)(hda_addr + (reg)))
#define WRITE16(reg, value) *(volatile uint16_t*)(hda_addr + (reg)) = (value)
#define READ16(reg) (*(volatile uint16_t*)(hda_addr + (reg)))
#define WRITE8(reg, value) *(volatile uint8_t*)(hda_addr + (reg)) = (value)
#define READ8(reg) (*(volatile uint8_t*)(hda_addr + (reg)))

void hda_init() {
pci_find_device_by_class_and_subclass(4, 3, &hda_vendor, &hda_device, &hda_bus, &hda_slot, &hda_func);

if(hda_vendor && hda_device) {
qemu_ok("Found Intel HDA! (%x:%x)", hda_vendor, hda_device);
} else {
return;
}

hda_addr = pci_read32(hda_bus, hda_slot, hda_func, 0x10) & ~0x10;

qemu_ok("HDA address: %x", hda_addr);
tty_printf("HDA address: %x\n", hda_addr);

map_pages(
get_kernel_page_directory(),
hda_addr,
hda_addr,
PAGE_SIZE,
PAGE_WRITEABLE | PAGE_CACHE_DISABLE // PAGE_PRESENT is set automatically
);

hda_reset();

tty_printf("HDA RESET OKAY!\n");
}

void hda_reset() {
if(!hda_vendor)
return;

WRITE32(0x08, 0);

while((READ32(0x08) & 1) != 0);

WRITE32(0x8, 1);

while ((READ32(0x08) & 1) != 1);

qemu_ok("Reset ok!");
}
8 changes: 8 additions & 0 deletions kernel/src/drv/pci.c
Original file line number Diff line number Diff line change
Expand Up @@ -416,6 +416,14 @@ void pci_find_device_by_class_and_subclass(uint16_t class, uint16_t subclass, ui
*bus_ret = *slot_ret = *func_ret = 0xFF;
}

void pci_enable_bus_mastering(uint8_t bus, uint8_t slot, uint8_t func) {
uint16_t command_register = pci_read_confspc_word(bus, slot, func, 4);

command_register |= 0x05;

pci_write(bus, slot, func, 4, command_register);
}

/**
* @brief [PCI] Ищет все устройства и выводит на экран
*/
Expand Down
6 changes: 4 additions & 2 deletions kernel/src/kernel.c
Original file line number Diff line number Diff line change
Expand Up @@ -22,6 +22,7 @@

#include "fs/natfs.h"
#include "net/stack.h"
#include "drv/audio/hda.h"

#include <lib/pixel.h>

Expand Down Expand Up @@ -403,6 +404,8 @@ int kernel(multiboot_header_t* mboot, uint32_t initial_esp) {

if (is_rsdp){
RSDPDescriptor* rsdp = rsdp_find();
acpi_scan_all_tables(rsdp->RSDTaddress);

find_facp(rsdp->RSDTaddress);
find_apic(rsdp->RSDTaddress);
}
Expand Down Expand Up @@ -519,8 +522,7 @@ int kernel(multiboot_header_t* mboot, uint32_t initial_esp) {

// vio_ntw_init();

extern void intel_hda_init();
intel_hda_init();
hda_init();

cli();

Expand Down
37 changes: 37 additions & 0 deletions kernel/src/sys/acpi.c
Original file line number Diff line number Diff line change
Expand Up @@ -67,6 +67,42 @@ ACPISDTHeader* find_table(uint32_t rsdt_addr, uint32_t sdt_count, char signature
return 0;
}

void acpi_scan_all_tables(uint32_t rsdt_addr) {
ACPISDTHeader* rsdt = (ACPISDTHeader*)rsdt_addr;

map_pages(
get_kernel_page_directory(),
rsdt_addr,
rsdt_addr,
PAGE_SIZE,
PAGE_PRESENT
);


uint32_t sdt_count = (rsdt->Length - sizeof(ACPISDTHeader));

qemu_log("LEN: %d (// %d)", rsdt->Length, sizeof(ACPISDTHeader));

uint32_t* rsdt_end = (uint32_t*)(rsdt_addr + sizeof(ACPISDTHeader));

qemu_log("RSDT start: %x", rsdt_addr);
qemu_log("RSDT end: %x", rsdt_end);
qemu_log("RSDT size: %d", sizeof(ACPISDTHeader));

for(uint32_t i = 0; i < sdt_count; i++) {
ACPISDTHeader* entry = (ACPISDTHeader*)(rsdt_end[i]);

if(entry == 0) {
break;
}

qemu_log("[%x] Found table: %.4s", entry, entry->Signature);
}

unmap_single_page(get_kernel_page_directory(), (virtual_addr_t) rsdt_addr);
}


void find_facp(size_t rsdt_addr) {
qemu_log("FACP at P%x", rsdt_addr);

Expand All @@ -78,6 +114,7 @@ void find_facp(size_t rsdt_addr) {
PAGE_PRESENT
);


ACPISDTHeader* rsdt = (ACPISDTHeader*)rsdt_addr;

// new_qemu_printf("OEM: %.11s\n", rsdt->OEMID);
Expand Down
Binary file modified netdump.pcap
Binary file not shown.

0 comments on commit 320c6b1

Please sign in to comment.