2013-09-25 2 views
4

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

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

ответ

3

Найдено ответ на OSDev Wiki:

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

0

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

- Устройство типа-0 может иметь в общей сложности 6 БАР, в то время как Тип-1 может иметь только 2 БАР.

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

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

- 2^(Положение последних бит R/W от младшего значащего разряда) = Окно адреса, требуемое конкретным БАР.

Как узнать окно адреса или размер области represneted любым BAR:

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

2) Напишите все 1 в BAR0.

3) Снова прочитайте BAR0 и предположим, что мы получили значение 32'h0000_FFFF.So бит 16 - это последний бит R/W от LSB. Таким образом, адресное пространство, требуемое BAR0, будет 2^16.

2

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

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

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

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

Смежные вопросы