PCIメモ2

2010/02/10追記:下の日記が,ちゃんと動く版です〜
http://d.hatena.ne.jp/masami256/20100208/1265644385

昨日のソースにデバイスがマルチファンクションの場合の処理を追加してみました.というか,マルチファンクションかどうかチェックしてないですけどwww
コードは書いたんですけどね〜 使わずに全検索してます.

CONFIG_ADDRESS,CONFIG_DATAの読み出し部分をリファクタリングしたり,関数名を変更したのと,ベンダーID・デバイスIDが0xffffじゃない場合に,ファンクション番号1〜7に対してデータを読みに行くようにしただけです.

static u_int32_t find_pci_data(u_int8_t bus, u_int8_t dev)
{
	u_int32_t data;
	struct pci_configuration_register reg;

	// At first, check function number zero.
	memset(&reg, 0, sizeof(reg));
	reg.bus_num = bus;
	reg.dev_num = dev;

	// get vender id and device id.
	data = read_pci_reg00(&reg);
	if (data != 0xffffffff) {
		u_int32_t class;
		int i;

		// Check all function numbers.
		for (i = 0; i < PCI_FUNCTION_MAX; i++) {
			reg.func_num = i;
			
			data = read_pci_reg00(&reg);
			class = read_pci_class(&reg);
			
			if (class != 0xffffffff) {
				printk("Found Device: Bus %d : Devfn %d : Vender 0x%x : Device 0x%x : func_num %d : Class 0x%x\n", 
				       bus, dev, data & 0xffff, (data >> 16) & 0xffff, i, class);
			}
		} 
	} 
	
	return 0;
}

これがKVMQEMUで動かしたときの絵です.

これで,PCIデバイスの検索は大体できるようになったと思われます〜