문제

PCI 구성 공간에서 레지스터에 액세스 해야하는 경우 구성 공간에 DWORDS를 읽고 쓰기 위해 내장 BIOS 기능을 사용하기 만하면됩니다.

예를 들어, B0 : D31 : F1에있는 IDE 컨트롤러를 사용하려는 경우 BDF를 BIOS 기능의 매개 변수로 사용하여 구성 레지스터를 읽고 쓰십시오. 그래서 공급 업체 ID를 받고 싶다면 주어진 BDF에서 첫 번째 DWORD를 읽을 것입니까?

아니면 그냥 기지에서 벗어나?

편집하다:

PCI BIOS 사양에서, 나는 구성 공간에 단어를 읽고 쓰는 것에 대한 BIOS 기능의 정의를 살펴보고 있습니다. 나는 구성 공간 내의 다양한 오프셋에서 레지스터에 쓸 수 있다고 생각합니다. 내 질문은 이것이이 레벨 에서이 레지스터에 액세스하는 올바른 방법입니까?

도움이 되었습니까?

해결책

PCI 사양을 읽은 후에는 주어진 인터럽트 벡터 (1AH)를 통해 PCI BIOS 기능을 호출하면됩니다. 그러나 이것은 PCI 구성에 의해 복잡합니다.

PCI 구성 공간은 액세스를 위해 명시적인 주소를 사용하지 않지만 BIOS 기능 호출.

편집 : 실제로, BIOS는 내가 아는 것보다 훨씬 더 많은 일을한다는 것이 밝혀졌습니다. IDE 컨트롤러의 장치와 공급 업체 ID를 찾을 때까지 PCI 버스를 열거하는 것입니다. 필요한 유일한 어셈블리는 인/아웃 포트 포장지였습니다.


pci_dev_t dev = { 0xffffffff, 0xffffffff, 0xffffffff };

for ( bus = 0; bus < 0xffff; ++bus ) {
  for ( slot = 0; slot < 0xffff; ++slot ) {
    for ( func = 0; func < 0xff; ++func ) {
      uint16_t dev_id  = _pci_read_config_data( bus, slot, func, 0x00, PCI_READ_CONFIG_WORD );
      uint16_t vend_id = _pci_read_config_data( bus, slot, func, 0x02, PCI_READ_CONFIG_WORD );

      if ((vendor == vend_id) && (device == dev_id)) {
        dev.bus      = bus;
        dev.device   = slot;
        dev.function = func;

        return dev;
      }
    }
  }
}
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top