Main Page | Alphabetical List | Data Structures | File List | Data Fields | Globals | Related Pages

rt_pci.c File Reference

#include <time.h>
#include "rt_pci.h"

Include dependency graph for rt_pci.c:

Go to the source code of this file.

Functions

unsigned long bios32_service (unsigned long service)
int rt_pcibios_read_config_byte (unsigned int bus, unsigned int device_fn, unsigned int where, unsigned char *value)
int rt_pcibios_read_config_word (unsigned int bus, unsigned int device_fn, unsigned int where, unsigned short *value)
int rt_pcibios_read_config_dword (unsigned int bus, unsigned int device_fn, unsigned int where, unsigned int *value)
int rt_pcibios_write_config_byte (unsigned int bus, unsigned int device_fn, unsigned int where, unsigned char value)
int rt_pcibios_write_config_word (unsigned int bus, unsigned int device_fn, unsigned int where, unsigned short value)
int rt_pcibios_write_config_dword (unsigned int bus, unsigned int device_fn, unsigned int where, unsigned int value)
void check_pcibios (void)
void pcibios_init (void)
int pcibios_set_irq_routing (struct pci_dev *dev, int pin, int irq)
int rt_pci_set_power_state (struct pci_dev *dev, int state)
int rt_pci_find_capability (struct pci_dev *dev, int cap)
pci_dev * rt_pci_find_device (unsigned int vendor, unsigned int device, const struct pci_dev *from)
int rt_pci_enable_device (struct pci_dev *dev)
int rt_pci_restore_state (struct pci_dev *dev, u32 *buffer)

Variables

struct {
   unsigned long   address
   unsigned short   segment
bios32_indirect
long pcibios_entry
struct {
   unsigned long   address
   unsigned short   segment
pci_indirect


Function Documentation

unsigned long bios32_service unsigned long  service  )  [static]
 

Definition at line 219 of file rt_pci.c.

References address, and bios32_indirect.

Referenced by check_pcibios().

00220 {
00221         unsigned char return_code;      /* %al */
00222         unsigned long address;          /* %ebx */
00223         unsigned long length;           /* %ecx */
00224         unsigned long entry;            /* %edx */
00225         unsigned long flags;
00226 
00227         save_flags(flags);
00228         __asm__(
00229 #ifdef ABSOLUTE_WITHOUT_ASTERISK
00230                 "lcall (%%edi)"
00231 #else
00232                 "lcall *(%%edi)"
00233 #endif
00234                 : "=a" (return_code),
00235                   "=b" (address),
00236                   "=c" (length),
00237                   "=d" (entry)
00238                 : "0" (service),
00239                   "1" (0),
00240                   "D" (&bios32_indirect));
00241         restore_flags(flags);
00242 
00243         switch (return_code) {
00244                 case 0:
00245                         return address + entry;
00246                 case 0x80:      /* No presente */
00247                         ethernet_printf("bios32_service(%d) : no presente\n", service);
00248                         return 0;
00249                 default: /* No deberia pasar */
00250                         ethernet_printf("bios32_service(%d) : devuelto %#X\n",
00251                                 service, return_code);
00252                         return 0;
00253         }
00254 }

void check_pcibios void   )  [static]
 

Definition at line 428 of file rt_pci.c.

References bios32_service(), pci_indirect, PCI_SERVICE, PCI_SIGNATURE, pcibios_entry, and PCIBIOS_PCI_BIOS_PRESENT.

Referenced by pcibios_init().

00429 {
00430         unsigned long signature;
00431         unsigned char present_status;
00432         unsigned char major_revision;
00433         unsigned char minor_revision;
00434         unsigned long flags;
00435         int pack;
00436 
00437         if ((pcibios_entry = bios32_service(PCI_SERVICE))) {
00438                 pci_indirect.address = pcibios_entry;
00439 
00440                 save_flags(flags);
00441                 __asm__(
00442 #ifdef ABSOLUTE_WITHOUT_ASTERISK
00443                         "lcall (%%edi)\n\t"
00444 #else
00445                         "lcall *(%%edi)\n\t"
00446 #endif
00447                         "jc 1f\n\t"
00448                         "xor %%ah, %%ah\n"
00449                         "1:\tshl $8, %%eax\n\t"
00450                         "movw %%bx, %%ax"
00451                         : "=d" (signature),
00452                           "=a" (pack)
00453                         : "1" (PCIBIOS_PCI_BIOS_PRESENT),
00454                           "D" (&pci_indirect)
00455                         : "bx", "cx");
00456                 restore_flags(flags);
00457 
00458                 present_status = (pack >> 16) & 0xff;
00459                 major_revision = (pack >> 8) & 0xff;
00460                 minor_revision = pack & 0xff;
00461                 if (present_status || (signature != PCI_SIGNATURE)) {
00462                         printf("ERROR: BIOS32 dice PCI BIOS, pero no PCI "
00463                                 "BIOS????\n");
00464                         pcibios_entry = 0;
00465                 }
00466 #if     DEBUG
00467                 if (pcibios_entry) {
00468                         printf ("pcibios_init : PCI BIOS revision %hhX.%hhX"
00469                                 " entrada en %#X\n", major_revision,
00470                                 minor_revision, pcibios_entry);
00471                 }
00472 #endif
00473         }
00474 }

Here is the call graph for this function:

void pcibios_init void   )  [static]
 

Definition at line 477 of file rt_pci.c.

References bios32_indirect, BIOS32_SIGNATURE, and check_pcibios().

00478 {
00479         union bios32 *check;
00480         unsigned char sum;
00481         int i, length;
00482         unsigned long bios32_entry = 0;
00483 
00484         /*
00485           El procedimiento estandar para localizar el directorio de 
00486           servicios de BIOS32 se tiene que escanear una estructura BIOS32
00487           valida entre los rangos 0xE0000 0xFFFFF
00488          */
00489 
00490         for (check = (union bios32 *) 0xe0000; check <= (union bios32 *) 0xffff0; ++check) {
00491                 if (check->fields.signature != BIOS32_SIGNATURE)
00492                         continue;
00493                 length = check->fields.length * 16;
00494                 if (!length)
00495                         continue;
00496                 sum = 0;
00497                 for (i = 0; i < length ; ++i)
00498                         sum += check->chars[i];
00499                 if (sum != 0)
00500                         continue;
00501                 if (check->fields.revision != 0) {
00502                         printf("pcibios_init : revision no soportada %d en %#X\n", check->fields.revision,(unsigned int) check);
00503                         continue;
00504                 }
00505 #if     DEBUG
00506                 printf("pcibios_init : BIOS32 Service Directory "
00507                         "estructura en %#X\n", check);
00508 #endif
00509                 if (!bios32_entry) {
00510                         if (check->fields.entry >= 0x100000) {
00511                           printf("pcibios_init: entrada en la memoria alta\n");
00512                                 return;
00513                         } else {
00514                                 bios32_entry = check->fields.entry;
00515 #if     DEBUG
00516                                 printf("pcibios_init : BIOS32 Service Directory \nentrada en %#X\n", bios32_entry);
00517 #endif
00518                                 bios32_indirect.address = bios32_entry;
00519                         }
00520                 }
00521         }
00522         if (bios32_entry)
00523                 check_pcibios();
00524 }

Here is the call graph for this function:

int pcibios_set_irq_routing struct pci_dev *  dev,
int  pin,
int  irq
 

Definition at line 527 of file rt_pci.c.

References pci_indirect, and PCIBIOS_SET_PCI_HW_INT.

00528 {
00529         int ret;
00530 
00531         __asm__(
00532 #ifdef ABSOLUTE_WITHOUT_ASTERISK
00533                 "lcall (%%esi); cld\n\t"
00534 #else
00535                 "lcall *(%%esi); cld\n\t"
00536 #endif
00537                 "jc 1f\n\t"
00538                 "xor %%ah, %%ah\n"
00539                 "1:"
00540                 : "=a" (ret)
00541                 : "0" (PCIBIOS_SET_PCI_HW_INT),
00542                   "b" ((dev->bus << 8) | dev->devfn),
00543                   "c" ((irq << 8) | (pin + 10)),
00544                   "S" (&pci_indirect));
00545         return !(ret & 0xff00);
00546 }

int rt_pci_enable_device struct pci_dev *  dev  ) 
 

Definition at line 679 of file rt_pci.c.

Referenced by init_rtl8139_device(), and rtl_3COM905C_init_device().

00679                                              {
00680   return(pci_enable_device(dev));
00681 }

int rt_pci_find_capability struct pci_dev *  dev,
int  cap
 

rt_pci_find_capability - query for devices' capabilities : PCI device to query : capability code

Tell if a device supports a given PCI capability. Returns the address of the requested capability structure within the device's PCI configuration space or 0 in case the device does not support it. Possible values for :

PCI_CAP_ID_PM Power Management

PCI_CAP_ID_AGP Accelerated Graphics Port

PCI_CAP_ID_VPD Vital Product Data

PCI_CAP_ID_SLOTID Slot Identification

PCI_CAP_ID_MSI Message Signalled Interrupts

