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

📄 csbpci.c

📁 umon bootloader source code, support mips cpu.
💻 C
📖 第 1 页 / 共 2 页
字号:
									pci_dev_info[pci_dev].bar_size[bar] = bar_size;
									pci_dev_info[pci_dev].bar_map[bar] = io_base;
									pci_cfg_write_dword(bus, PCI_MAKE_DEV_FUNC(dev, func), ((bar << 2) + PCI_CFG_BAR0_REG), io_base);
								}
								else {
									pci_dev_info[pci_dev].bar_size[bar] = bar_size;
									pci_dev_info[pci_dev].bar_map[bar] = io_base;
									pci_cfg_write_dword(bus, PCI_MAKE_DEV_FUNC(dev, func), ((bar << 2) + PCI_CFG_BAR0_REG), io_base);
								}
								// do we really have the space?
								if (io_base > PCI_IO_BASE + PCI_IO_SIZE) return PCI_IO_SPACE_ERR;
								// Yes
								io_base = io_base + bar_size;
							}
							else { // MEM
#ifdef PCI_DBG
								printf("PCI Probe Raw Mem BAR = %08x\n", bar_size);
#endif
								// assign a minimum of 1M for Memory
								if(bar_size < 0x00100000) bar_size = 0xffff0000;

								// save the boundry as a mask for use later
								bar_boundry = ~(bar_size & 0xfffffff0);

#ifdef PCI_DBG
								printf("PCI Probe BAR Boundry = %08x\n", bar_boundry);
#endif
								// Check the BAR type as we only support 32 or 64-bit BAR's
								bar_type = (bar_size & 0x06) >> 1;
								if ((bar_type != PCI_MEM_BAR_TYPE_32BIT) && (bar_type != PCI_MEM_BAR_TYPE_64BIT)) return PCI_MEM_BAR_TYPE_ERR;

								// MEM - convert raw bar size to final power of 2 size
								bar_size = bar_boundry + 1;

#ifdef PCI_DBG
								printf("PCI Probe Final BAR Size = %08x\n", bar_size);
#endif
								// sanity check it against maximum size MEM we allow
								if (bar_size > PCI_MEM_BAR_MAX)
								{
									return PCI_MEM_BAR_MAX_ERR;
								}

								// All allocation must occur on the boundry specificed by the size
								if (mem_base & ~bar_boundry){
									mem_base = mem_base + bar_size;
									mem_base = mem_base & ~bar_boundry;
									pci_dev_info[pci_dev].bar_size[bar] = bar_size;
									pci_dev_info[pci_dev].bar_map[bar] = mem_base;
									pci_cfg_write_dword(bus, PCI_MAKE_DEV_FUNC(dev, func), ((bar << 2) + PCI_CFG_BAR0_REG), mem_base);
								}
								else {
									pci_dev_info[pci_dev].bar_size[bar] = bar_size;
									pci_dev_info[pci_dev].bar_map[bar] = mem_base;
									pci_cfg_write_dword(bus, PCI_MAKE_DEV_FUNC(dev, func), ((bar << 2) + PCI_CFG_BAR0_REG), mem_base);
								}
								// do we really have the space?
								if (mem_base > PCI_MEM_BASE + PCI_MEM_SIZE) return PCI_MEM_SPACE_ERR;
								// Yes
								mem_base = mem_base + bar_size;

								// if this was a 64-bit BAR, fill the next BAR with all 0's
								if (bar_type == PCI_MEM_BAR_TYPE_64BIT){
									bar++;
									pci_cfg_write_dword(bus, PCI_MAKE_DEV_FUNC(dev, func), ((bar << 2) + PCI_CFG_BAR0_REG), 0x00000000);
									pci_dev_info[pci_dev].bar_size[bar] = 0x0;
									pci_dev_info[pci_dev].bar_map[bar] = 0x0;
								} // if 64-bit BAR
							} // IO or MEM
						} // if bar_size != 0
						else { // invalid bar
							pci_dev_info[pci_dev].bar_size[bar] = 0x0;
							pci_dev_info[pci_dev].bar_map[bar] = 0x0;
						}
					} // for BAR
					pci_dev_info[pci_dev].bus = bus;
					pci_dev_info[pci_dev].dev = dev;
					pci_dev_info[pci_dev].func = func;
					pci_dev++;
					if (pci_dev > PCI_DEV_MAX) return PCI_DEV_MAX_ERR;  // is this really an error?
				
					// Some devices ignore the function number, so check the multifunction bit in the header type reg
					if ((pci_cfg_read_byte (bus, PCI_MAKE_DEV_FUNC(dev, func), PCI_CFG_HDR_TYPE_REG) & 0x80) == 0x00)
						break;	// not a mutlifunction header so break out of the function loop
				} // not a bridge
			} // if non-0xFFFF vendor
			else // 0xFFFF returned 
				break;	// don't bother checking the remaining functions for the current device
		} // for function
	} // for device
	return 0;
}

