OSDev

для всех
Текущее время: 02 май 2024, 01:17

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 6 ] 
Автор Сообщение
 Заголовок сообщения: Отличия ahci от idei
СообщениеДобавлено: 13 фев 2012, 05:23 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
http://www.intel.com/technology/seriala ... rev095.pdf
Написав ф-и работы с дисками через ide пишу ф-и для ahci и сравниваю их
Для начала также перебераю PCI и ищу класскод 010601h
Дальше у achi нужно читать ABAR AHCI Base Address <BAR5> , т.к. по этому адресу читаем заголовок Generic Host Control и
со смешением 100h идут данные о дисках раэмером 80h один за другим
00 1F Generic Host Control 0-31
20 9F Reserved 32-159
A0 FF Vendor Specific registers 160-255
100 17F Port 0 port control registers 256-383
180 1FF Port 1 port control registers 384-511
200 FFF (Ports 2 – port 29 control registers) 512-4095
1000 107F Port 30 port control registers 4096-4223
1080 10FF Port 31 port control registers 4224-4351

Пакет изменился не очень, добавили к адресу, но про флаг ни чего не сказали, в ide ставится заглушка.
align 4
PRDT:
.PRD_ADDR dd 0
.PRD_ADDRU dd 0
.PRD_RES dd 0
.PRD_COUNT dw 0
.PRD_FLAG dw 0

00 03 ID Identifiers 0-3
04 05 CMD Command Register 4-5
06 07 STS Device Status 6-7
08 08 RID Revision ID 8
09 0B CC Class Codes 9-11
0C 0C CLS Cache Line Size 12
0D 0D MLT Master Latency Timer 13
0E 0E HTYPE Header Type 14
0F 0F BIST Built In Self Test (Optional) 15
10 23 BARS Other Base Address Registres (Optional) <BAR0-4> 16-35
24 27 ABAR AHCI Base Address <BAR5> 36-39
2C 2F SS Subsystem Identifiers 44-47
30 33 EROM Expansion ROM Base Address (Optional) 48-51
34 34 CAP Capabilities Pointer 52
3C 3D INTR Interrupt Information 60-61
3E 3E MGNT Min Grant (Optional) 62
3F 3F MLAT Max Latency (Optional) 63

Про адрес сказали, что он 31-13
31:13 RW 0 Base Address (BA)
12:04 RO 0 Reserved
03 RO 0 Prefetchable (PF)
02:01 RO 00 Type (TP)
00 RO 0 Resource Type Indicator (RTE)


Последний раз редактировалось Станислав 13 мар 2012, 17:35, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отличия ahci от idei
СообщениеДобавлено: 14 фев 2012, 13:35 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
Заглужка не нужна, т.к. в командах мы должны указывать количество таблиц
Вот здесь подсказал мне Илья смотреть http://wiki.osdev.org/AHCI#Find_an_AHCI_controller
Там хорошо написано.
typedef struct tagHBA_CMD_HEADER
{
// DW0
BYTE cfl:5; // Command FIS length in DWORDS, 2 ~ 16 <-------------------------------------------
BYTE a:1; // ATAPI
BYTE w:1; // Write, 1: H2D, 0: D2H
BYTE p:1; // Prefetchable

BYTE r:1; // Reset
BYTE b:1; // BIST
BYTE c:1; // Clear busy upon R_OK
BYTE rsv0:1; // Reserved
BYTE pmp:4; // Port multiplier port

WORD prdtl; // Physical region descriptor table length in entries

// DW1
volatile
DWORD prdbc; // Physical region descriptor byte count transferred

// DW2, 3
DWORD ctba; // Command table descriptor base address
DWORD ctbau; // Command table descriptor base address upper 32 bits

// DW4 - 7
DWORD rsv1[4]; // Reserved
} HBA_CMD_HEADER;


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отличия ahci от idei
СообщениеДобавлено: 14 фев 2012, 15:40 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
В самом начале работы с Ahci думаю надо прочитать Generic Host Control по адресу бар5, где много полезной инфы. Например количество доступных портов, каким портам доступны прерывания, и т.п. . Потом по тому же адресу со смещением 256 читаем первый порт, где тоже много инфы о диске на этом порте и там есть адрес на список из 32 команд для чтения или записи секторов в память.
Я так думаю, что после добавления устройства и получения прирывания об этом нам нужно перепрочитать из Generic Host Control количество действующих портов.


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отличия ahci от idei
СообщениеДобавлено: 13 мар 2012, 15:39 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
Функция для чтения секторов с вики реально рабочая, я её перевёл на фасм и запустил в своёй оси вместо ide шной.
Плюсы в том, что больше стало инфы о дисках, и работаем командами mov, а не in out, для этого добавлен дополнительный дма движок в аши, так же можно вешать несколько команд сразу и LFB адрес 48бит.
Вот моя:

;cl-номер диска с 0 по 31, esi-номер сектора, edi-адрес в памяти
;ebx-количество байт, dx-количество секторов

