📄 pci.c
字号:
int i, dev, func, irq; dev= pcidev[devind].pd_dev; func= pcidev[devind].pd_func; irq= 0; /* lint */ for (i= 0; i<4; i++) { irq= pci_attr_r8(devind, SIS_ISABR_IRQ_A+i); if (irq & SIS_IRQ_DISABLED) { if (debug) printf("INT%c: disabled\n", 'A'+i); } else { irq &= SIS_IRQ_MASK; if (debug) printf("INT%c: %d\n", 'A'+i, irq); irq_mode_pci(irq); } } return 0;}/*===========================================================================* * do_via_isabr * *===========================================================================*/PRIVATE int do_via_isabr(devind)int devind;{ int i, dev, func, irq, edge; u8_t levmask; dev= pcidev[devind].pd_dev; func= pcidev[devind].pd_func; levmask= pci_attr_r8(devind, VIA_ISABR_EL); irq= 0; /* lint */ edge= 0; /* lint */ for (i= 0; i<4; i++) { switch(i) { case 0: edge= (levmask & VIA_ISABR_EL_INTA); irq= pci_attr_r8(devind, VIA_ISABR_IRQ_R2) >> 4; break; case 1: edge= (levmask & VIA_ISABR_EL_INTB); irq= pci_attr_r8(devind, VIA_ISABR_IRQ_R2); break; case 2: edge= (levmask & VIA_ISABR_EL_INTC); irq= pci_attr_r8(devind, VIA_ISABR_IRQ_R3) >> 4; break; case 3: edge= (levmask & VIA_ISABR_EL_INTD); irq= pci_attr_r8(devind, VIA_ISABR_IRQ_R1) >> 4; break; default: assert(0); } irq &= 0xf; if (!irq) { if (debug) printf("INT%c: disabled\n", 'A'+i); } else { if (debug) printf("INT%c: %d\n", 'A'+i, irq); if (edge && debug) { printf( "(warning) IRQ %d is not level triggered\n", irq); } irq_mode_pci(irq); } } return 0;}/*===========================================================================* * pci_vid_name * *===========================================================================*/PRIVATE char *pci_vid_name(vid)u16_t vid;{ int i; for (i= 0; pci_vendor_table[i].name; i++) { if (pci_vendor_table[i].vid == vid) return pci_vendor_table[i].name; } return "unknown";}/*===========================================================================* * pci_baseclass_name * *===========================================================================*/PRIVATE char *pci_baseclass_name(baseclass)u8_t baseclass;{ int i; for (i= 0; pci_baseclass_table[i].name; i++) { if (pci_baseclass_table[i].baseclass == baseclass) return pci_baseclass_table[i].name; } return NULL;}/*===========================================================================* * pci_subclass_name * *===========================================================================*/PRIVATE char *pci_subclass_name(baseclass, subclass, infclass)u8_t baseclass;u8_t subclass;u8_t infclass;{ int i; for (i= 0; pci_subclass_table[i].name; i++) { if (pci_subclass_table[i].baseclass != baseclass) continue; if (pci_subclass_table[i].subclass != subclass) continue; if (pci_subclass_table[i].infclass != infclass && pci_subclass_table[i].infclass != (u16_t)-1) { continue; } return pci_subclass_table[i].name; } return NULL;}/*===========================================================================* * ntostr * *===========================================================================*/PRIVATE void ntostr(n, str, end)unsigned n;char **str;char *end;{ char tmpstr[20]; int i; if (n == 0) { tmpstr[0]= '0'; i= 1; } else { for (i= 0; n; i++) { tmpstr[i]= '0' + (n%10); n /= 10; } } for (; i>0; i--) { if (*str == end) { break; } **str= tmpstr[i-1]; (*str)++; } if (*str == end) end[-1]= '\0'; else **str= '\0';}/*===========================================================================* * pci_attr_rsts * *===========================================================================*/PRIVATE u16_t pci_attr_rsts(devind)int devind;{ int busind; busind= pcidev[devind].pd_busind; return pcibus[busind].pb_rsts(busind);} /*===========================================================================* * pcibr_intel_rsts * *===========================================================================*/PRIVATE u16_t pcibr_intel_rsts(busind)int busind;{ int devind; devind= pcibus[busind].pb_devind; return pci_attr_r16(devind, PPB_SSTS);}/*===========================================================================* * pcibr_intel_wsts * *===========================================================================*/PRIVATE void pcibr_intel_wsts(busind, value)int busind;u16_t value;{ int devind; devind= pcibus[busind].pb_devind;#if 0 printf("pcibr_intel_wsts(%d, 0x%X), devind= %d\n", busind, value, devind);#endif pci_attr_w16(devind, PPB_SSTS, value);}/*===========================================================================* * pcibr_via_rsts * *===========================================================================*/PRIVATE u16_t pcibr_via_rsts(busind)int busind;{ int devind; devind= pcibus[busind].pb_devind; return 0;}/*===========================================================================* * pcibr_via_wsts * *===========================================================================*/PRIVATE void pcibr_via_wsts(busind, value)int busind;u16_t value;{ int devind; devind= pcibus[busind].pb_devind;#if 0 printf("pcibr_via_wsts(%d, 0x%X), devind= %d (not implemented)\n", busind, value, devind);#endif}/*===========================================================================* * pci_attr_wsts * *===========================================================================*/PRIVATE void pci_attr_wsts(devind, value)int devind;u16_t value;{ int busind; busind= pcidev[devind].pd_busind; pcibus[busind].pb_wsts(busind, value);} /*===========================================================================* * pcii_rreg8 * *===========================================================================*/PRIVATE u8_t pcii_rreg8(busind, devind, port)int busind;int devind;int port;{ u8_t v; int s; v= PCII_RREG8_(pcibus[busind].pb_bus, pcidev[devind].pd_dev, pcidev[devind].pd_func, port);#if USER_SPACE if (OK != (s=sys_outl(PCII_CONFADD, PCII_UNSEL))) printf("PCI: warning, sys_outl failed: %d\n", s);#else outl(PCII_CONFADD, PCII_UNSEL);#endif#if 0 printf("pcii_rreg8(%d, %d, 0x%X): %d.%d.%d= 0x%X\n", busind, devind, port, pcibus[busind].pb_bus, pcidev[devind].pd_dev, pcidev[devind].pd_func, v);#endif return v;}/*===========================================================================* * pcii_rreg16 * *===========================================================================*/PRIVATE u16_t pcii_rreg16(busind, devind, port)int busind;int devind;int port;{ u16_t v; int s; v= PCII_RREG16_(pcibus[busind].pb_bus, pcidev[devind].pd_dev, pcidev[devind].pd_func, port);#if USER_SPACE if (OK != (s=sys_outl(PCII_CONFADD, PCII_UNSEL))) printf("PCI: warning, sys_outl failed: %d\n");#else outl(PCII_CONFADD, PCII_UNSEL);#endif#if 0 printf("pcii_rreg16(%d, %d, 0x%X): %d.%d.%d= 0x%X\n", busind, devind, port, pcibus[busind].pb_bus, pcidev[devind].pd_dev, pcidev[devind].pd_func, v);#endif return v;}/*===========================================================================* * pcii_rreg32 * *===========================================================================*/PRIVATE u32_t pcii_rreg32(busind, devind, port)int busind;int devind;int port;{ u32_t v; int s; v= PCII_RREG32_(pcibus[busind].pb_bus, pcidev[devind].pd_dev, pcidev[devind].pd_func, port);#if USER_SPACE if (OK != (s=sys_outl(PCII_CONFADD, PCII_UNSEL))) printf("PCI: warning, sys_outl failed: %d\n", s);#else outl(PCII_CONFADD, PCII_UNSEL);#endif#if 0 printf("pcii_rreg32(%d, %d, 0x%X): %d.%d.%d= 0x%X\n", busind, devind, port, pcibus[busind].pb_bus, pcidev[devind].pd_dev, pcidev[devind].pd_func, v);#endif return v;}/*===========================================================================* * pcii_wreg16 * *===========================================================================*/PRIVATE void pcii_wreg16(busind, devind, port, value)int busind;int devind;int port;u16_t value;{ int s;#if 0 printf("pcii_wreg16(%d, %d, 0x%X, 0x%X): %d.%d.%d\n", busind, devind, port, value, pcibus[busind].pb_bus, pcidev[devind].pd_dev, pcidev[devind].pd_func);#endif PCII_WREG16_(pcibus[busind].pb_bus, pcidev[devind].pd_dev, pcidev[devind].pd_func, port, value);#if USER_SPACE if (OK != (s=sys_outl(PCII_CONFADD, PCII_UNSEL))) printf("PCI: warning, sys_outl failed: %d\n", s);#else outl(PCII_CONFADD, PCII_UNSEL);#endif}/*===========================================================================* * pcii_wreg32 * *===========================================================================*/PRIVATE void pcii_wreg32(busind, devind, port, value)int busind;int devind;int port;u32_t value;{ int s;#if 0 printf("pcii_wreg32(%d, %d, 0x%X, 0x%X): %d.%d.%d\n", busind, devind, port, value, pcibus[busind].pb_bus, pcidev[devind].pd_dev, pcidev[devind].pd_func);#endif PCII_WREG32_(pcibus[busind].pb_bus, pcidev[devind].pd_dev, pcidev[devind].pd_func, port, value);#if USER_SPACE if (OK != (s=sys_outl(PCII_CONFADD, PCII_UNSEL))) printf("PCI: warning, sys_outl failed: %d\n");#else outl(PCII_CONFADD, PCII_UNSEL);#endif}/*===========================================================================* * pcii_rsts * *===========================================================================*/PRIVATE u16_t pcii_rsts(busind)int busind;{ u16_t v; int s; v= PCII_RREG16_(pcibus[busind].pb_bus, 0, 0, PCI_PCISTS);#if USER_SPACE if (OK != (s=sys_outl(PCII_CONFADD, PCII_UNSEL))) printf("PCI: warning, sys_outl failed: %d\n", s);#else outl(PCII_CONFADD, PCII_UNSEL);#endif return v;}/*===========================================================================* * pcii_wsts * *===========================================================================*/PRIVATE void pcii_wsts(busind, value)int busind;u16_t value;{ int s; PCII_WREG16_(pcibus[busind].pb_bus, 0, 0, PCI_PCISTS, value);#if USER_SPACE if (OK != (s=sys_outl(PCII_CONFADD, PCII_UNSEL))) printf("PCI: warning, sys_outl failed: %d\n", s);#else outl(PCII_CONFADD, PCII_UNSEL);#endif}/* * $PchId: pci.c,v 1.7 2003/08/07 09:06:51 philip Exp $ */
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -