LINUX.ORG.RU

Драйвер PCI на платформе MIPS


0

0

Здравствуйте! Нужен совет) Пишу драйвер под Linux (точнее, под отечественную линуксоподобную поделку МСВС) для платы, подключенной к PCI-Compact. Из конфигурационного пространства получаю базовые адреса, отведенные системой для взаимодействия с этой платой. На платформе Intel: в драйвере преобразовываю полученные адреса (точнее, BAR2 согласно протоколу на плату) с помощью ioremap(), и затем оперирую с преобразованным адресом и смещениями при обмене данными (writel/readl для обмена 32-битным словом, и memcpy_toio/memcpy_from_io для обмена несколькими 32-битными словами). Взаимодействие между пользовательским приложением и драйвером – посредством put_user/get_user. Всё работает отлично, плата получает все данные, реагирует согласно протоколу.

Теперь возникла необходимость адаптировать этот же драйвер под MIPS-платформу (RM7000A). Из конфигурационного пространства: BAR2=0x20500000. Ioremap() не прокатывает. Прочёл про «прямой доступ к памяти» - обращения типа writel(0x20500000, (unsigned int) data) тоже не прокатывают (“unable to page request…”). Поигрался с функцией phys_to_virt() – вроде бы всё красиво получается, данные в преобразованный адрес вроде пишутся, и потом оттуда же считываются. Но… плата молчит))) В общем, вероятно, я неверно преобразовываю исходный адрес BAR2. Не могу понять механизм преобразования адресов в MIPS((( Из руководства к RM7000A:

Figure 6 Kernel Mode Virtual Addressing (32-bit) 0xFFFFFFFF Kernel virtual address space (kseg3) 0xE0000000 Mapped, 0.5GB

0xDFFFFFFF Supervisor virtual address space (ksseg) 0xC0000000 Mapped, 0.5GB

0xBFFFFFFF Uncached kernel physical address space (kseg1) 0xA0000000 Unmapped, 0.5GB

0x9FFFFFFF Cached kernel physical address space (kseg0) 0x80000000 Unmapped, 0.5GB

0x7FFFFFFF User virtual address space (kuseg) Mapped, 2.0GB

Что-то я откровенно запутался во всяческих типах адресов)) 0х20500000 – это виртуальный, физический, или…??? Прошу помощи, если кто работал с этим.


>0xBFFFFFFF Uncached kernel physical address space (kseg1) 0xA0000000 Unmapped, 0.5GB

0x9FFFFFFF Cached kernel physical address space (kseg0) 0x80000000 Unmapped, 0.5GB


Вся твоя периферия отображается где-то здесь и обращаться к ней как я понимаю можно через макросы readl/writel, обращение к первому блоку работает в обход кэша. По какому смещению находится память интересующая тебя - смотри манул повнимательней.

bengan
()

>Ioremap() не прокатывает

pci_iomap, не?

0х20500000 – это виртуальный, физический, или…???


MIPS не знаю, но рискну предположить, что это адрес шины (который в общем
случае не совпадает с физическим). Если так, то тебе какую-нибудь хрень типа
bus_to_phys или bus_to_virt надо использовать для конвертирования. Хотя опять
же, это если не делаешь pci_iomap.

ttnl ★★★★★
()

Мне казалось что PCI драйверы в Linux не зависят от архитектуры... Мне кажется ТС делает что-то не так раз ему требуется знание каких-то платформозависимых адресов.

I-Love-Microsoft ★★★★★
()

Дополнение... ТС забыл самую важную деталь! Версия ядра у МСВС и та что для MIPS процессора. У МСВС оно малость мамонтовое.

I-Love-Microsoft ★★★★★
()
Ответ на: комментарий от I-Love-Microsoft

Да, запамятовал про версии, 2.4.20 на Интеле, 2.4.31 на Мипсе.

pci_iomap

Честно говоря, перерыл поисковиком все библиотеки, в мсвс-ке нет такой функции((

Благодарю всех за советы) Сейчас пока плату отобрали конструктора, вернут - поиграюсь ещё, потом отпишусь, что получится)

Putnik
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.