//--------------------------------------------------------------------------
// pci_tst()
//
// This routine inits and then probes the PCI bus
// then displays the results
//
char *pciHelp[] = {
	"PCI bus test",
    "-[i]",
    "Options:",
    " -i Get info only, does not run test",
	(char *)0,
};

int pci_tst(int argc,char *argv[])
{
    int  next_bus;
	int temp, i, x, opt;
	int get_info = 0;

    while ((opt=getopt(argc,argv,"i")) != -1) {
        switch(opt) {
	        case 'i':   // get info only
				get_info = 1;
			break;
			default:	// test with current mode
				break;
		}
	}
	if (get_info == 0)
	{
		// Init the PCI Interface
		pci_init();
		printf("Begin PCI Bus Probe.\n");
		// Now probe the bus
		next_bus = 0;
		mem_base = PCI_MEM_BASE;
		io_base = PCI_IO_BASE;
		pci_dev = 0;
		
		temp = pci_probe_bus();
		if (temp){
			printf("PCI Probe Failed, Returned Status = %08x\n", temp);
			printf("Next Bus = %08x\n", next_bus);
			printf("IO_BASE  = 0x%08lX\n", io_base);
			printf("MEM_BASE = 0x%08lX\n", mem_base);
			printf("PCI_DEV  = %ld\n", pci_dev);
			printf("    PCI_DEV.VENDOR ID       = 0x%04X\n",
				pci_dev_info[pci_dev].ven_id);
			printf("    PCI_DEV.DEVICE ID       = 0x%04X\n",
				pci_dev_info[pci_dev].dev_id);
			printf("    PCI_DEV.DEVICE CLASS    = 0x%02X\n",
				pci_dev_info[pci_dev].class);
			printf("    PCI_DEV.DEVICE SUBCLASS = 0x%02X\n",
				pci_dev_info[pci_dev].subclass);
			printf("    PCI_DEV.FUNCTION        = %ld\n",
				(ulong)pci_dev_info[pci_dev].func);
			printf("    PCI_DEV.DEVICE          = %ld\n",
				(ulong)pci_dev_info[pci_dev].dev);
			printf("    PCI_DEV.BUS             = %ld\n",
				(ulong)pci_dev_info[pci_dev].bus);
			printf("    PCI_DEV BAR Info:\n");
			for (x = 0; x < 6; x++){
				printf("          PCI_DEV.BAR_SIZE[%d] = 0x%08lX\n",
					x, pci_dev_info[pci_dev].bar_size[x]);
				printf("          PCI_DEV.BAR_MAP[%d]  = 0x%08lX\n",
					x, pci_dev_info[pci_dev].bar_map[x]);
			}
		}
	} // get info == 0
	if (pci_dev == 0){ 
		printf("\nPCI Probe Found No PCI Devices\n");
	}
	else {
		printf("\nPCI Probe Found The Following %ld PCI Device(s)\n", pci_dev);
		// dump the contents of pci_dev_info
		for (i = 0; i < pci_dev; i++){
			printf("PCI_DEV = %01d\n", i);
			printf("    PCI_DEV.VENDOR ID       = 0x%04X\n",
				pci_dev_info[i].ven_id);
			printf("    PCI_DEV.DEVICE ID       = 0x%04X\n",
				pci_dev_info[i].dev_id);
			printf("    PCI_DEV.DEVICE CLASS    = 0x%02X\n",
				pci_dev_info[i].class);
			printf("    PCI_DEV.DEVICE SUBCLASS = 0x%02X\n",
				pci_dev_info[i].subclass);
			printf("    PCI_DEV.BUS             = %ld\n",
				pci_dev_info[i].bus);
			printf("    PCI_DEV.DEVICE          = %ld\n",
				pci_dev_info[i].dev);
			printf("    PCI_DEV.FUNCTION        = %ld\n",
				pci_dev_info[i].func);
			printf("    PCI_DEV BAR Info:\n");
			for (x = 0; x < 6; x++){
				printf("        PCI_DEV.BAR_SIZE[%d] = 0x%08lX\n",
					x, pci_dev_info[i].bar_size[x]);
				printf("        PCI_DEV.BAR_MAP[%d]  = 0x%08lX\n",
					x, pci_dev_info[i].bar_map[x]);
			}
		} // for i < pci_dev
		printf("Final IO_BASE  = 0x%08lX\n", io_base);
		printf("Final MEM_BASE = 0x%08lX\n", mem_base);

	}  // if-else pci_dev
	return 0;
}

//--------------------------------------------------------------------------
// End of pci.c

⌨️ 快捷键说明

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