PCI_CAP_ID_CHSWP CompactPCI HotSwap

Definition at line 636 of file rt_pci.c.

References rt_pci_read_config_byte, rt_pci_read_config_word, and status.

Referenced by rt_pci_set_power_state().

00637 {
00638         u16 status;
00639         u8 pos, id;
00640         int ttl = 48;
00641 
00642         rt_pci_read_config_word(dev, PCI_STATUS, &status);
00643         if (!(status & PCI_STATUS_CAP_LIST))
00644                 return 0;
00645         switch (dev->hdr_type) {
00646         case PCI_HEADER_TYPE_NORMAL:
00647         case PCI_HEADER_TYPE_BRIDGE:
00648                 rt_pci_read_config_byte(dev, PCI_CAPABILITY_LIST, &pos);
00649                 break;
00650         case PCI_HEADER_TYPE_CARDBUS:
00651                 rt_pci_read_config_byte(dev, PCI_CB_CAPABILITY_LIST, &pos);
00652                 break;
00653         default:
00654                 return 0;
00655         }
00656         while (ttl-- && pos >= 0x40) {
00657                 pos &= ~3;
00658                 rt_pci_read_config_byte(dev, pos + PCI_CAP_LIST_ID, &id);
00659                 if (id == 0xff)
00660                         break;
00661                 if (id == cap)
00662                         return pos;
00663                 rt_pci_read_config_byte(dev, pos + PCI_CAP_LIST_NEXT, &pos);
00664         }
00665         return 0;
00666 }

struct pci_dev* rt_pci_find_device unsigned int  vendor,
unsigned int  device,
const struct pci_dev *  from
 

Definition at line 672 of file rt_pci.c.

Referenced by init_rtl8139_device(), and rtl_3COM905C_init_device().

00672                                                                                                          {
00673   return(pci_find_device(vendor, device, from));
00674 }

int rt_pci_restore_state struct pci_dev *  dev,
u32 *  buffer
 

rt_pci_restore_state - Restore the saved state of a PCI device : - PCI device that we're dealing with : - saved PCI config space

Definition at line 691 of file rt_pci.c.

References buffer, PCI_BASE_ADDRESS_0, PCI_INTERRUPT_LINE, rt_pci_write_config_byte, and rt_pci_write_config_dword.

Referenced by vortex_up().

00692 {
00693         int i;
00694 
00695         if (buffer) {
00696                 for (i = 0; i < 16; i++)
00697                         rt_pci_write_config_dword(dev,i * 4, buffer[i]);
00698         }
00699         /*
00700          * otherwise, write the context information we know from bootup.
00701          * This works around a problem where warm-booting from Windows
00702          * combined with a D3(hot)->D0 transition causes PCI config
00703          * header data to be forgotten.
00704          */     
00705         else {
00706                 for (i = 0; i < 6; i ++)
00707                         rt_pci_write_config_dword(dev,
00708                                                PCI_BASE_ADDRESS_0 + (i * 4),
00709                                                dev->resource[i].start);
00710                 rt_pci_write_config_byte(dev, PCI_INTERRUPT_LINE, dev->irq);
00711         }
00712         return 0;
00713 }

int rt_pci_set_power_state struct pci_dev *  dev,
int  state
 

Definition at line 552 of file rt_pci.c.

References rt_pci_find_capability(), rt_pci_read_config_word, and rt_pci_write_config_word.

Referenced by rtl_3COM905C_acpi_set_WOL(), vortex_remove_one(), and vortex_up().