read_ahci_dma:
movzx eax,cl ;первый диск
shl eax,7 ;умножим на 128 - 80h
add eax,100h ;добавим 256 - 100h
add eax,[ahciBUS] ;адрес диска
mov ebp,[eax] ;Адрес команд

add ebp,32 ;вторая команда, нужно искать свободную и забивать туда

mov word[ebp],5 ;pmp=0 C=0 b=0 r=0 p=0 w=0 a=0 cfl=5
add ebp,2
mov word[ebp],1 ;количество таблиц
add ebp,2
mov dword[ebp],0 ;размер передоваемых байт от устройства во время передачи изменяется
add ebp,4

mov dword[ebp],def39 ;адрес на таблицу с инфой и таблицами [31:07]
add ebp,4
mov dword[ebp],0
add ebp,4
mov dword[ebp],0
add ebp,4
mov dword[ebp],0
add ebp,4
mov dword[ebp],0
add ebp,4
mov dword[ebp],0

mov ebp,def39 ;Создадим CFIS

mov byte[ebp],27h ;FIS_REG_H2D
add ebp,1
mov byte[ebp],80h ;pmport=0 c=1
add ebp,1
mov byte[ebp],25h ;READ SECTORS DMA EXT
add ebp,1
mov byte[ebp],0
add ebp,1
mov [ebp],esi ;LBA
add ebp,3
mov byte[ebp],40h ;1<<6 LBA mode
add ebp,1
shr esi,24
mov [ebp],esi
add ebp,4
mov [ebp],dx ;количество секторов
add ebp,2
mov word[ebp],0
add ebp,2
mov dword[ebp],0

add ebp,70h ;Создадим PRDT
mov [ebp],edi ;куда читать
add ebp,4
mov dword[ebp],0
add ebp,4
mov dword[ebp],0
add ebp,4
or ebx, 80000000h ;количество байт и включим прерывания [21:00]
mov [ebp],ebx

add eax,38h ;запустим нашу команду CI
mov ebx,[eax]
mov edx,1
shl edx,1
or ebx,edx
mov [eax],ebx

@@:mov ebx,[eax]
test ebx,ebx ;test [eax],edx ;ждём завершения и выходим
jnz @b
ret


Прерывания можно и не включать, по завершении контроллер сам обнуляет бит команды, перед использованием функции нужно забить адреса для команд
Забивается в ней только одна прд запись из 65535, если байт забъёте больше, чем 22^2 не прочитает.

Нужно на большие объёмы создавать много таблиц прд и проверку на завершение лучше не делать, чтобы проц не занимать, а по завершении запускать команды из обработчика прерываний.


Последний раз редактировалось Станислав 14 мар 2012, 06:46, всего редактировалось 1 раз.

Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отличия ahci от idei
СообщениеДобавлено: 13 мар 2012, 19:33 

Зарегистрирован: 21 сен 2007, 17:24
Сообщения: 1088
Откуда: Балаково
Кстати на сайте Intel есть ещё спецификация 1.3.
http://www.intel.com/content/www/us/en/ ... ev1_3.html


Вернуться к началу
 Профиль  
 
 Заголовок сообщения: Re: Отличия ahci от idei
СообщениеДобавлено: 14 мар 2012, 04:20 
Заблокирован

Зарегистрирован: 28 окт 2011, 12:14
Сообщения: 555
Откуда: Новосибирск
да, я ей и пользовался, первая ссылка не помню почему такая, думал, что там 1.3. Кстати спецификацию SATA rev 3 найти не могу, от туда брали инфу для работы с ата, и чтение идентификации диска не сделал ещё.
To issue an ATA Identify command to the device, the FIS is constructed at follows.
FIS_REG_H2D fis;
memset(&fis, 0, sizeof(FIS_REG_H2D));
fis->fis_type = FIS_TYPE_REG_H2D;
fis->command = ATA_CMD_IDENTIFY; // 0xEC
fis->device = 0; // Master device
fis->c = 1; // Write command register

After the device receives this FIS and successfully read the 256 words data into its internal buffer, it sends a PIO Setup FIS – Device to Host to tell the host that it’s ready to transfer data and the data size (FIS_PIO_SETUP.tc).

After the PIO Setup FIS – Device to Host has been sent correctly, the device sends a DATA FIS to the host which contains the received data payload (FIS_DATA.data).

This scenario is described in SATA revision 3.0 as a PIO data-in command protocol. But an AHCI controller will do the latter two steps for the host. The host software needs only setup and issue the command FIS, and tells the AHCI controller the memory address and size to store the received data. After everything is done, the AHCI controller will issue an interrupt (if enabled) to notify the host to check the data.


Вернуться к началу
 Профиль  
 
Показать сообщения за:  Поле сортировки  
Начать новую тему Ответить на тему  [ Сообщений: 6 ] 

Часовой пояс: UTC + 3 часа


Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 9


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group
Русская поддержка phpBB