⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 pci.c

📁 Minix3.11的源码。[MINIX 3是一个为高可靠性应用而设计的自由且简洁的类UNIX系统。]
💻 C
📖 第 1 页 / 共 3 页
字号:
	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 + -