الطريقة المناسبة للوصول إلى السجلات في مساحة تكوين PCI

StackOverflow https://stackoverflow.com/questions/778121

  •  13-09-2019
  •  | 
  •  

سؤال

عندما تحتاج إلى الوصول إلى السجلات في مساحة تكوين PCI، هل تحتاج ببساطة إلى استخدام وظائف BIOS المضمنة لقراءة / كتابة Dwords في مساحة التكوين؟

على سبيل المثال، إذا كنت أحاول استخدام وحدة تحكم IDE الموجودة في B0: D31: F1 هل المتابعة لقراءة / كتابة سجل التكوين باستخدام هذا BDF كمعلمات إلى وظائف BIOS؟ لذلك إذا أردت الحصول على معرف البائع، فسأقرأ أول DWORD في BDF معين؟

أو أنا مجرد طريق قبالة قاعدة؟

تعديل:

في مواصفات PCI BIOS، كنت أتطلع إلى تعريفات وظائف BIOS لقراءة الكلمات وكتابةها في مساحة التكوين. التي أعتقد أنها تعني أنني أستطيع الكتابة في السجلات في العديد من الإزاحة داخل مساحة التكوين. أعتقد أن سؤالي هو، هل هذه الطريقة الصحيحة للوصول إلى هذه السجلات على هذا المستوى؟

هل كانت مفيدة؟

المحلول

بعد قراءة مواصفات PCI، أحتاج ببساطة إلى استدعاء وظائف BIOS PCI من خلال متجه المقاطعة المعطى (1AH). ومع ذلك، هذا معقد من خلال تكوين PCI الذي يجب أن يحدث قبل اليد.

يبدو أن مساحة تكوين PCI لا تستخدم عنوانا صريحا للوصول، ولكن مكالمات دالة BIOS.

تحرير: في الواقع، تبين BIOS يفعل الكثير أكثر مما أعرفه. كل ما كان علي فعله هو تعداد ناقل PCI حتى وجدت جهاز تحكم IDE ومعرف البائعين. كانت الجمعية الوحيدة المطلوبة هي مغلفة المنازل الداخلية / خارج.


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