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

📄 cmd_pci.c.svn-base

📁 u-boot loader common files, like cpu, clock, environment...etc...
💻 SVN-BASE
📖 第 1 页 / 共 2 页
字号:
/* * (C) Copyright 2001 Sysgo Real-Time Solutions, GmbH <www.elinos.com> * Andreas Heppel <aheppel@sysgo.de> * * (C) Copyright 2002 * Wolfgang Denk, DENX Software Engineering, wd@denx.de. * Wolfgang Grandegger, DENX Software Engineering, wg@denx.de. * * See file CREDITS for list of people who contributed to this * project. * * This program is free software; you can redistribute it and/or * modify it under the terms of the GNU General Public License as * published by the Free Software Foundation; either version 2 of * the License, or (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 59 Temple Place, Suite 330, Boston, * MA 02111-1307 USA *//* * PCI routines */#include <common.h>#ifdef CONFIG_PCI#include <command.h>#include <asm/processor.h>#include <asm/io.h>#include <pci.h>#if (CONFIG_COMMANDS & CFG_CMD_PCI)extern int cmd_get_data_size(char* arg, int default_size);unsigned char	ShortPCIListing = 1;/* * Follows routines for the output of infos about devices on PCI bus. */void pci_header_show(pci_dev_t dev);void pci_header_show_brief(pci_dev_t dev);/* * Subroutine:  pciinfo * * Description: Show information about devices on PCI bus. *				Depending on the define CFG_SHORT_PCI_LISTING *				the output will be more or less exhaustive. * * Inputs:	bus_no		the number of the bus to be scanned. * * Return:      None * */void pciinfo(int BusNum, int ShortPCIListing){	int Device;	int Function;	unsigned char HeaderType;	unsigned short VendorID;	pci_dev_t dev;	printf("Scanning PCI devices on bus %d\n", BusNum);	if (ShortPCIListing) {		printf("BusDevFun  VendorId   DeviceId   Device Class       Sub-Class\n");		printf("_____________________________________________________________\n");	}	for (Device = 0; Device < PCI_MAX_PCI_DEVICES; Device++) {		HeaderType = 0;		VendorID = 0;		for (Function = 0; Function < PCI_MAX_PCI_FUNCTIONS; Function++) {			/*			 * If this is not a multi-function device, we skip the rest.			 */			if (Function && !(HeaderType & 0x80))				break;			dev = PCI_BDF(BusNum, Device, Function);			pci_read_config_word(dev, PCI_VENDOR_ID, &VendorID);			if ((VendorID == 0xFFFF) || (VendorID == 0x0000))				continue;			if (!Function) pci_read_config_byte(dev, PCI_HEADER_TYPE, &HeaderType);			if (ShortPCIListing)			{				printf("%02x.%02x.%02x   ", BusNum, Device, Function);				pci_header_show_brief(dev);			}			else			{				printf("\nFound PCI device %02x.%02x.%02x:\n",				       BusNum, Device, Function);				pci_header_show(dev);			}	    }    }}static char *pci_classes_str(u8 class){	switch (class) {	case PCI_CLASS_NOT_DEFINED:		return "Build before PCI Rev2.0";		break;	case PCI_BASE_CLASS_STORAGE:		return "Mass storage controller";		break;	case PCI_BASE_CLASS_NETWORK:		return "Network controller";		break;	case PCI_BASE_CLASS_DISPLAY:		return "Display controller";		break;	case PCI_BASE_CLASS_MULTIMEDIA:		return "Multimedia device";		break;	case PCI_BASE_CLASS_MEMORY:		return "Memory controller";		break;	case PCI_BASE_CLASS_BRIDGE:		return "Bridge device";		break;	case PCI_BASE_CLASS_COMMUNICATION:		return "Simple comm. controller";		break;	case PCI_BASE_CLASS_SYSTEM:		return "Base system peripheral";		break;	case PCI_BASE_CLASS_INPUT:		return "Input device";		break;	case PCI_BASE_CLASS_DOCKING:		return "Docking station";		break;	case PCI_BASE_CLASS_PROCESSOR:		return "Processor";		break;	case PCI_BASE_CLASS_SERIAL:		return "Serial bus controller";		break;	case PCI_BASE_CLASS_INTELLIGENT:		return "Intelligent controller";		break;	case PCI_BASE_CLASS_SATELLITE:		return "Satellite controller";		break;	case PCI_BASE_CLASS_CRYPT:		return "Cryptographic device";		break;	case PCI_BASE_CLASS_SIGNAL_PROCESSING:		return "DSP";		break;	case PCI_CLASS_OTHERS:		return "Does not fit any class";		break;	default:	return  "???";		break;	};}/* * Subroutine:  pci_header_show_brief * * Description: Reads and prints the header of the * 		specified PCI device in short form. * * Inputs:	dev      Bus+Device+Function number * * Return:      None * */void pci_header_show_brief(pci_dev_t dev){	u16 vendor, device;	u8 class, subclass;	pci_read_config_word(dev, PCI_VENDOR_ID, &vendor);	pci_read_config_word(dev, PCI_DEVICE_ID, &device);	pci_read_config_byte(dev, PCI_CLASS_CODE, &class);	pci_read_config_byte(dev, PCI_CLASS_SUB_CODE, &subclass);	printf("0x%.4x     0x%.4x     %-23s 0x%.2x\n",	       vendor, device,	       pci_classes_str(class), subclass);}/* * Subroutine:  PCI_Header_Show * * Description: Reads the header of the specified PCI device. * * Inputs:		BusDevFunc      Bus+Device+Function number * * Return:      None * */void pci_header_show(pci_dev_t dev){	u8 _byte, header_type;	u16 _word;	u32 _dword;#define PRINT(msg, type, reg) \	pci_read_config_##type(dev, reg, &_##type); \	printf(msg, _##type)#define PRINT2(msg, type, reg, func) \	pci_read_config_##type(dev, reg, &_##type); \	printf(msg, _##type, func(_##type))	pci_read_config_byte(dev, PCI_HEADER_TYPE, &header_type);	PRINT ("  vendor ID =                   0x%.4x\n", word, PCI_VENDOR_ID);	PRINT ("  device ID =                   0x%.4x\n", word, PCI_DEVICE_ID);	PRINT ("  command register =            0x%.4x\n", word, PCI_COMMAND);	PRINT ("  status register =             0x%.4x\n", word, PCI_STATUS);	PRINT ("  revision ID =                 0x%.2x\n", byte, PCI_REVISION_ID);	PRINT2("  class code =                  0x%.2x (%s)\n", byte, PCI_CLASS_CODE,								pci_classes_str);	PRINT ("  sub class code =              0x%.2x\n", byte, PCI_CLASS_SUB_CODE);	PRINT ("  programming interface =       0x%.2x\n", byte, PCI_CLASS_PROG);	PRINT ("  cache line =                  0x%.2x\n", byte, PCI_CACHE_LINE_SIZE);	PRINT ("  latency time =                0x%.2x\n", byte, PCI_LATENCY_TIMER);	PRINT ("  header type =                 0x%.2x\n", byte, PCI_HEADER_TYPE);	PRINT ("  BIST =                        0x%.2x\n", byte, PCI_BIST);	PRINT ("  base address 0 =              0x%.8x\n", dword, PCI_BASE_ADDRESS_0);	switch (header_type & 0x03) {	case PCI_HEADER_TYPE_NORMAL:	/* "normal" PCI device */		PRINT ("  base address 1 =              0x%.8x\n", dword, PCI_BASE_ADDRESS_1);		PRINT ("  base address 2 =              0x%.8x\n", dword, PCI_BASE_ADDRESS_2);		PRINT ("  base address 3 =              0x%.8x\n", dword, PCI_BASE_ADDRESS_3);		PRINT ("  base address 4 =              0x%.8x\n", dword, PCI_BASE_ADDRESS_4);		PRINT ("  base address 5 =              0x%.8x\n", dword, PCI_BASE_ADDRESS_5);		PRINT ("  cardBus CIS pointer =         0x%.8x\n", dword, PCI_CARDBUS_CIS);		PRINT ("  sub system vendor ID =        0x%.4x\n", word, PCI_SUBSYSTEM_VENDOR_ID);		PRINT ("  sub system ID =               0x%.4x\n", word, PCI_SUBSYSTEM_ID);		PRINT ("  expansion ROM base address =  0x%.8x\n", dword, PCI_ROM_ADDRESS);		PRINT ("  interrupt line =              0x%.2x\n", byte, PCI_INTERRUPT_LINE);		PRINT ("  interrupt pin =               0x%.2x\n", byte, PCI_INTERRUPT_PIN);		PRINT ("  min Grant =                   0x%.2x\n", byte, PCI_MIN_GNT);		PRINT ("  max Latency =                 0x%.2x\n", byte, PCI_MAX_LAT);		break;	case PCI_HEADER_TYPE_BRIDGE:	/* PCI-to-PCI bridge */		PRINT ("  base address 1 =              0x%.8x\n", dword, PCI_BASE_ADDRESS_1);		PRINT ("  primary bus number =          0x%.2x\n", byte, PCI_PRIMARY_BUS);		PRINT ("  secondary bus number =        0x%.2x\n", byte, PCI_SECONDARY_BUS);		PRINT ("  subordinate bus number =      0x%.2x\n", byte, PCI_SUBORDINATE_BUS);		PRINT ("  secondary latency timer =     0x%.2x\n", byte, PCI_SEC_LATENCY_TIMER);		PRINT ("  IO base =                     0x%.2x\n", byte, PCI_IO_BASE);		PRINT ("  IO limit =                    0x%.2x\n", byte, PCI_IO_LIMIT);		PRINT ("  secondary status =            0x%.4x\n", word, PCI_SEC_STATUS);		PRINT ("  memory base =                 0x%.4x\n", word, PCI_MEMORY_BASE);		PRINT ("  memory limit =                0x%.4x\n", word, PCI_MEMORY_LIMIT);		PRINT ("  prefetch memory base =        0x%.4x\n", word, PCI_PREF_MEMORY_BASE);		PRINT ("  prefetch memory limit =       0x%.4x\n", word, PCI_PREF_MEMORY_LIMIT);		PRINT ("  prefetch memory base upper =  0x%.8x\n", dword, PCI_PREF_BASE_UPPER32);		PRINT ("  prefetch memory limit upper = 0x%.8x\n", dword, PCI_PREF_LIMIT_UPPER32);		PRINT ("  IO base upper 16 bits =       0x%.4x\n", word, PCI_IO_BASE_UPPER16);		PRINT ("  IO limit upper 16 bits =      0x%.4x\n", word, PCI_IO_LIMIT_UPPER16);		PRINT ("  expansion ROM base address =  0x%.8x\n", dword, PCI_ROM_ADDRESS1);		PRINT ("  interrupt line =              0x%.2x\n", byte, PCI_INTERRUPT_LINE);		PRINT ("  interrupt pin =               0x%.2x\n", byte, PCI_INTERRUPT_PIN);		PRINT ("  bridge control =              0x%.4x\n", word, PCI_BRIDGE_CONTROL);		break;	case PCI_HEADER_TYPE_CARDBUS:	/* PCI-to-CardBus bridge */

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -