Home | Info | Community | Development | myReactOS | Contact Us
ReactOS Development > Doxygenprep_pci.c
Go to the documentation of this file.
00001 #include <freeldr.h> 00002 #include "prep.h" 00003 00004 typedef struct _pci_cfg { 00005 unsigned long addr; 00006 unsigned long data; 00007 } pci_cfg; 00008 00009 typedef struct _pci_desc { 00010 pci_cfg *cfg; 00011 } pci_desc; 00012 00013 pci_desc pci1_desc = { (void *)0x80000cf8 }; 00014 #define rev16(x) ((((x)>>8)&0xff)|(((x)&0xff)<<8)) 00015 #define rev32(x) ((((x)>>24)&0xff)|(((x)>>8)&0xff00)|(((x)&0xff00)<<8)|(((x)&0xff)<<24)) 00016 #define pci_addr(bus,dev,fn,reg) \ 00017 (0x80000000 | \ 00018 ((bus & 0xff) << 16) | \ 00019 ((dev & 0x1f) << 11) | \ 00020 ((fn & 7) << 8) | \ 00021 (reg & 0xfc)) 00022 #if 0 00023 #define pci_cfg_addr(bus,dev,fn,reg) \ 00024 ((bus == 0) ? \ 00025 ((1 << (dev + 16)) | \ 00026 (dev << 11) | \ 00027 (fn << 8) | \ 00028 ((reg & 0xfc) | 1)) : pci_addr(bus,dev,fn,reg)) 00029 #else 00030 #define pci_cfg_addr(bus,dev,fn,reg) pci_addr(bus,dev,fn,reg) 00031 #endif 00032 unsigned long pci_read( pci_desc *desc, int bus, int dev, int fn, int reg, int len ) { 00033 sync(); 00034 unsigned long save_state = desc->cfg->addr, ret = 0; 00035 unsigned long addr = pci_cfg_addr(bus,dev,fn,reg); 00036 unsigned long offset = reg & 3; 00037 desc->cfg->addr = rev32(addr); 00038 sync(); 00039 switch( len ) { 00040 case 4: 00041 ret = desc->cfg->data; 00042 break; 00043 case 2: 00044 ret = desc->cfg->data; 00045 ret = (ret >> (offset << 3)) & 0xffff; 00046 break; 00047 case 1: 00048 ret = desc->cfg->data; 00049 ret = (ret >> (offset << 3)) & 0xff; 00050 break; 00051 } 00052 desc->cfg->addr = save_state; 00053 sync(); 00054 return ret; 00055 } 00056 00057 void pci_read_bar( pci_desc *desc, int bus, int dev, int fn, int bar, 00058 struct _pci_bar *bar_data ) { 00059 bar_data->data = pci_read( desc, bus, dev, fn, 0x10 + (bar * 4), 4 ); 00060 } 00061 00062 /* 00063 * Imagine: offset 3, len 1 00064 * let oldval = 0x12345678 and val = 0xabcd1234; 00065 * mask = ((1 << 8) - 1) << 24; // 0xff000000 00066 * oldval = (0x12345678 & 0x00ffffff) | (0xabcd1234 & 0xff000000) = 0xab345678; 00067 */ 00068 void pci_write( pci_desc *desc, int bus, int dev, int fn, int reg, int len, int val ) { 00069 unsigned long save_state = desc->cfg->addr; 00070 unsigned long addr = pci_cfg_addr(bus,dev,fn,reg); 00071 unsigned long offset = reg & 3; 00072 unsigned long oldval = pci_read( desc, bus, dev, fn, reg & ~3, 4 ); 00073 unsigned long mask = ((1 << (len * 8)) - 1) << (offset << 3); 00074 oldval = (oldval & ~mask) | ((val << (offset << 3)) & mask); 00075 desc->cfg->addr = rev32(addr); 00076 sync(); 00077 desc->cfg->data = rev32(oldval); 00078 sync(); 00079 desc->cfg->addr = save_state; 00080 sync(); 00081 } 00082 00083 void pci_write_bar( pci_desc *desc, int bus, int dev, int fn, int bar, struct _pci_bar *bar_data ) { 00084 pci_write( desc, bus, dev, fn, 0x10 + (bar * 4), 4, bar_data->data ); 00085 } 00086 00087 void print_bar( struct _pci_bar *bar ) { 00088 printf("BAR: %x\n", bar->data); 00089 } 00090 00091 #define PCI_VENDORID 0 00092 #define PCI_DEVICEID 2 00093 #define PCI_HEADER_TYPE 0xe 00094 #define PCI_BASECLASS 0xb 00095 00096 void pci_setup( PCONFIGURATION_COMPONENT_DATA pcibus, pci_desc *desc ) { 00097 unsigned char type; 00098 unsigned short vendor, device, devclass; 00099 int funcs, bus, dev, fn; 00100 00101 pci1_desc.cfg = (pci_cfg *)0x80000cf8; 00102 00103 printf("PCI Bus:\n"); 00104 for( bus = 0; bus < 1; bus++ ) { 00105 for( dev = 0; dev < 32; dev++ ) { 00106 type = pci_read(desc,bus,dev,0,PCI_HEADER_TYPE,1); 00107 vendor = pci_read(desc,bus,dev,0,PCI_VENDORID,2); 00108 device = pci_read(desc,bus,dev,0,PCI_DEVICEID,2); 00109 00110 if(vendor == 0 || vendor == 0xffff) continue; 00111 if(type & 0x80) funcs = 8; else funcs = 1; 00112 00113 for( fn = 0; fn < funcs; fn++ ) { 00114 devclass = pci_read(desc,bus,dev,fn,PCI_BASECLASS,1); 00115 printf(" %d:%d -> vendor:device:class %x:%x:%x\n", 00116 bus, dev, vendor, device, devclass); 00117 00118 if( devclass == 3 ) { 00119 printf("Setting up vga...\n"); 00120 vga_setup(pcibus,desc,&vga1_desc,bus,dev,fn); 00121 printf("Done with vga\n"); 00122 } 00123 } 00124 } 00125 } 00126 printf("^-- end PCI\n"); 00127 } Generated on Sat May 26 2012 04:17:54 for ReactOS by
1.7.6.1
|