亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频

? 歡迎來到蟲蟲下載站! | ?? 資源下載 ?? 資源專輯 ?? 關于我們
? 蟲蟲下載站

?? amd-iommu-detect.c

?? xen 3.2.2 源碼
?? C
字號:
/* * Copyright (C) 2007 Advanced Micro Devices, Inc. * Author: Leo Duran <leo.duran@amd.com> * Author: Wei Wang <wei.wang2@amd.com> - adapted to xen * * 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 */#include <xen/config.h>#include <xen/errno.h>#include <asm/iommu.h>#include <asm/amd-iommu.h>#include <asm/hvm/svm/amd-iommu-proto.h>#include "pci-direct.h"#include "pci_regs.h"static int __init valid_bridge_bus_config(int bus, int dev, int func,            int *sec_bus, int *sub_bus){    int pri_bus;    pri_bus = read_pci_config_byte(bus, dev, func, PCI_PRIMARY_BUS);    *sec_bus = read_pci_config_byte(bus, dev, func, PCI_SECONDARY_BUS);    *sub_bus = read_pci_config_byte(bus, dev, func, PCI_SUBORDINATE_BUS);    return ( pri_bus == bus && *sec_bus > bus && *sub_bus >= *sec_bus );}int __init get_iommu_last_downstream_bus(struct amd_iommu *iommu){    int bus, dev, func;    int devfn, hdr_type;    int sec_bus, sub_bus;    int multi_func;    bus = iommu->last_downstream_bus = iommu->root_bus;    iommu->downstream_bus_present[bus] = 1;    dev = PCI_SLOT(iommu->first_devfn);    multi_func = PCI_FUNC(iommu->first_devfn) > 0;    for ( devfn = iommu->first_devfn; devfn <= iommu->last_devfn; ++devfn ) {        /* skipping to next device#? */        if ( dev != PCI_SLOT(devfn) ) {            dev = PCI_SLOT(devfn);            multi_func = 0;        }        func = PCI_FUNC(devfn);         if ( !VALID_PCI_VENDOR_ID(            read_pci_config_16(bus, dev, func, PCI_VENDOR_ID)) )            continue;        hdr_type = read_pci_config_byte(bus, dev, func,                PCI_HEADER_TYPE);        if ( func == 0 )            multi_func = IS_PCI_MULTI_FUNCTION(hdr_type);        if ( (func == 0 || multi_func) &&            IS_PCI_TYPE1_HEADER(hdr_type) ) {            if (!valid_bridge_bus_config(bus, dev, func,                &sec_bus, &sub_bus))                return -ENODEV;            if ( sub_bus > iommu->last_downstream_bus )                iommu->last_downstream_bus = sub_bus;            do {                iommu->downstream_bus_present[sec_bus] = 1;            } while ( sec_bus++ < sub_bus );        }    }    return 0;}int __init get_iommu_capabilities(u8 bus, u8 dev, u8 func, u8 cap_ptr,            struct amd_iommu *iommu){    u32 cap_header, cap_range;    u64 mmio_bar;    /* remove it when BIOS available */    write_pci_config(bus, dev, func,        cap_ptr + PCI_CAP_MMIO_BAR_HIGH_OFFSET, 0x00000000);    write_pci_config(bus, dev, func,        cap_ptr + PCI_CAP_MMIO_BAR_LOW_OFFSET, 0x40000001);    /* remove it when BIOS available */    mmio_bar = (u64)read_pci_config(bus, dev, func,             cap_ptr + PCI_CAP_MMIO_BAR_HIGH_OFFSET) << 32;    mmio_bar |= read_pci_config(bus, dev, func,            cap_ptr + PCI_CAP_MMIO_BAR_LOW_OFFSET) &            PCI_CAP_MMIO_BAR_LOW_MASK;    iommu->mmio_base_phys = (unsigned long)mmio_bar;    if ( (mmio_bar == 0) || ( (mmio_bar & 0x3FFF) != 0 ) ) {        dprintk(XENLOG_ERR ,                "AMD IOMMU: Invalid MMIO_BAR = 0x%"PRIx64"\n", mmio_bar);        return -ENODEV;    }    cap_header = read_pci_config(bus, dev, func, cap_ptr);    iommu->revision = get_field_from_reg_u32(cap_header,                  PCI_CAP_REV_MASK, PCI_CAP_REV_SHIFT);    iommu->iotlb_support = get_field_from_reg_u32(cap_header,                PCI_CAP_IOTLB_MASK, PCI_CAP_IOTLB_SHIFT);    iommu->ht_tunnel_support = get_field_from_reg_u32(cap_header,                    PCI_CAP_HT_TUNNEL_MASK,                    PCI_CAP_HT_TUNNEL_SHIFT);    iommu->not_present_cached = get_field_from_reg_u32(cap_header,                    PCI_CAP_NP_CACHE_MASK,                    PCI_CAP_NP_CACHE_SHIFT);    cap_range = read_pci_config(bus, dev, func,            cap_ptr + PCI_CAP_RANGE_OFFSET);    iommu->root_bus = get_field_from_reg_u32(cap_range,                PCI_CAP_BUS_NUMBER_MASK,                PCI_CAP_BUS_NUMBER_SHIFT);    iommu->first_devfn = get_field_from_reg_u32(cap_range,                PCI_CAP_FIRST_DEVICE_MASK,                PCI_CAP_FIRST_DEVICE_SHIFT);    iommu->last_devfn = get_field_from_reg_u32(cap_range,                PCI_CAP_LAST_DEVICE_MASK,                PCI_CAP_LAST_DEVICE_SHIFT);    return 0;}static int __init scan_caps_for_iommu(int bus, int dev, int func,            iommu_detect_callback_ptr_t iommu_detect_callback){    int cap_ptr, cap_id, cap_type;    u32 cap_header;    int count, error = 0;    count = 0;    cap_ptr = read_pci_config_byte(bus, dev, func,            PCI_CAPABILITY_LIST);    while ( cap_ptr >= PCI_MIN_CAP_OFFSET &&        count < PCI_MAX_CAP_BLOCKS && !error ) {        cap_ptr &= PCI_CAP_PTR_MASK;        cap_header = read_pci_config(bus, dev, func, cap_ptr);        cap_id = get_field_from_reg_u32(cap_header,                PCI_CAP_ID_MASK, PCI_CAP_ID_SHIFT);        if ( cap_id == PCI_CAP_ID_SECURE_DEVICE ) {            cap_type = get_field_from_reg_u32(cap_header,                    PCI_CAP_TYPE_MASK, PCI_CAP_TYPE_SHIFT);            if ( cap_type == PCI_CAP_TYPE_IOMMU ) {                error = iommu_detect_callback(                        bus, dev, func, cap_ptr);            }        }        cap_ptr = get_field_from_reg_u32(cap_header,                PCI_CAP_NEXT_PTR_MASK, PCI_CAP_NEXT_PTR_SHIFT);        ++count;    }    return error;}static int __init scan_functions_for_iommu(int bus, int dev,            iommu_detect_callback_ptr_t iommu_detect_callback){    int func, hdr_type;    int count, error = 0;    func = 0;    count = 1;    while ( VALID_PCI_VENDOR_ID(read_pci_config_16(bus, dev, func,            PCI_VENDOR_ID)) && !error && func < count ) {        hdr_type = read_pci_config_byte(bus, dev, func,                PCI_HEADER_TYPE);        if ( func == 0 && IS_PCI_MULTI_FUNCTION(hdr_type) )            count = PCI_MAX_FUNC_COUNT;        if ( IS_PCI_TYPE0_HEADER(hdr_type) ||            IS_PCI_TYPE1_HEADER(hdr_type) ) {            error =  scan_caps_for_iommu(bus, dev, func,                    iommu_detect_callback);        }        ++func;    }    return error;}int __init scan_for_iommu(iommu_detect_callback_ptr_t iommu_detect_callback){    int bus, dev, error = 0;    for ( bus = 0; bus < PCI_MAX_BUS_COUNT && !error; ++bus ) {        for ( dev = 0; dev < PCI_MAX_DEV_COUNT && !error; ++dev ) {            error =  scan_functions_for_iommu(bus, dev,                  iommu_detect_callback);        }    }    return error;}