00553 {
00554         int pm;
00555         u16 pmcsr;
00556 
00557         /* bound the state we're entering */
00558         if (state > 3) state = 3;
00559 
00560         /* Validate current state:
00561          * Can enter D0 from any state, but if we can only go deeper 
00562          * to sleep if we're already in a low power state
00563          */
00564         if (state > 0 && dev->current_state > state)
00565                 return -EINVAL;
00566         else if (dev->current_state == state) 
00567                 return 0;        /* we're already there */
00568 
00569         /* find PCI PM capability in list */
00570         pm = rt_pci_find_capability(dev, PCI_CAP_ID_PM);
00571         
00572         /* abort if the device doesn't support PM capabilities */
00573         if (!pm) return -EIO; 
00574 
00575         /* check if this device supports the desired state */
00576         if (state == 1 || state == 2) {
00577                 u16 pmc;
00578                 rt_pci_read_config_word(dev,pm + PCI_PM_PMC,&pmc);
00579                 if (state == 1 && !(pmc & PCI_PM_CAP_D1)) return -EIO;
00580                 else if (state == 2 && !(pmc & PCI_PM_CAP_D2)) return -EIO;
00581         }
00582 
00583         /* If we're in D3, force entire word to 0.
00584          * This doesn't affect PME_Status, disables PME_En, and
00585          * sets PowerState to 0.
00586          */
00587         if (dev->current_state >= 3)
00588                 pmcsr = 0;
00589         else {
00590                 rt_pci_read_config_word(dev, pm + PCI_PM_CTRL, &pmcsr);
00591                 pmcsr &= ~PCI_PM_CTRL_STATE_MASK;
00592                 pmcsr |= state;
00593         }
00594 
00595         /* enter specified state */
00596         rt_pci_write_config_word(dev, pm + PCI_PM_CTRL, pmcsr);
00597 
00598         /* Mandatory power management transition delays */
00599         /* see PCI PM 1.1 5.6.1 table 18 */
00600         if(state == 3 || dev->current_state == 3)
00601         {
00602                 //set_current_state(TASK_UNINTERRUPTIBLE);
00603                 //schedule_timeout(HZ/100);
00604           rtl_delay(200000);
00605         }
00606         else if(state == 2 || dev->current_state == 2)
00607                 rtl_delay(200000);
00608         dev->current_state = state;
00609 
00610         return 0;
00611 }

Here is the call graph for this function:

int rt_pcibios_read_config_byte unsigned int  bus,
unsigned int  device_fn,
unsigned int  where,
unsigned char *  value
 

Definition at line 257 of file rt_pci.c.

References pci_indirect, and PCIBIOS_READ_CONFIG_BYTE.

00259 {
00260         unsigned long ret;
00261         unsigned long bx = (bus << 8) | device_fn;
00262         unsigned long flags;
00263 
00264         save_flags(flags);
00265         __asm__(
00266 #ifdef ABSOLUTE_WITHOUT_ASTERISK
00267                 "lcall (%%esi)\n\t"
00268 #else
00269                 "lcall *(%%esi)\n\t"
00270 #endif
00271                 "jc 1f\n\t"
00272                 "xor %%ah, %%ah\n"
00273                 "1:"
00274                 : "=c" (*value),
00275                   "=a" (ret)
00276                 : "1" (PCIBIOS_READ_CONFIG_BYTE),
00277                   "b" (bx),
00278                   "D" ((long) where),
00279                   "S" (&pci_indirect));
00280         restore_flags(flags);
00281         return (int) (ret & 0xff00) >> 8;
00282 }

int rt_pcibios_read_config_dword unsigned int  bus,
unsigned int  device_fn,
unsigned int  where,
unsigned int *  value
 

Definition at line 313 of file rt_pci.c.

References pci_indirect, and PCIBIOS_READ_CONFIG_DWORD.

00315 {
00316         unsigned long ret;
00317         unsigned long bx = (bus << 8) | device_fn;
00318         unsigned long flags;
00319 
00320         save_flags(flags);
00321         __asm__(
00322 #ifdef ABSOLUTE_WITHOUT_ASTERISK
00323                 "lcall (%%esi)\n\t"
00324 #else
00325                 "lcall *(%%esi)\n\t"
00326 #endif
00327                 "jc 1f\n\t"
00328                 "xor %%ah, %%ah\n"
00329                 "1:"
00330                 : "=c" (*value),
00331                   "=a" (ret)
00332                 : "1" (PCIBIOS_READ_CONFIG_DWORD),
00333                   "b" (bx),
00334                   "D" ((long) where),
00335                   "S" (&pci_indirect));
00336         restore_flags(flags);
00337         return (int) (ret & 0xff00) >> 8;
00338 }

int rt_pcibios_read_config_word unsigned int  bus,
unsigned int  device_fn,
unsigned int  where,
unsigned short *  value
 

Definition at line 285 of file rt_pci.c.

References pci_indirect, and PCIBIOS_READ_CONFIG_WORD.

00287 {
00288         unsigned long ret;
00289         unsigned long bx = (bus << 8) | device_fn;
00290         unsigned long flags;
00291 
00292         save_flags(flags);
00293         __asm__(
00294 #ifdef ABSOLUTE_WITHOUT_ASTERISK
00295                 "lcall (%%esi)\n\t"
00296 #else
00297                 "lcall *(%%esi)\n\t"
00298 #endif
00299                 "jc 1f\n\t"
00300                 "xor %%ah, %%ah\n"
00301                 "1:"
00302                 : "=c" (*value),
00303                   "=a" (ret)
00304                 : "1" (PCIBIOS_READ_CONFIG_WORD),
00305                   "b" (bx),
00306                   "D" ((long) where),
00307                   "S" (&pci_indirect));
00308         restore_flags(flags);
00309         return (int) (ret & 0xff00) >> 8;
00310 }

