summaryrefslogtreecommitdiffhomepage
path: root/dev
diff options
context:
space:
mode:
Diffstat (limited to 'dev')
-rw-r--r--dev/Boot/amd64-desktop.make2
-rw-r--r--dev/Boot/src/HEL/AMD64/BootEFI.cc4
-rw-r--r--dev/Kernel/HALKit/AMD64/Storage/AHCI.cc35
-rw-r--r--dev/Kernel/NewKit/Macros.h2
-rw-r--r--dev/Mod/AHCI/AHCI.h30
5 files changed, 49 insertions, 24 deletions
diff --git a/dev/Boot/amd64-desktop.make b/dev/Boot/amd64-desktop.make
index cbfd9d87..2802c5e1 100644
--- a/dev/Boot/amd64-desktop.make
+++ b/dev/Boot/amd64-desktop.make
@@ -95,7 +95,7 @@ all: compile-amd64
.PHONY: disk
disk:
- dd if=/dev/zero of=$(BOOT) bs=1M count=100
+ dd if=/dev/zero of=$(BOOT) bs=30M count=100
mformat -i $(BOOT) -F -v "NEOS_ESP"
diff --git a/dev/Boot/src/HEL/AMD64/BootEFI.cc b/dev/Boot/src/HEL/AMD64/BootEFI.cc
index 4f9087c9..84a4a777 100644
--- a/dev/Boot/src/HEL/AMD64/BootEFI.cc
+++ b/dev/Boot/src/HEL/AMD64/BootEFI.cc
@@ -218,6 +218,7 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle,
syschk_thread->Start(handover_hdr, NO);
}
+#ifndef __AHCI__
Boot::BDiskFormatFactory<BootDeviceATA> partition_factory;
if (syschk_thread->Start(handover_hdr, NO) != kEfiOk)
@@ -244,7 +245,8 @@ EFI_EXTERN_C EFI_API Int32 Main(EfiHandlePtr image_handle,
fb_clear();
}
}
-
+#endif
+
// ------------------------------------------ //
// null these fields, to avoid being reused later.
// ------------------------------------------ //
diff --git a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
index e1f48503..f6656ce5 100644
--- a/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
+++ b/dev/Kernel/HALKit/AMD64/Storage/AHCI.cc
@@ -41,6 +41,9 @@
#define kSATASRBsy (0x80)
#define kSATASRDrq (0x08)
+#define kHBABohcBiosOwned (1 << 0)
+#define kHBABohcOSOwned (1 << 1)
+
#define kSATAPortCnt (0x20)
#define kSATASig (0x00000101)
@@ -88,6 +91,8 @@ STATIC Void drv_compute_disk_ahci() noexcept
kCurrentDiskModel[40] = '\0';
+ kSATASectorCount = identify_data[60] | identify_data[61];
+
kout << "Drive Model: " << kCurrentDiskModel << kendl;
kout << "Disk Size: " << number(drv_get_size()) << kendl;
@@ -119,9 +124,7 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz
if (slot == ~0)
return;
- HbaCmdHeader* command_header = ((HbaCmdHeader*)(((UInt64)kSATAHba->Ports[kSATAIndex].Clb)));
-
- command_header += slot;
+ volatile HbaCmdHeader* command_header = ((HbaCmdHeader*)(((UInt64)kSATAHba->Ports[kSATAIndex].Clb)));
MUST_PASS(command_header);
@@ -146,9 +149,10 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz
command_table->Prdt[i].Ie = YES;
}
- command_table->Prdt[i].Dba = ((UInt32)(UInt64)buffer_phys);
- command_table->Prdt[i].Dbc = ((size_buffer / command_header->Prdtl - 1) - 1);
- command_table->Prdt[i].Ie = YES;
+ command_table->Prdt[i].Dba = ((UInt32)(UInt64)buffer_phys + (i * command_table->Prdt[i].Dbc));
+ command_table->Prdt[i].Dbau = (((UInt64)(buffer_phys) >> 32) + (i * command_table->Prdt[i].Dbc));
+ command_table->Prdt[i].Dbc = ((size_buffer / command_header->Prdtl - 1) - 1);
+ command_table->Prdt[i].Ie = YES;
FisRegH2D* h2d_fis = (FisRegH2D*)(&command_table->Cfis);
@@ -163,7 +167,7 @@ STATIC Void drv_std_input_output(UInt64 lba, UInt8* buffer, SizeT sector_sz, Siz
h2d_fis->Lba1 = (lba >> 8) & 0xFF;
h2d_fis->Lba2 = (lba >> 16) & 0xFF;
- h2d_fis->Device = Identify ? 0 : kSATALBAMode;
+ h2d_fis->Device = Identify ? 0U : kSATALBAMode;
h2d_fis->Lba3 = (lba >> 24) & 0xFF;
h2d_fis->Lba4 = (lba >> 32) & 0xFF;
@@ -231,8 +235,8 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL atapi)
{
HbaMem* mem_ahci = (HbaMem*)kSATADev.Bar(kSATABar5);
- kSATADev.BecomeBusMaster((UInt32)(UIntPtr)mem_ahci);
- kSATADev.EnableMmio((UInt32)(UIntPtr)mem_ahci);
+ kSATADev.EnableMmio((UIntPtr)mem_ahci);
+ kSATADev.BecomeBusMaster((UIntPtr)mem_ahci);
UInt32 ports_implemented = mem_ahci->Pi;
UInt16 ahci_index = 0;
@@ -257,6 +261,17 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL atapi)
kout << "Detect: /dev/sat" << number(ahci_index) << kendl;
kSATAIndex = ahci_index;
+ kSATAHba = mem_ahci;
+
+ if (kSATAHba->Bohc & kHBABohcBiosOwned)
+ {
+ kSATAHba->Bohc |= kHBABohcOSOwned;
+
+ while (kSATAHba->Bohc & kHBABohcBiosOwned)
+ {
+
+ }
+ }
kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdFre;
kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdST;
@@ -270,6 +285,8 @@ STATIC Bool drv_std_init_ahci(UInt16& pi, BOOL atapi)
kout << "Detect: /dev/atp" << number(ahci_index) << kendl;
kSATAIndex = ahci_index;
+ kSATAHba = mem_ahci;
+
kSATAHba->Ports[ahci_index].Cmd |= kHBAPxCmdFre | kHBAPxCmdST;
kSATAHba->Ports[kSATAIndex].Cmd |= kHBAPxCmdFre;
diff --git a/dev/Kernel/NewKit/Macros.h b/dev/Kernel/NewKit/Macros.h
index 2cdd97ed..637a2a30 100644
--- a/dev/Kernel/NewKit/Macros.h
+++ b/dev/Kernel/NewKit/Macros.h
@@ -51,7 +51,7 @@
#endif // #ifndef ALIGN
#ifndef ATTRIBUTE
-#define ATTRIBUTE(X) __attribute__((X))
+#define ATTRIBUTE(...) __attribute__((__VA_ARGS__))
#endif // #ifndef ATTRIBUTE
#ifndef __NE_VER__
diff --git a/dev/Mod/AHCI/AHCI.h b/dev/Mod/AHCI/AHCI.h
index 9e534a1a..d4f8ceb1 100644
--- a/dev/Mod/AHCI/AHCI.h
+++ b/dev/Mod/AHCI/AHCI.h
@@ -271,16 +271,22 @@ typedef struct HbaMem final
typedef struct HbaCmdHeader final
{
// DW0
- NeOS::UInt8 Cfl : 5; // Command FIS length in DWORDS, 2 ~ 16
- NeOS::UInt8 Atapi : 1; // ATAPI
- NeOS::UInt8 Write : 1; // Write, 1: H2D, 0: D2H
- NeOS::UInt8 Prefetchable : 1; // Prefetchable
-
- NeOS::UInt8 Reset : 1; // Reset
- NeOS::UInt8 BIST : 1; // BIST
- NeOS::UInt8 Clear : 1; // Clear busy upon R_OK
- NeOS::UInt8 Reserved0 : 1; // Reserved
- NeOS::UInt8 Pmp : 4; // Port multiplier port
+ union {
+ struct
+ {
+ NeOS::UInt8 Cfl : 5; // Command FIS length in DWORDS, 2 ~ 16
+ NeOS::UInt8 Atapi : 1; // ATAPI
+ NeOS::UInt8 Write : 1; // Write, 1: H2D, 0: D2H
+ NeOS::UInt8 Prefetchable : 1; // Prefetchable
+
+ NeOS::UInt8 Reset : 1; // Reset
+ NeOS::UInt8 BIST : 1; // BIST
+ NeOS::UInt8 Clear : 1; // Clear busy upon R_OK
+ NeOS::UInt8 Reserved0 : 1; // Reserved
+ NeOS::UInt8 Pmp : 4; // Port multiplier port
+ };
+ NeOS::UInt16 Flags;
+ };
NeOS::UInt16 Prdtl; // Physical region descriptor table length in entries
NeOS::UInt32 Prdbc; // Physical region descriptor byte count transferred
@@ -288,8 +294,8 @@ typedef struct HbaCmdHeader final
NeOS::UInt32 Ctba; // Command table descriptor base address
NeOS::UInt32 Ctbau; // Command table descriptor base address upper 32 bits
- NeOS::UInt32 Rscv[4];
-} HbaCmdHeader;
+ NeOS::UInt32 Rsv[4];
+} ATTRIBUTE(packed, aligned(32)) HbaCmdHeader;
typedef struct HbaFis final
{