ReactOS Fundraising Campaign 2012
 
€ 4,410 / € 30,000

Information | Donate

Home | Info | Community | Development | myReactOS | Contact Us

  1. Home
  2. Community
  3. Development
  4. myReactOS
  5. Fundraiser 2012

  1. Main Page
  2. Alphabetical List
  3. Data Structures
  4. Directories
  5. File List
  6. Data Fields
  7. Globals
  8. Related Pages

ReactOS Development > Doxygen

prep_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 doxygen 1.7.6.1

ReactOS is a registered trademark or a trademark of ReactOS Foundation in the United States and other countries.