int rt_pcibios_write_config_byte unsigned int  bus,
unsigned int  device_fn,
unsigned int  where,
unsigned char  value
 

Definition at line 341 of file rt_pci.c.

References pci_indirect, and PCIBIOS_WRITE_CONFIG_BYTE.

00343 {
00344         unsigned long ret;
00345         unsigned long bx = (bus << 8) | device_fn;
00346         unsigned long flags;
00347 
00348         save_flags(flags); cli();
00349         __asm__(
00350 #ifdef ABSOLUTE_WITHOUT_ASTERISK
00351                 "lcall (%%esi)\n\t"
00352 #else
00353                 "lcall *(%%esi)\n\t"
00354 #endif
00355                 "jc 1f\n\t"
00356                 "xor %%ah, %%ah\n"
00357                 "1:"
00358                 : "=a" (ret)
00359                 : "0" (PCIBIOS_WRITE_CONFIG_BYTE),
00360                   "c" (value),
00361                   "b" (bx),
00362                   "D" ((long) where),
00363                   "S" (&pci_indirect));
00364         restore_flags(flags);
00365         return (int) (ret & 0xff00) >> 8;
00366 }

int rt_pcibios_write_config_dword unsigned int  bus,
unsigned int  device_fn,
unsigned int  where,
unsigned int  value
 

Definition at line 400 of file rt_pci.c.

References pci_indirect, and PCIBIOS_WRITE_CONFIG_DWORD.

00402 {
00403         unsigned long ret;
00404         unsigned long bx = (bus << 8) | device_fn;
00405         unsigned long flags;
00406 
00407         save_flags(flags); cli();
00408         __asm__(
00409 #ifdef ABSOLUTE_WITHOUT_ASTERISK
00410                 "lcall (%%esi)\n\t"
00411 #else
00412                 "lcall *(%%esi)\n\t"
00413 #endif
00414                 "jc 1f\n\t"
00415                 "xor %%ah, %%ah\n"
00416                 "1:"
00417                 : "=a" (ret)
00418                 : "0" (PCIBIOS_WRITE_CONFIG_DWORD),
00419                   "c" (value),
00420                   "b" (bx),
00421                   "D" ((long) where),
00422                   "S" (&pci_indirect));
00423         restore_flags(flags);
00424         return (int) (ret & 0xff00) >> 8;
00425 }

int rt_pcibios_write_config_word unsigned int  bus,
unsigned int  device_fn,
unsigned int  where,
unsigned short  value
 

Definition at line 372 of file rt_pci.c.

References pci_indirect, and PCIBIOS_WRITE_CONFIG_WORD.

00374 {
00375         unsigned long ret;
00376         unsigned long bx = (bus << 8) | device_fn;
00377         unsigned long flags;
00378 
00379         save_flags(flags); cli();
00380         __asm__(
00381 #ifdef ABSOLUTE_WITHOUT_ASTERISK
00382                 "lcall (%%esi)\n\t"
00383 #else
00384                 "lcall *(%%esi)\n\t"
00385 #endif
00386                 "jc 1f\n\t"
00387                 "xor %%ah, %%ah\n"
00388                 "1:"
00389                 : "=a" (ret)
00390                 : "0" (PCIBIOS_WRITE_CONFIG_WORD),
00391                   "c" (value),
00392                   "b" (bx),
00393                   "D" ((long) where),
00394                   "S" (&pci_indirect));
00395         restore_flags(flags);
00396         return (int) (ret & 0xff00) >> 8;
00397 }


Variable Documentation

unsigned long address
 

Definition at line 214 of file rt_pci.c.

Referenced by bios32_service(), and dns_client_callback().

struct { ... } bios32_indirect [static]
 

Referenced by bios32_service(), and pcibios_init().

struct { ... } pci_indirect [static]
 

Referenced by check_pcibios(), pcibios_set_irq_routing(), rt_pcibios_read_config_byte(), rt_pcibios_read_config_dword(), rt_pcibios_read_config_word(), rt_pcibios_write_config_byte(), rt_pcibios_write_config_dword(), and rt_pcibios_write_config_word().

long pcibios_entry [static]
 

Definition at line 212 of file rt_pci.c.

Referenced by check_pcibios().

unsigned short segment
 

Definition at line 215 of file rt_pci.c.


Generated on Wed Jan 14 12:59:09 2004 for RTL-lwIP-0.4 by doxygen 1.3.4