Помощь - Поиск - Пользователи - Календарь
Полная версия этой страницы: Гранулярность выделенных PCI ресурсрв MMIO
Форум разработчиков электроники ELECTRONIX.ru > Интерфейсы > Форумы по интерфейсам > ISA/PCI/PCI-X/PCI Express
Bios71
проблемма в чем , есть тазик устройств некоторые(10-20шт) "резервируют" по 64Мб
но самая злая видеокарта 128Мб и потому у нее объявляется гранулярность 0x7FF FFFF

вот в процессе выделения ресурсов видео карте мы даем ей диапазон (с оглядкой на гранулярность 0x7FF FFFF)
0х7800 0000 - 0x8000 0000
или
0х8000 0000 - 0x8800 0000
0х8800 0000 - 0x9000 0000
0х9000 0000 - 0x9800 0000
0х9800 0000 - 0xА000 0000

да, но принципиальная гранулярность то 1 Мбайт !!
почему бы не дать
0х7810 0000 - 0x8010 0000
или
0х8020 0000 - 0x8820 0000
0х8830 0000 - 0x9030 0000
0х90А0 0000 - 0x98А0 0000
0х98F0 0000 - 0xА0F0 0000

есть ли ограничения "принципиального" характера в спецификации PCI, P2P мостов (или при написании драйверов/OpROM и пр.)
или это от "ленивости" писателей биоса biggrin.gif crying.gif

на Win7/32 4G RAM, из них выделяем 2G на PCI MMIO и остается менее 2G на ось с приложениями
мы теряем в дырах выделенной памяти до 200Мб (где 112Мб, где по 30Мб/12Мб и т.д)
виндоза начинает свопить и производительность падает ниже плинтуса
PS:на Win7/64 все нормально там 16Gb RAM

gerber
Цитата(Bios71 @ Apr 11 2014, 10:34) *
почему бы не дать
0х7810 0000 - 0x8010 0000
или
0х8020 0000 - 0x8820 0000
0х8830 0000 - 0x9030 0000
0х90А0 0000 - 0x98А0 0000
0х98F0 0000 - 0xА0F0 0000

есть ли ограничения "принципиального" характера в спецификации PCI, P2P мостов (или при написании драйверов/OpROM и пр.)
или это от "ленивости" писателей биоса biggrin.gif crying.gif

В спецификации PCI указано, что PCI устройство сигнализирует о востребовании себе величины адресного пространства путём "зануления" ("hardwiring to 0") неиспользуемых бит в регистре базового адреса. БИОС (или ОС) в процессе энумерации записывает в базовый адрес 0xFFFFFFFF и затем считывает обратно какое-то число. К примеру, если считано 0xF8000000, то устройство требует себе 128 Мбайт. Если система выделит физический адрес не 0x78000000, а 0x78100000 - то его просто нельзя будет записать в регистр базового адреса, так как младшие 27 бит аппаратно занулены и не хранятся в регистре устройства. Всё равно будет записано 0x78000000.
Это сделано для упрощения декодирования адреса при обращении к устройству по шине PCI. При такой схеме работы достаточно сравнить на равенство старшую часть адреса, чтобы определить, что устройство адресовано. В этом случае младшая часть является смещением (offset) внутри пространства регистров устройства. Это решается просто наложением логической маски по AND.
Если позволить записывать произвольный адрес (как Вы предлагаете), то для определения адресации внутри устройства нужно будет производить вычитание адресов в каждом цикле, и хранить целиком все 32 бита базового адреса, что довольно накладно с точки зрения реализации аппаратной логики PCI устройства.
Bios71
Цитата(gerber @ Apr 22 2014, 16:25) *
Если система выделит физический адрес не 0x78000000, а 0x78100000 - то его просто нельзя будет записать в регистр базового адреса, так как младшие 27 бит аппаратно занулены и не хранятся в регистре устройства. Всё равно будет записано 0x78000000.


спасибо за развернутый ответ,

собственно, я нашел ответ "методом научного тыка"(С) сам, но не мог найти "каноничного" обьяснения увиденному,
пишем 0x78100000, читаем обратно 0x78000000 т.е. не просто гранулярность, а и игнорирование "битов составляющих ту самую гранулярность"

вопрос исчерпан, данке

PS: PCI Express System Architecture
Chapter 22: PCI Compatible Configuration Registers
page 799
The binary-weighted value of the least-significant bit set to one in the Base Address field indicates the required amount of space. This is also the first read/writable bit in the register and all of the bits above it are by definition read/writable.
Для просмотра полной версии этой страницы, пожалуйста, пройдите по ссылке.
Invision Power Board © 2001-2025 Invision Power Services, Inc.