Data Structures | |||||
| struct | pci_cfg | ||||
| PCI configuration structure for a device. Every PCI device belong to a known class. To find this class we have to look at the base_class, sub_class and interface code. More... | |||||
Typedefs | |||||
| typedef pci_cfg | pci_cfg_t | ||||
| PCI configuration structure for a device. Every PCI device belong to a known class. To find this class we have to look at the base_class, sub_class and interface code. | |||||
Functions | |||||
| bool | pci_find_cfg (pci_cfg_t *cfg, bool enable) | ||||
Look for a device in the PCI bus and eventually enable it.
| |||||
| void | pci_scan () | ||||
| Scan all the PCI buses, looking for devices. If a device is found it will be enabled. | |||||
|
|
PCI configuration structure for a device. Every PCI device belong to a known class. To find this class we have to look at the base_class, sub_class and interface code.
The PCI configuration header |
|
||||||||||||
|
Look for a device in the PCI bus and eventually enable it.
Definition at line 769 of file pci.c.
00770 {
00771 uint16_t bus, dev, func;
00772 pci_cfg_t *pcfg;
00773
00774 pcfg = kmalloc( sizeof(pci_cfg_t) );
00775
00776 for (bus=0; bus<4; bus++)
00777 for (dev=0; dev<32; dev++)
00778 for (func=0; func<8; func++)
00779 {
00780 if ( pci_probe(bus, dev, func, pcfg) )
00781 {
00782 if (
00783 cfg->base_class == pcfg->base_class &&
00784 cfg->sub_class == pcfg->sub_class &&
00785 cfg->interface == pcfg->interface
00786 )
00787 {
00788 // Device found //
00789 memcpy(cfg, pcfg, sizeof(pci_cfg_t));
00790 // Enable the device if required //
00791 if (enable) pci_enable_device(pcfg);
00792 // Free the temporary structure //
00793 kfree(pcfg);
00794 return(TRUE);
00795 }
00796 }
00797 }
00798 // Device not found //
00799 kfree(pcfg);
00800 return(FALSE);
00801 }
|
|
|
Scan all the PCI buses, looking for devices. If a device is found it will be enabled.
Definition at line 806 of file pci.c.
00807 {
00808 uint16_t bus, dev, func;
00809 pci_cfg_t pcfg;
00810 int i, key;
00811
00812 for (bus=0; bus<4; bus++)
00813 for (dev = 0; dev < 32; dev++)
00814 for (func = 0; func < 8; func++)
00815 {
00816 if ( pci_probe(bus, dev, func, &pcfg) )
00817 {
00818 set_color(WHITE);
00819 kprintf("\n\rPCI:%u:%u:%u", bus, dev, func);
00820 set_color(DEFAULT_COLOR);
00821
00822 kprintf( "\n\rVendor :%04X Device :%04X"
00823 "\n\rSubSys_Vendor:%04X SubSys_Device:%04X",
00824 pcfg.vendor_id, pcfg.device_id, pcfg.subsys_vendor, pcfg.subsys_device);
00825 kprintf( "\n\rBase_Class :%02X Sub_Class :%02X Interface :%02X",
00826 pcfg.base_class, pcfg.sub_class, pcfg.interface);
00827
00828 for (i=0;; i++)
00829 {
00830 if ( i>=PCI_CLASS_ENTRIES )
00831 {
00832 kprintf("\n\r* Description : Unknown device!");
00833 break;
00834 }
00835 if
00836 (
00837 (classes[i].base_class == pcfg.base_class) &&
00838 (classes[i].sub_class == pcfg.sub_class) &&
00839 (classes[i].interface == pcfg.interface)
00840 )
00841 {
00842 kprintf("\n\r* Description : %s", classes[i].name);
00843 break;
00844 }
00845 }
00846
00847 for (i=0; i<6; i++)
00848 if (pcfg.base[i])
00849 {
00850 if (pcfg.type[i] == PCI_IO_RESOURCE_IO)
00851 kprintf("\n\r* Base Register %d IO: %#06x (%#06x)",
00852 i, pcfg.base[i], pcfg.size[i]);
00853 else
00854 kprintf("\n\r* Base Register %d MM: %#010x (%#010x)",
00855 i, pcfg.base[i] & 0xfffffff0, pcfg.size[i]);
00856 }
00857 if (pcfg.rom_base)
00858 kprintf("\n\r* Base Register ROM : %#010x (%#010x)",
00859 pcfg.rom_base, pcfg.rom_size);
00860
00861 if (pcfg.irq)
00862 kprintf("\n\r* Interrupt line: %u", pcfg.irq);
00863
00864
00865 switch(pcfg.header_type & 0x7F)
00866 {
00867 case PCI_HEADER_TYPE_NORMAL:
00868 kprintf("\n\r* Normal device");
00869 break;
00870
00871 case PCI_HEADER_TYPE_BRIDGE:
00872 kprintf("\n\r* PCI <-> PCI bridge");
00873 break;
00874
00875 default:
00876 kprintf("\n\r* Unknown header type");
00877 break;
00878 }
00879
00880 // kprintf("\n\rDo you want to enable this device (Y/N)? ");
00881 pci_enable_device(&pcfg);
00882 key = kgetchar();
00883 if ( key==CTRL_C ) return;
00884 /*
00885 key &= 0xFF;
00886 if ( key=='Y' || key=='y' )
00887 {
00888 putchar(key);
00889 pci_enable_device(&pcfg);
00890 }
00891 else
00892 putchar('N');
00893 */
00894 kprintf("\n\r");
00895 }
00896 }
00897 kprintf("\n\rPCI: finished\n\r");
00898 }
|
1.2.18