?? 快捷鍵說明

復制代碼 Ctrl + C
搜索代碼 Ctrl + F
全屏模式 F11
切換主題 Ctrl + Shift + D
顯示快捷鍵 ?
增大字號 Ctrl + =
減小字號 Ctrl + -
亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
国产一区二区在线视频| 制服丝袜在线91| 欧美大肚乱孕交hd孕妇| 宅男噜噜噜66一区二区66| 亚洲男人的天堂av| 亚洲成人动漫在线观看| 日本aⅴ免费视频一区二区三区| 亚洲一区二区免费视频| 一区二区三区欧美亚洲| 欧美喷水一区二区| 国产欧美久久久精品影院| 色综合久久久久| 色先锋aa成人| 一区二区三区.www| 国产精品久久久久久久久免费丝袜| 亚洲色图清纯唯美| 制服丝袜在线91| 欧美精品一级二级三级| 国产精品一区二区视频| 韩国精品主播一区二区在线观看| 亚洲成人资源网| 777奇米成人网| 国产在线一区二区| 亚洲欧洲av一区二区三区久久| 中文字幕一区日韩精品欧美| 国产大陆亚洲精品国产| 中国色在线观看另类| 免费的成人av| 综合精品久久久| 日韩一区二区三区四区| 91伊人久久大香线蕉| 亚洲一区二区三区自拍| 久久精品夜色噜噜亚洲a∨| 91蜜桃网址入口| 亚洲主播在线播放| 国产精品天美传媒沈樵| 欧美成人免费网站| 久久久久国产免费免费| 69堂成人精品免费视频| 欧美丰满高潮xxxx喷水动漫| 欧美丝袜自拍制服另类| 日韩三级伦理片妻子的秘密按摩| 欧美日韩国产三级| 欧美精选午夜久久久乱码6080| 欧美日本精品一区二区三区| 欧美午夜在线观看| 日韩一级完整毛片| 国产一区二区0| 欧美中文字幕一区| 久久九九影视网| 亚洲一级电影视频| 欧美午夜精品理论片a级按摩| 国产免费成人在线视频| 奇米精品一区二区三区在线观看 | 99这里只有精品| 91亚洲精品乱码久久久久久蜜桃| 久久色.com| 国产成人在线视频免费播放| 久久欧美中文字幕| 国产夫妻精品视频| 亚洲欧美日韩在线| 色婷婷一区二区| 亚洲日本乱码在线观看| 欧美色综合天天久久综合精品| 亚洲一区二区三区不卡国产欧美| 欧美三级午夜理伦三级中视频| 视频一区国产视频| 337p粉嫩大胆色噜噜噜噜亚洲| 高清不卡一二三区| 亚洲黄色尤物视频| 欧美一区二区视频网站| 国产精品一区二区在线观看网站 | 亚洲黄色录像片| 精品视频色一区| 久久aⅴ国产欧美74aaa| 国产精品国产三级国产普通话99| 成人免费电影视频| 香蕉影视欧美成人| 久久久精品一品道一区| av在线不卡网| 亚洲人成小说网站色在线| 欧美日韩亚州综合| 国产一区二区三区最好精华液| 亚洲三级电影网站| 欧美一区二区三区在| 粉嫩一区二区三区性色av| 一区二区高清视频在线观看| 欧美v日韩v国产v| 日本高清视频一区二区| 欧美日韩日本视频| 久久av中文字幕片| 亚洲一卡二卡三卡四卡五卡| www国产精品av| 欧美三级中文字幕| 国产白丝网站精品污在线入口| 性久久久久久久久久久久| 国产精品伦理一区二区| 日韩欧美在线1卡| 欧洲亚洲国产日韩| 粉嫩一区二区三区性色av| 日本亚洲视频在线| 亚洲精品久久久久久国产精华液| 欧美另类z0zxhd电影| 99精品国产热久久91蜜凸| 激情综合色播激情啊| 亚洲妇女屁股眼交7| 国产精品美女久久福利网站| 日韩欧美激情四射| 欧美日韩一区二区不卡| 99久久伊人久久99| 午夜av区久久| 91啪亚洲精品| 国产成人精品亚洲日本在线桃色 | 日韩电影在线免费观看| 亚洲乱码国产乱码精品精小说| 国产欧美日韩亚州综合| 精品国产乱码久久久久久久| 717成人午夜免费福利电影| 欧美中文字幕一二三区视频| 97超碰欧美中文字幕| 福利91精品一区二区三区| 国产综合色视频| 精品一区二区三区欧美| 丝瓜av网站精品一区二区| 亚洲一级二级三级在线免费观看| 亚洲精品大片www| 亚洲综合一区在线| 亚洲电影你懂得| 亚洲资源在线观看| 一区二区三区资源| 亚洲在线视频一区| 午夜影院在线观看欧美| 日韩专区欧美专区| 老司机免费视频一区二区三区| 六月丁香综合在线视频| 韩国v欧美v日本v亚洲v| 狠狠久久亚洲欧美| 免费视频最近日韩| 日本伊人色综合网| 久久99最新地址| 成人黄动漫网站免费app| 国产精品一区二区久激情瑜伽| 国产91精品久久久久久久网曝门| 成人激情综合网站| 91在线视频观看| 欧美亚洲日本国产| 欧美视频一区在线观看| 亚洲欧洲综合另类在线| 婷婷中文字幕综合| 国产精品一级在线| 欧美日韩在线三区| 欧美激情艳妇裸体舞| 五月天欧美精品| 成人毛片视频在线观看| 在线不卡免费欧美| 最新成人av在线| 蜜芽一区二区三区| 91影院在线免费观看| 欧美精品一区二区三区高清aⅴ | 久久不见久久见免费视频7| 91亚洲精品久久久蜜桃网站| 欧美变态tickling挠脚心| 一区二区高清免费观看影视大全| 黄色资源网久久资源365| 在线精品视频一区二区三四 | 亚洲女人小视频在线观看| 久草在线在线精品观看| 在线精品视频小说1| 国产欧美日产一区| 美女一区二区三区在线观看| av综合在线播放| 亚洲国产高清aⅴ视频| 免费观看在线综合色| 欧美在线综合视频| 亚洲三级在线观看| 成人国产精品免费观看动漫| 精品福利一区二区三区| 日韩高清不卡一区二区三区| 欧美亚洲一区三区| 亚洲免费观看在线观看| 成人午夜在线播放| 久久久91精品国产一区二区三区| 青青草国产成人av片免费| 欧美性感一区二区三区| 亚洲精品免费在线观看| 99久久国产综合精品女不卡| 国产亚洲精品久| 国产乱码一区二区三区| 精品国产乱码久久久久久夜甘婷婷| 亚洲成人自拍网| 欧美老肥妇做.爰bbww| 亚洲影院久久精品| 欧美日韩在线电影| 亚洲电影在线播放| 欧美日韩激情一区二区三区| 亚洲永久精品国产| 制服丝袜中文字幕亚洲| 日本欧美一区二区三区| 日韩欧美国产综合一区| 久久不见久久见免费视频7|