AHCI

Drive subsystem, filesystem drivers
  • ftp://ftp.kolibrios.org/users/Serge/new/ahci_rc04.7z
    Перенёс кеширование в драйвер. Теперь у меня чтение работает в три раза быстрее, чем через биос.
  • Проверил: реально, ускорение в несколько раз.
    Из хаоса в космос
  • Драйвер на сях, как обычно? :-) Увидел драйвер на АСМе в BareMetal - не поможет?
    Attachments
    ahci.asm.txt (11.09 KiB)
    Downloaded 300 times
  • Диски sd появились, но ни один не открывается. Ни fat, ни ntfs, ни ext3.

    lspci -v
    Spoiler:

    Code: Select all

    00:00.0 Host bridge: Intel Corporation 2nd Generation Core Processor Family DRAM Controller (rev 09)
    	Subsystem: Lenovo Device 3977
    	Flags: bus master, fast devsel, latency 0
    	Capabilities: <access denied>
    	Kernel driver in use: agpgart-intel
    
    00:02.0 VGA compatible controller: Intel Corporation 2nd Generation Core Processor Family Integrated Graphics Controller (rev 09) (prog-if 00 [VGA controller])
    	Subsystem: Lenovo Device 3977
    	Flags: bus master, fast devsel, latency 0, IRQ 42
    	Memory at 90000000 (64-bit, non-prefetchable) [size=4M]
    	Memory at 80000000 (64-bit, prefetchable) [size=256M]
    	I/O ports at 3000 [size=64]
    	Expansion ROM at <unassigned> [disabled]
    	Capabilities: <access denied>
    	Kernel driver in use: i915
    
    00:14.0 USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB xHCI Host Controller (rev 04) (prog-if 30 [XHCI])
    	Subsystem: Lenovo Device 3977
    	Flags: bus master, medium devsel, latency 0, IRQ 40
    	Memory at 90600000 (64-bit, non-prefetchable) [size=64K]
    	Capabilities: <access denied>
    	Kernel driver in use: xhci_hcd
    
    00:16.0 Communication controller: Intel Corporation 7 Series/C210 Series Chipset Family MEI Controller #1 (rev 04)
    	Subsystem: Lenovo Device 3977
    	Flags: bus master, fast devsel, latency 0, IRQ 11
    	Memory at 90615000 (64-bit, non-prefetchable) [size=16]
    	Capabilities: <access denied>
    
    00:1a.0 USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB Enhanced Host Controller #2 (rev 04) (prog-if 20 [EHCI])
    	Subsystem: Lenovo Device 3977
    	Flags: bus master, medium devsel, latency 0, IRQ 16
    	Memory at 90619000 (32-bit, non-prefetchable) [size=1K]
    	Capabilities: <access denied>
    	Kernel driver in use: ehci_hcd
    
    00:1b.0 Audio device: Intel Corporation 7 Series/C210 Series Chipset Family High Definition Audio Controller (rev 04)
    	Subsystem: Lenovo Device 3977
    	Flags: bus master, fast devsel, latency 0, IRQ 43
    	Memory at 90610000 (64-bit, non-prefetchable) [size=16K]
    	Capabilities: <access denied>
    	Kernel driver in use: snd_hda_intel
    
    00:1c.0 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 1 (rev c4) (prog-if 00 [Normal decode])
    	Flags: bus master, fast devsel, latency 0
    	Bus: primary=00, secondary=01, subordinate=01, sec-latency=0
    	Capabilities: <access denied>
    	Kernel driver in use: pcieport
    
    00:1c.1 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 2 (rev c4) (prog-if 00 [Normal decode])
    	Flags: bus master, fast devsel, latency 0
    	Bus: primary=00, secondary=02, subordinate=02, sec-latency=0
    	Memory behind bridge: 90500000-905fffff
    	Capabilities: <access denied>
    	Kernel driver in use: pcieport
    
    00:1c.3 PCI bridge: Intel Corporation 7 Series/C210 Series Chipset Family PCI Express Root Port 4 (rev c4) (prog-if 00 [Normal decode])
    	Flags: bus master, fast devsel, latency 0
    	Bus: primary=00, secondary=03, subordinate=03, sec-latency=0
    	I/O behind bridge: 00002000-00002fff
    	Memory behind bridge: 90400000-904fffff
    	Capabilities: <access denied>
    	Kernel driver in use: pcieport
    
    00:1d.0 USB controller: Intel Corporation 7 Series/C210 Series Chipset Family USB Enhanced Host Controller #1 (rev 04) (prog-if 20 [EHCI])
    	Subsystem: Lenovo Device 3977
    	Flags: bus master, medium devsel, latency 0, IRQ 23
    	Memory at 90618000 (32-bit, non-prefetchable) [size=1K]
    	Capabilities: <access denied>
    	Kernel driver in use: ehci_hcd
    
    00:1f.0 ISA bridge: Intel Corporation HM76 Express Chipset LPC Controller (rev 04)
    	Subsystem: Lenovo Device 3977
    	Flags: bus master, medium devsel, latency 0
    	Capabilities: <access denied>
    
    00:1f.2 SATA controller: Intel Corporation 7 Series Chipset Family 6-port SATA Controller [AHCI mode] (rev 04) (prog-if 01 [AHCI 1.0])
    	Subsystem: Lenovo Device 3977
    	Flags: bus master, 66MHz, medium devsel, latency 0, IRQ 41
    	I/O ports at 3088 [size=8]
    	I/O ports at 3094 [size=4]
    	I/O ports at 3080 [size=8]
    	I/O ports at 3090 [size=4]
    	I/O ports at 3060 [size=32]
    	Memory at 90617000 (32-bit, non-prefetchable) [size=2K]
    	Capabilities: <access denied>
    	Kernel driver in use: ahci
    
    00:1f.3 SMBus: Intel Corporation 7 Series/C210 Series Chipset Family SMBus Controller (rev 04)
    	Subsystem: Lenovo Device 3977
    	Flags: medium devsel, IRQ 18
    	Memory at 90614000 (64-bit, non-prefetchable) [size=256]
    	I/O ports at efa0 [size=32]
    
    02:00.0 Network controller: Atheros Communications Inc. AR9285 Wireless Network Adapter (PCI-Express) (rev 01)
    	Subsystem: Lenovo Device 30a1
    	Flags: bus master, fast devsel, latency 0, IRQ 17
    	Memory at 90500000 (64-bit, non-prefetchable) [size=64K]
    	Capabilities: <access denied>
    	Kernel driver in use: ath9k
    
    03:00.0 Ethernet controller: Atheros Communications Inc. AR8162 Fast Ethernet (rev 10)
    	Subsystem: Lenovo Device 3978
    	Flags: bus master, fast devsel, latency 0, IRQ 7
    	Memory at 90400000 (64-bit, non-prefetchable) [size=256K]
    	I/O ports at 2000 [size=128]
    	Capabilities: <access denied>
    
    boardlog
    Spoiler:

    Code: Select all

    K : edx=00036881
    K : has_ownership
    K : edx=00036881
    K : has_ownership
    K : enter ehci_init
    K : HCSPARAMS=00200003, HCCPARAMS=00036881
    K : stopped
    K : reset ok
    K : attaching to IRQ 0B
    K : EHCI controller at 00:D0 with 3 ports initialized
    K : enter ehci_init
    K : HCSPARAMS=00200003, HCCPARAMS=00036881
    K : stopped
    K : reset ok
    K : attaching to IRQ 0B
    K : EHCI controller at 00:E8 with 3 ports initialized
    K : EHCI 80AEA054: status of port 0 changed to 00001803
    K : EHCI 80AEE054: status of port 0 changed to 00001803
    K : 2 CPU detected
    Zero-config service:
    No Card found!
    K : EHCI 80AEA054: port 0 has HS or FS device, resetting
    K : EHCI 80AEE054: port 0 has HS or FS device, resetting
    =========  tmpdisk 0.45  =========
    tmpdisk.obj driver loaded successfully
    trying to add disk
    disk size is not specified
    10% from free RAM will be used, new DiskSize: 187 MB
    operation completed successfully
    K : EHCI 80AEA054: reset port 0 done
    K : EHCI 80AEE054: reset port 0 done
    K : EHCI 80AEA054 status of port 0 is 00001005
    K : malloc(24) -> 808236D0
    K : control pipe 80B14044
    K : EHCI 80AEE054 status of port 0 is 00001005
    K : malloc(24) -> 808236F0
    K : control pipe 80B140C4
    K : descr8: l=00000010; 12 01 00 02 09 00 01 40
    K : descr8: l=00000010; 12 01 00 02 09 00 01 40
    K : malloc(42) -> 80823710
    K : malloc(42) -> 80823748
    K : descr: l=0000001A
    K : 12 01 00 02 09 00 01 40 87 80 24 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00
    K : found USB device with ID 8087:0024, 1 configurations
    K : descr: l=0000001A
    K : 12 01 00 02 09 00 01 40 87 80 24 00 00 00 00 00 00 01 00 00 00 00 00 00 00 00
    K : found USB device with ID 8087:0024, 1 configurations
    K : know_length: l=00000010
    K : 09 02 19 00 01 01 00 E0 00 00 00 00 00 00 00 00
    K : malloc(68)K : -> 80823780
    K : know_length: l=00000010
    K : 09 02 19 00 01 01 00 E0 00 00 00 00 00 00 00 00
    K : malloc(68)K : -> 808236D0
    K : got_config: l=00000021
    K : 09 02 19 00 01 01 00 E0 00 09 04 00 00 01 09 00 00 00 07 05 81 03 01 00 0C 00 00 00 00 00 00 00 00
    K : got_config: l=00000021
    K : 09 02 19 00 01 01 00 E0 00 09 04 00 00 01 09 00 00 00 07 05 81 03 01 00 0C 00 3A 00 00 00 00 00 00
    K : USB interface class/subclass/protocol = 09/00/00
    K : USB interface class/subclass/protocol = 09/00/00
    K : found hub with 6 ports
    K : found hub with 6 ports
    K : [38] int pipe for hub 808237D0
    K : [38] hub 808237D0 port 05 clear feature 16
    K : final: hub 808237D0 port 5 status 0101 change 01
    K : [38] int pipe for hub 80823848
    K : [38] hub 80823848 port 06 clear feature 16
    K : final: hub 80823848 port 6 status 0101 change 01
    K : [48] [main] hub 808237D0 port 05 query status
    K : [48] [main] hub 80823848 port 06 query status
    K : [48] [connect test] hub 808237D0 port 05 status 0101 change 0000
    K : [48] hub 808237D0 port 05 initiate reset
    K : [48] [connect test] hub 80823848 port 06 status 0101 change 0000
    K : [48] hub 80823848 port 06 initiate reset
    K : [48] hub 808237D0 port 05 reset started
    K : [48] hub 80823848 port 06 reset started
    K : [49] [main] hub 808237D0 port 05 query status
    K : [49] [main] hub 80823848 port 06 query status
    K : hub 808237D0 port 05 ResetStatusData = 0111 change = 0000
    K : hub 80823848 port 06 ResetStatusData = 0111 change = 0000
    K : [50] [main] hub 808237D0 port 05 query status
    K : [50] [main] hub 80823848 port 06 query status
    K : hub 808237D0 port 05 ResetStatusData = 0503 change = 0010
    K : [50] hub 808237D0 port 05 clear feature 20
    K : hub 80823848 port 06 ResetStatusData = 0503 change = 0010
    K : [50] hub 80823848 port 06 clear feature 20
    K : [52] hub 808237D0 port 05 speed 2
    K : malloc(24) -> 80823720
    K : control pipe 80B14244
    K : [52] hub 80823848 port 06 speed 2
    K : malloc(24) -> 80823740
    K : control pipe 80B142C4
    K : descr8: l=00000010; 12 01 00 02 00 00 00 40
    K : descr8: l=00000010; 12 01 00 02 EF 02 01 40
    K : malloc(42) -> 808238C0
    K : malloc(42) -> 80823740
    K : descr: l=0000001A
    K : 12 01 00 02 00 00 00 40 8F 05 66 63 00 01 01 02 03 01 00 00 00 00 00 00 00 00
    K : found USB device with ID 058F:6366, 1 configurations
    K : descr: l=0000001A
    K : 12 01 00 02 EF 02 01 40 86 59 94 02 14 14 01 02 00 01 03 80 94 EA 03 80 00 01
    K : found USB device with ID 5986:0294, 1 configurations
    K : know_length: l=00000010
    K : 09 02 20 00 01 01 00 A0 00 00 00 00 00 00 00 00
    K : malloc(76)K : -> 808238F8
    K : got_config: l=00000028
    K : 09 02 20 00 01 01 00 A0 7D 09 04 00 00 02 08 06 50 00 07 05 01 02 00 02 00 07 05 82 02 00 02 00 00 00 00 00 00 00 00 00
    K : USB interface class/subclass/protocol = 08/06/50
    K : USB mass storage device detected
    K : 1 logical unit(s)
    K : peripheral device type is 00
    K : direct-access mass storage device detected
    K : Command 03 failed
    K : Command 03 failed
    K : know_length: l=00000010
    K : 09 02 7B 01 02 01 00 80 09 02 19 00 01 01 00 E0
    K : malloc(424)K : -> 80823A60
    K : Command 03 failed
    K : media not ready
    K : got_config: l=00000183
    K : 09 02 7B 01 02 01 00 80 A0 08 0B 00 02 0E 03 00 02 09 04 00 00 01 0E 01 00 02 0D 24 01 00 01 4F 00 80 C3 C9 01 01 01 12 24 02 01 01 02 00 00 00 00 00 00 00 00 03 00 00 00 0B 24 05 02 01 00 00 02 3F 04 00 09 24 03 03 01 01 00 02 00 1C 24 06 04 5D C7 17 A9 19 41 DA 11 AE 0E 00 0D 56 AC 7B 4C 08 01 01 03 59 80 80 00 07 05 81 03 0A 00 05 05 25 03 0A 00 09 04 01 00 00 0E 02 00 00 0E 24 01 01 8D 00 82 00 03 01 01 01 01 00 1B 24 04 01 03 59 55 59 32 00 00 10 00 80 00 00 AA 00 38 9B 71 10 01 00 00 00 00 1E 24 05 01 01 80 02 E0 01 00 00 B8 0B 00 00 B8 0B 00 60 09 00 15 16 05 00 01 15 16 05 00 1E 24 05 02 01 40 01 F0 00 00 00 B8 0B 00 00 B8 0B 00 58 02 00 15 16 05 00 01 15 16 05 00 22 24 05 03 01 A0 00 78 00 00 B8 0B 00 00 00 B8 0B 00 96 00 00 15 16 05 00 02 15 16 05 00 2B 2C 0A 00 06 24 0D 01 01 04 09 04 01 01 01 0E 02 00 00 07 05 82 05 80 00 01 09 04 01 02 01 0E 02 00 00 07 05 82 05 00 02 01 09 04 01 03 01 0E 02 00 00 07 05 82 05 00 04 01 09 04 01 04 01 0E 02 00 00 07 05 82 05 00 0B 01 09 04 01 05 01 0E 02 00 00 07 05 82 05 00 0C 01 09 04 01 06 01 0E 02 00 00 07 05 82 05 80 13 01 09 04 01 07 01 0E 02 00 00 07 05 82 05 00 14 01 00 00 00 00 00 00 00 00
    K : malloc(432) -> 80823C10
    K : USB interface class/subclass/protocol = 0E/01/00
    K : failed to load class driver
    K : USB interface class/subclass/protocol = 0E/02/00
    K : failed to load class driver
    K : note: alternate setting with 0E/02/00
    K : note: alternate setting with 0E/02/00
    K : note: alternate setting with 0E/02/00
    K : note: alternate setting with 0E/02/00
    K : note: alternate setting with 0E/02/00
    K : note: alternate setting with 0E/02/00
    K : note: alternate setting with 0E/02/00
    ahci_rc04
    sys_alloc 472 bytes
    os_mmap 8c70c000 131072 bytes
    AHCI 8086_1e03
    PCI cmd 7 irq line 7
    mmio base: 90617000 size 800
    host ctl 80000000
    port map 12
    ahci ports: 6
    port 0: ipm 0 det 0 ATA device  status: ready
    port 1: ipm 1 det 3 ATA device  status: ready
    port 2: ipm 0 det 0 ATA device  status: ready
    port 3: ipm 0 det 0 ATA device  status: ready
    port 4: ipm 1 det 3 ATAPI device  status: ready
    port 5: ipm 0 det 0 ATA device  status: ready
    ST320LT020-9YG142 LBA48 625142448 sectors total
    disk 80823a60
    ahci_adjust_cache_size 1048576
    
  • SoUrcerer
    А у тебя на диске fat32 точно есть ? Остальные разделы ядро не умеет монтировать динамически, хотя показывает.

    yogev_ezra
    Я сперва хочу полностью отладить драйвер, а потом уже думать об асме.
    Забавный в BareMetal код, смесь 32-х и 64-х битного кода, но новые регистры r8-r15 не используют. Или особенность дизайна, или код тупо конвертирован с 32-х бит. А все дисковые операции выполняются в режиме опроса, без IRQ.
  • Да, у меня есть на диске fat32. Этот раздел KFAR пытался открыть чуть дольше других - даже "подвис" на полминуты, а затем выдал сообщение об ошибке - такое же, как и все остальные.
  • SoUrcerer
    Интересно, а если с отладкой ?
    ftp://ftp.kolibrios.org/users/Serge/new ... t/ahci.dll
    У тебя ноут, возможно энергосбережение вмешивается.
  • Serge wrote:yogev_ezra
    Я сперва хочу полностью отладить драйвер, а потом уже думать об асме.
    Забавный в BareMetal код, смесь 32-х и 64-х битного кода, но новые регистры r8-r15 не используют. Или особенность дизайна, или код тупо конвертирован с 32-х бит. А все дисковые операции выполняются в режиме опроса, без IRQ.
    Ясно. Но всё равно, большое спасибо, что серьёзно отнёсся к моему предложению, и даже посмотрел код.
    SoUrcerer wrote:Да, у меня есть на диске fat32. Этот раздел KFAR пытался открыть чуть дольше других - даже "подвис" на полминуты, а затем выдал сообщение об ошибке - такое же, как и все остальные.
    Лог от USB ядра. В обычной ночной сборке так же себя ведёт? Чтоб не оказалось, что это баг в USB ядре вообще.
  • yogev_ezra
    Я проверил свежую сборку и usb ядро, всё работало.
  • Я сначала открыл /bd0/6 - мой fat32-диск, а затем запустил ahci-драйвер. На этот раз /sd0/7 открылся - странно, что разделов больше, чем есть на самом деле (возможно, один из них - расширенный?)
    Spoiler:
    2.png
    2.png (157.5 KiB)
    Viewed 11429 times
    Spoiler:

    Code: Select all

    ahci_rc04
    sys_alloc 472 bytes
    os_mmap 8c70c000 131072 bytes
    AHCI 8086_1e03
    PCI cmd 7 irq line 7
    mmio base: 90617000 size 800
    host ctl 80000000
    port map 12
    ahci ports: 6
    port 0: ipm 0 det 0 ATA device  status: ready
    port 1: ipm 1 det 3 ATA device  status: ready
    port 2: ipm 0 det 0 ATA device  status: ready
    port 3: ipm 0 det 0 ATA device  status: ready
    port 4: ipm 1 det 3 ATAPI device  status: ready
    port 5: ipm 0 det 0 ATA device  status: ready
    ST320LT020-9YG142 LBA48 625142448 sectors total
    disk 80823a60
    ahci_adjust_cache_size 1048576
    ahci_disk_read dev 8c70e930 buffer: 8c744000 start: 0 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c748000 start: 2048 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c74c000 start: 411648 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c750000 start: 53450720 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c754000 start: 53450752 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c758000 start: 106520576 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c75c000 start: 106522624 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c760000 start: 111708160 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c764000 start: 111710208 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c768000 start: 584187648 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c76c000 start: 584187712 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c770000 start: 622749376 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c774000 start: 622749696 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c778000 start: 622757888 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c77c000 start: 622753216 count 32
    ahci_disk_read dev 8c70e930 buffer: 8c780000 start: 622759872 count 32
    K : destroy app object
    K : destroy app object
    K : destroy app object
    
    Затем я записал на /bd0/6 скриншот и копию лога. На /sd0/7 изменений не произошло, и тогда я попытался на /sd0/7/ походить по папкам. Одна из папок открылась, другая привела к задумчивости KFAR, и вот такому результату:
    Spoiler:
    3.png
    3.png (161.22 KiB)
    Viewed 11429 times
    В логе добавилась только одна строчка после этого:

    Code: Select all

    ahci_disk_read dev 8c70e930 buffer: 8c784000 start: 622760160 count 32
    
    Смена диска на /bd0/6/, а затем обратно на /sd0/7/ вернула отображение списка каталогов (самого первого, до записи скриншотов и логов).
    Прошу прощения за качество скриншотов; я думаю, это проблема scrshot - отпишусь сейчас в теме.
  • SoUrcerer
    /sd и /bd диски плохо совместимы. После запуска драйвера /bd лучше совсем не трогать. Ещё лучше отключить их в загрузочном экране. Тем более что у каждого свой кеш и они не синхронизируются между собой.
  • Провел тесты скорости копирования файла в 139МБ на /tmp
    IDE /hd - 10.4 с
    AHCI /bd - 20.2 c
    AHCI /sd - 7.4 c
    Получается максимум 19 МБ/с, совсем не густо.
  • Кэш 1 Мб.
    Всем чмоки в этом проекте! Засуньте эти 11 лет себе в жопу!
  • Мало влияет, тестировал 4Мб и 8Мб разница незаметна. Скорее больше влияет количество секторов за одну операцию.
  • Who is online

    Users browsing this forum: No registered users and 2 guests