feat: initial locking etc.

This commit is contained in:
2021-03-01 21:07:53 +01:00
parent ebe006a8ba
commit 990b850c43
14 changed files with 427 additions and 14 deletions

View File

@@ -14,6 +14,7 @@
#include <libc/kprintf.h>
#include <fs/blockdev.h>
#include <mem/malloc.h>
#include <tasks/locking.h>
#define ATA_SR_BSY 0x80 // Busy
#define ATA_SR_DRDY 0x40 // Drive ready
@@ -135,6 +136,8 @@ typedef struct {
uint8_t print_error: 1;
} ide_block_device_info;
mutex_t *ide_lock = NULL;
uint8_t ide_read(uint8_t channel, uint8_t reg);
void ide_write(uint8_t channel, uint8_t reg, uint8_t data);
@@ -437,6 +440,12 @@ uint8_t ide_pci_initialize(pci_device *device) {
return PCI_INIT_FAIL;
}
if (ide_lock != NULL) {
k_panics("IDE already initialized\n");
}
ide_lock = mutex_create();
mutex_acquire(ide_lock);
// disable IRQ
ide_write(ATA_PRIMARY, ATA_REG_CONTROL, 2);
ide_write(ATA_SECONDARY, ATA_REG_CONTROL, 2);
@@ -518,6 +527,7 @@ uint8_t ide_pci_initialize(pci_device *device) {
count++;
}
}
mutex_release(ide_lock);
ide_register_block_devices();
return PCI_INIT_OK;
@@ -673,5 +683,8 @@ uint8_t ide_access(uint8_t direction, uint8_t drive, uint32_t lba, uint8_t numse
|| ide_devices[drive].type == IDE_ATAPI) {
return 0xF1;
}
return ide_read_ata_access(direction, drive, lba, numsects, target);
mutex_acquire(ide_lock);
uint8_t result = ide_read_ata_access(direction, drive, lba, numsects, target);
mutex_release(ide_lock);
return result;
}