Как определяется размер шины PCI / PCIe BAR?

Я знаю, что регистр базового адреса (BAR) в пространстве конфигурации PCI определяет начальное местоположение адреса PCI, но как определяется размер этой области?

Конечно, это свойство оборудования, поскольку только оно знает, как далеко в своем адресном пространстве может работать. Однако я не вижу поля размера BAR в структуре конфигурации PCI.


person JeffV    schedule 25.09.2013    source источник


Ответы (3)


Прежде всего, размер BAR должен быть степенью двойки (например, 1 KiB, 2 MiB), и каждая область должна быть выровнена в памяти так, чтобы младшие log2(size) биты базового адреса всегда равнялись нулю. Например, предположим, что конечная точка имеет область памяти 4 КиБ, что дает диапазон адресов 0-0xfff. Хост может переназначить начало этой области на f.x. 0x1000 или 0xabcd000 путем записи в регистр BAR, но не в 0x1080 или 0xabcd100.

Когда записывается регистр BAR, конечная точка будет игнорировать младшие биты и всегда возвращать нули при чтении. Таким образом, запись 0xffffffff в регистр и последующее считывание значения указывает размер области. Для примера 4 KiB это возвращает 0xfffff00X (младшие четыре бита зарезервированы, см. Спецификацию). Чтобы определить размер:

  • Очистить младшие четыре бита до нуля (0xfffff000)
  • Инвертировать все 32 бита (0xfff)
  • Добавьте единицу к результату (0x1000 = 4096 bytes)

Это также работает для 64-битных областей. Значение следующего регистра базового адреса формирует старшие биты базового адреса. Это описано в разделе 6.2.5.1 спецификации PCI 3.0.

person pc3e    schedule 21.09.2016

Нашел ответ на OSDev Wiki:

«Чтобы определить объем адресного пространства, необходимого для устройства PCI, вы должны сохранить исходное значение BAR, записать значение всех единиц в регистр, а затем прочитать его обратно».

person JeffV    schedule 26.09.2013

Устройство PCIe может иметь конфигурационное пространство типа 0 (конечные точки) или типа 1 (RC, коммутаторы или мосты).

- Устройство типа 0 может иметь всего 6 полос, в то время как устройство типа 1 может иметь только 2 полосы.

--BAR предоставляет информацию об адресном пространстве, необходимом для устройства.

- Каждый BAR 32-битный, из которых первые 4 бита 3: 0 всегда доступны только для чтения.

- 2 ^ (Позиция последних битов R / W от младшего бита) = Адресное окно, требуемое для конкретной BAR.

Как узнать адресное окно или размер области, отображаемой какой-либо БАРой:

1) Изначально считываем любой BAR (предположим, в нашем случае BAR0), мы получили значение 32'h0000_000F. (Помните: последние 4 бита только для чтения !!).

2) Запишите все единицы в BAR0.

3) Прочтите еще раз BAR0 и предположим, что мы получили значение 32'hFFFF_000F. Таким образом, битовая позиция 16 является младшим значащим битом чтения / записи. Таким образом, адресное пространство, необходимое для BAR0, будет 2 ^ 16.

person Gaurang Pandey    schedule 04.02.2016