From 2014ce4f9ce8bc1f678235fa2fe674ac62c7b0bb Mon Sep 17 00:00:00 2001 From: Aaron Date: Sat, 15 Mar 2025 10:42:18 +0000 Subject: [PATCH] AHCI Progress --- src/driver/storage/AHCI/AHCI.pas | 66 +++++++++++++++++-- src/driver/storage/AHCI/AHCITypes.pas | 91 ++++++++++++++++++++++++++- src/include/lists.pas | 3 +- 3 files changed, 153 insertions(+), 7 deletions(-) diff --git a/src/driver/storage/AHCI/AHCI.pas b/src/driver/storage/AHCI/AHCI.pas index 85948107..c008d9e8 100644 --- a/src/driver/storage/AHCI/AHCI.pas +++ b/src/driver/storage/AHCI/AHCI.pas @@ -1,3 +1,23 @@ + +// Copyright 2021 Aaron Hance +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. + +{ + Drivers->Storage->AHCI->AHCI - AHCI Driver. + + @author(Aaron Hance ) +} unit AHCI; interface @@ -10,13 +30,11 @@ uses lmemorymanager, console, vmemorymanager, - AHCITypes; + AHCITypes, + lists; var - ahciControllers : array[0..255] of pointer; - ahciControllerCount : uint32; - - hba : array[0..255] of THBA_Memory; + ahciControllers : PDLList; procedure init(); procedure load(); @@ -36,10 +54,48 @@ begin devID.id4:= idANY; devID.ex:= nil; drivermanagement.register_driver('ATA/PI AHCI Driver', @devID, @load); + //TODO check IDE devices in ide for sata devices +end; + +procedure check_ports(controller : PAHCI_Controller); +var + i : uint32; + port : PHBA_Port; +begin end; procedure load(ptr : void); +var + device : PPCI_Device; + controller : PAHCI_Controller; + i : uint32; + base : PHBA_Memory; begin + console.writestringln('AHCI: initilizing a new controller'); + + if ahciControllers = nil then begin + console.writestringln('AHCI: Initializing controller list'); + ahciControllers := DL_New(SizeOf(TAHCI_Controller)); + end; + + device := PPCI_Device(ptr); + + controller := DL_Add(ahciControllers); + controller^.device := device; + + base: PHBA_Memory(kpalloc(device^.address5)); // get the base address of the controller + controller^.mio := base; + + //enable AHCI mode, TODO check if is not already in AHCI mode and enable it, also perhaps remove if loaded as IDE + base^.ghc := base^.ghc or AHCI_CONTROLLER_MODE; + + //clear any pending interrupts + base^.int_status := $FFFFFFFF; + + + + + // console.writestringln('AHCI: initilizing a new controller'); // ahciControllers[ahciControllerCount] := ptr; // hba[ahciControllerCount] := PPCI_Device(ptr)^.address5; diff --git a/src/driver/storage/AHCI/AHCITypes.pas b/src/driver/storage/AHCI/AHCITypes.pas index deb6ef2d..3be083b2 100644 --- a/src/driver/storage/AHCI/AHCITypes.pas +++ b/src/driver/storage/AHCI/AHCITypes.pas @@ -1,4 +1,22 @@ +// Copyright 2021 Aaron Hance +// +// Licensed under the Apache License, Version 2.0 (the "License"); +// you may not use this file except in compliance with the License. +// You may obtain a copy of the License at +// +// http://www.apache.org/licenses/LICENSE-2.0 +// +// Unless required by applicable law or agreed to in writing, software +// distributed under the License is distributed on an "AS IS" BASIS, +// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. +// See the License for the specific language governing permissions and +// limitations under the License. +{ + Drivers->Storage->AHCI->AHCITypes - AHCI Driver Types. + + @author(Aaron Hance ) +} unit AHCITypes; interface uses @@ -11,6 +29,13 @@ uses vmemorymanager; const + AHCI_CONTROLLER_MODE = $80000000; + + //device type signatures + SATA_SIG_ATA = $00000101; + SATA_SIG_ATAPI = $EB140101; + SATA_SIG_SEMB = $C33C0101; + SATA_SIG_PM = $96690101; @@ -72,6 +97,8 @@ type ports: array[0..31] of THBA_Port; end; + PHBA_Memory = ^THBA_Memory; + { AHCI Host Bus Adapter (HBA) FIS (Frame Information Structure) Interface This structure is used to access the AHCI HBA's FIS (Frame Information Structure) @@ -163,10 +190,72 @@ type PHBA = ^THBA; + ////////////////////////////////////////// + //////////// Asuro AHCI types //////////// + ////////////////////////////////////////// + { + Device type enum + } + TDeviceType = ( + SATA, + ATAPI, + SEMB, + PM + ); + + { + controller reference + } + TAHCI_Controller = bitpacked record + pci_device : PPCI_Device; + mio: PHBA_Memory; + devices : array[0..31] of uint8; //TODO type for devices + end; + + PAHCI_Controller = ^TAHCI_Controller; + + + function get_device_type(sig : uint32) : TDeviceType; + function get_device_type_string(deive_type : TDeviceType) : string; implementation +function get_device_type(sig : uint32) : TDeviceType; +begin + case sig of + SATA_SIG_ATA: begin + get_device_type := SATA; + end; + SATA_SIG_ATAPI: begin + get_device_type := ATAPI; + end; + SATA_SIG_SEMB: begin + get_device_type := SEMB; + end; + SATA_SIG_PM: begin + get_device_type := PM; + end; + end; +end; + +function get_device_type_string(deive_type : TDeviceType) : string; +begin + case deive_type of + SATA: begin + get_device_type_string := 'SATA'; + end; + ATAPI: begin + get_device_type_string := 'ATAPI'; + end; + SEMB: begin + get_device_type_string := 'SEMB'; + end; + PM: begin + get_device_type_string := 'PM'; + end; + end; +end; + end. - diff --git a/src/include/lists.pas b/src/include/lists.pas index 2935e76f..4286e5ac 100644 --- a/src/include/lists.pas +++ b/src/include/lists.pas @@ -1,4 +1,4 @@ -// Copyright 2021 Kieron Morris +// Copyright 2021 Kieron Morris & Aaron Hance // // Licensed under the Apache License, Version 2.0 (the "License"); // you may not use this file except in compliance with the License. @@ -16,6 +16,7 @@ Include->Lists - Linked List Data Structures & Helpers. @author(Kieron Morris ) + @author(Aaron Hance ) } unit lists;