Share Pastebin
Guest
Public paste!

Untitled

By: a guest | Mar 20th, 2010 | Syntax: None | Size: 1.56 KB | Hits: 61 | Expires: Never
Copy text to clipboard
  1. uint32_t pci_config_read( uint8_t bus, uint8_t device, uint8_t func, uint16_t content )
  2. {
  3.     // example: PCI_VENDOR_ID 0x0200 ==> length: 0x02 reg: 0x00 offset: 0x00
  4.     uint8_t length  = content >> 8;
  5.     uint8_t reg_off = content & 0x00FF;
  6.     uint8_t reg     = reg_off & 0xFC;     // bit mask: 11111100b
  7.     uint8_t offset  = reg_off % 0x04;     // remainder of modulo operation provides offset
  8.  
  9.     outportl(PCI_CONFIGURATION_ADDRESS,
  10.         0x80000000
  11.         | (bus    << 16)
  12.         | (device << 11)
  13.         | (func   <<  8)
  14.         | (reg         ));
  15.  
  16.     // use offset to find searched content
  17.     uint32_t readVal = inportl(PCI_CONFIGURATION_DATA) >> (8 * offset);
  18.  
  19.     switch(length)
  20.     {
  21.         case 1:
  22.             readVal &= 0x000000FF;
  23.         break;
  24.         case 2:
  25.             readVal &= 0x0000FFFF;
  26.         break;
  27.         case 4:
  28.             readVal &= 0xFFFFFFFF;
  29.         break;
  30.     }
  31.     return readVal;
  32. }
  33.  
  34. void pci_config_write_byte( uint8_t bus, uint8_t device, uint8_t func, uint8_t reg, uint8_t val )
  35. {
  36.     outportl(PCI_CONFIGURATION_ADDRESS,
  37.         0x80000000
  38.         | (bus     << 16)
  39.         | (device  << 11)
  40.         | (func    <<  8)
  41.         |  reg );
  42.  
  43.     outportb(PCI_CONFIGURATION_DATA, val);
  44. }
  45.  
  46. void pci_config_write_dword( uint8_t bus, uint8_t device, uint8_t func, uint8_t reg, uint32_t val )
  47. {
  48.     outportl(PCI_CONFIGURATION_ADDRESS,
  49.         0x80000000
  50.         | (bus     << 16)
  51.         | (device  << 11)
  52.         | (func    <<  8)
  53.         | (reg & 0xFC   ));
  54.  
  55.     outportl(PCI_CONFIGURATION_DATA, val);
  56. }