美高梅官方网站66159

美高梅官方网站66159Torvalds又为我们带来 3.1 版本的更新,也因此延迟了一周发布 Linux

作者:美高梅官方网站66159    来源:未知    发布时间:2020-04-21 21:32    浏览量:

Linux Kernel 4.2 发布,上周的 RC8 版本并未发现错误,但是还包括了一些修复,也因此延迟了一周发布 Linux 4.2。同时,现在已经开启了 4.3 版本合并窗口。

美高梅官方网站66159 1

这几天发现在Redhat AS6.5 X86_64下用outl(index, 0xcf8)和inl(0xcfc)下读取PCIe配置空间是系统有时性的会hang, 于是去寻找解决方案,首先想到的是用/dev/port这种方案去替代,折腾了半天发现不行,后来想到为什么不用lspci的方法了,结果就成功了,如下为分享。

mainline: 4.2 2015-08-30 [tar.xz] [pgp] [patch]
[view diff] [browse]

最近,Linux Kernel更新频率颇为神速,上周两天时间内先后发布了3.0.2和3.0.3版本。昨日,Linus Torvalds又为我们带来 3.1 版本的更新,推出了Linux 3.1分支的第3个候选版。此次更新的部分改进如下:perf tools:Add group event scheduling option to perf record/statMAINTAINERS: Fix list of perf events source filesxen/tracing: Fix tracing config option properlyxen: xen-selfballoon.c needs more header filesBtrfs: fix 64 bit divide problemext4: flush any pending end_io requests before DIO reads w/dioread_nolock; fix nomblk_io_submit option so it correctly converts uninit blocks; Resolve the hang of direct i/o read in handling EXT4_IO_END_UNWRITTEN; call ext4_ioend_wait and ext4_flush_completed_IO in ext4_evict_inode; Fix ext4_should_writeback_data() for no-journal modeALSA:sound/aoa/fabrics/layout.c: remove unneeded kfreeALSA:hda - Fix error check from snd_hda_get_conn_index() in patch_cirrus.cblktrace: add FLUSH/FUA supportloop: fix deadlock when sysfs and LOOP_CLR_FD race against each otherNFSv4.1: Fix the callback 'highest_used_slotid' behaviourcc1: all warnings being treated as errorsata:Add iMX pata supportperf: fix temporary file ownership checkKVM:fix TASK_DELAY_ACCT kconfig warningdrm/i915:Fix PCH port pipe select in CPT disable paths详细内容参阅:Changelog下载地址:linux-3.1-rc3.tar.bz2

1.基本介绍

Lspci的工具包名为pciutils, 是由捷克的大伽Martin Mares 开发的,目前最新的版本为3.5.1, 你可以通过mj@ucw.cz 联系他, 他的个人主页为, 在上面可以找到他的联系方式。

 

Lspci支持众多OS,

    Linux        (via /sys/bus/pci, /proc/bus/pci or i386 ports)

    FreeBSD        (via /dev/pci)

    NetBSD        (via libpci)

    OpenBSD        (via /dev/pci)

    GNU/kFreeBSD    (via /dev/pci)

    Solaris/i386    (direct port access)

    Aix        (via /dev/pci and odmget)

    GNU Hurd    (direct port access)

    Windows        (direct port access, see README.Windows for caveats)

    CYGWIN        (direct port access)

    BeOS        (via syscalls)

    Haiku        (via /dev/misc/poke)

    Darwin        (via IOKit)

当然我们最关心的Linux.

 

改进列表:

2.下载

你可以从 下载到最新的pciutils,下载后将pciutils-3.5.1.tar.gz解压。然后进入目录运行make进行编译, 编译后你会看到如下目录。

 

美高梅官方网站66159 2

Bert Kenward (1):
     sfc: only use vadaptor stats if firmware is capable

3.Libpci库

进入lib目录, 就会看到生成了一个libpci.a的静态库,这个库你是可以调用的,如果想调用动态库,只需要修改Makefile, 将SHARED参数改为yes即可

SHARED=yes

#make clean

#make

就会有libpci.so.3.5.1生成,如果嫌后面的版本麻烦,可以将其直接改名为libpci.so.

实际上无论是lspci还是setpci都是调用libpci这个库的。

David Ahern (1):
     net: Fix RCU splat in af_key

4. libpci库的调用

首先将libpci.so加到makefile中去,以下为一个例子。

LIB+=-lpthread -ldl ../../lib/libpci.so

 

 

以下是具体的调用例子:

 

将lib目录下的头文件全部copy到/usr/include/pci目录下,有些Linux系统是没有pci目录的,需要创建一个。

 

#include <pci/pci.h>

 

bool PCIe::getPCIConfig(PCI_CONFIG *pci_cfg, unsigned char BusNum, unsigned char DevNum, unsigned char FuncNum)

{

    bool bRet = true;

    unsigned int* pPCIConfig = (unsigned int*)pci_cfg;

    int i,j;

    unsigned char value[256];

    memset(value, 0, sizeof(value));

    struct pci_access *pacc;

    struct pci_dev *dev;

    pacc = pci_alloc();        /* Get the pci_access structure */

    /* Set all options you want -- here we stick with the defaults */

    pci_init(pacc);        /* Initialize the PCI library */

    pci_scan_bus(pacc);        /* We want to get the list of devices */

    for (dev=pacc->devices; dev; dev=dev->next)    /* Iterate over all devices */

    {

        if(! pci_read_block(dev, 0, value, 256))

        {

            printf("Get PCIE configuration space block fail n");

            break;

        }

 

        if((BusNum == dev->bus) && (DevNum == dev->dev) && (FuncNum == dev->func))

        {

            for(i=0, j=0;i<64, j<256;i++, j+=4)

            {

                pPCIConfig[i] = value[j] | (value[j+1] <<8) | (value[j+2] <<16) | (value[j+3] <<24);

                // printf("%d: %04xn", i, pPCIConfig[i] );

                if (i == 0 && ((pPCIConfig[i] == 0xFFFFFFFF) || ((pPCIConfig[i]&0xFFFF) == 0L)))

                {

                    bRet = false;

                    break;

                }

            }

            break;

        }

    }

    pci_cleanup(pacc);        /* Close everything */

    return bRet;

}

 

调用的函数都在pci.h中可以参考如下。

/*

*    The PCI Library

*

*    Copyright (c) 1997--2016 Martin Mares <mj@ucw.cz>

*

*    Can be freely distributed and used under the terms of the GNU GPL.

*/

 

#ifndef _PCI_LIB_H

#define _PCI_LIB_H

 

#ifndef PCI_CONFIG_H

#include "config.h"

#endif

 

#include "header.h"

#include "types.h"

 

#define PCI_LIB_VERSION 0x030501

 

#ifndef PCI_ABI

#define PCI_ABI

#endif

 

/*

*    PCI Access Structure

*/

 

struct pci_methods;

 

enum pci_access_type {

/* Known access methods, remember to update access.c as well */

PCI_ACCESS_AUTO,            /* Autodetection */

PCI_ACCESS_SYS_BUS_PCI,        /* Linux /sys/bus/pci */

PCI_ACCESS_PROC_BUS_PCI,        /* Linux /proc/bus/pci */

PCI_ACCESS_I386_TYPE1,        /* i386 ports, type 1 */

PCI_ACCESS_I386_TYPE2,        /* i386 ports, type 2 */

PCI_ACCESS_FBSD_DEVICE,        /* FreeBSD /dev/pci */

PCI_ACCESS_AIX_DEVICE,        /* /dev/pci0, /dev/bus0, etc. */

PCI_ACCESS_NBSD_LIBPCI,        /* NetBSD libpci */

PCI_美高梅官方网站66159,ACCESS_OBSD_DEVICE,        /* OpenBSD /dev/pci */

PCI_ACCESS_DUMP,            /* Dump file */

PCI_ACCESS_DARWIN,            /* Darwin */

PCI_ACCESS_MAX

};

 

struct pci_access {

/* Options you can change: */

unsigned int method;            /* Access method */

int writeable;            /* Open in read/write mode */

int buscentric;            /* Bus-centric view of the world */

 

char *id_file_name;            /* Name of ID list file (use pci_set_name_list_path()) */

int free_id_name;            /* Set if id_file_name is malloced */

int numeric_ids;            /* Enforce PCI_LOOKUP_NUMERIC (>1 => PCI_LOOKUP_MIXED) */

 

unsigned int id_lookup_mode;        /* pci_lookup_mode flags which are set automatically */

                    /* Default: PCI_LOOKUP_CACHE */

 

int debugging;            /* Turn on debugging messages */

 

/* Functions you can override: */

void (*error)(char *msg, ...) PCI_PRINTF(1,2);    /* Write error message and quit */

void (*warning)(char *msg, ...) PCI_PRINTF(1,2);    /* Write a warning message */

void (*debug)(char *msg, ...) PCI_PRINTF(1,2);    /* Write a debugging message */

 

struct pci_dev *devices;        /* Devices found on this bus */

 

/* Fields used internally: */

struct pci_methods *methods;

struct pci_param *params;

struct id_entry **id_hash;        /* names.c */

struct id_bucket *current_id_bucket;

int id_load_failed;

int id_cache_status;            /* 0=not read, 1=read, 2=dirty */

struct udev *id_udev;            /* names-hwdb.c */

struct udev_hwdb *id_udev_hwdb;

int fd;                /* proc/sys: fd for config space */

int fd_rw;                /* proc/sys: fd opened read-write */

int fd_pos;                /* proc/sys: current position */

int fd_vpd;                /* sys: fd for VPD */

struct pci_dev *cached_dev;        /* proc/sys: device the fds are for */

};

 

/* Initialize PCI access */

struct pci_access *pci_alloc(void) PCI_ABI;

void pci_init(struct pci_access *) PCI_ABI;

void pci_cleanup(struct pci_access *) PCI_ABI;

 

/* Scanning of devices */

void pci_scan_bus(struct pci_access *acc) PCI_ABI;

struct pci_dev *pci_get_dev(struct pci_access *acc, int domain, int bus, int dev, int func) PCI_ABI; /* Raw access to specified device */

void pci_free_dev(struct pci_dev *) PCI_ABI;

 

/* Names of access methods */

int pci_lookup_method(char *name) PCI_ABI;    /* Returns -1 if not found */

char *pci_get_method_name(int index) PCI_ABI;    /* Returns "" if unavailable, NULL if index out of range */

 

/*

*    Named parameters

*/

 

struct pci_param {

struct pci_param *next;        /* Please use pci_walk_params() for traversing the list */

char *param;                /* Name of the parameter */

char *value;                /* Value of the parameter */

int value_malloced;            /* used internally */

char *help;                /* Explanation of the parameter */

};

 

char *pci_get_param(struct pci_access *acc, char *param) PCI_ABI;

int pci_set_param(struct pci_access *acc, char *param, char *value) PCI_ABI;    /* 0 on success, -1 if no such parameter */

/* To traverse the list, call pci_walk_params repeatedly, first with prev=NULL, and do not modify the parameters during traversal. */

struct pci_param *pci_walk_params(struct pci_access *acc, struct pci_param *prev) PCI_ABI;

 

/*

*    Devices

*/

 

struct pci_dev {

struct pci_dev *next;            /* Next device in the chain */

u16 domain_16;            /* 16-bit version of the PCI domain for backward compatibility */

                    /* 0xffff if the real domain doesn't fit in 16 bits */

u8 bus, dev, func;            /* Bus inside domain, device and function */

 

/* These fields are set by pci_fill_info() */

int known_fields;            /* Set of info fields already known */

u16 vendor_id, device_id;        /* Identity of the device */

u16 device_class;            /* PCI device class */

int irq;                /* IRQ number */

pciaddr_t base_addr[6];        /* Base addresses including flags in lower bits */

pciaddr_t size[6];            /* Region sizes */

pciaddr_t rom_base_addr;        /* Expansion ROM base address */

pciaddr_t rom_size;            /* Expansion ROM size */

struct pci_cap *first_cap;        /* List of capabilities */

char *phy_slot;            /* Physical slot */

char *module_alias;            /* Linux kernel module alias */

char *label;                /* Device name as exported by BIOS */

int numa_node;            /* NUMA node */

pciaddr_t flags[6];            /* PCI_IORESOURCE_* flags for regions */

pciaddr_t rom_flags;            /* PCI_IORESOURCE_* flags for expansion ROM */

int domain;                /* PCI domain (host bridge) */

 

/* Fields used internally: */

struct pci_access *access;

struct pci_methods *methods;

u8 *cache;                /* Cached config registers */

int cache_len;

int hdrtype;                /* Cached low 7 bits of header type, -1 if unknown */

void *aux;                /* Auxillary data */

};

 

#define PCI_ADDR_IO_MASK (~(pciaddr_t) 0x3)

#define PCI_ADDR_MEM_MASK (~(pciaddr_t) 0xf)

#define PCI_ADDR_FLAG_MASK 0xf

 

u8 pci_read_byte(struct pci_dev *, int pos) PCI_ABI; /* Access to configuration space */

u16 pci_read_word(struct pci_dev *, int pos) PCI_ABI;

u32 pci_read_long(struct pci_dev *, int pos) PCI_ABI;

int pci_read_block(struct pci_dev *, int pos, u8 *buf, int len) PCI_ABI;

int pci_read_vpd(struct pci_dev *d, int pos, u8 *buf, int len) PCI_ABI;

int pci_write_byte(struct pci_dev *, int pos, u8 data) PCI_ABI;

int pci_write_word(struct pci_dev *, int pos, u16 data) PCI_ABI;

int pci_write_long(struct pci_dev *, int pos, u32 data) PCI_ABI;

int pci_write_block(struct pci_dev *, int pos, u8 *buf, int len) PCI_ABI;

 

int pci_fill_info(struct pci_dev *, int flags) PCI_ABI; /* Fill in device information */

 

#define PCI_FILL_IDENT        0x0001

#define PCI_FILL_IRQ        0x0002

#define PCI_FILL_BASES        0x0004

#define PCI_FILL_ROM_BASE    0x0008

#define PCI_FILL_SIZES        0x0010

#define PCI_FILL_CLASS        0x0020

#define PCI_FILL_CAPS        0x0040

#define PCI_FILL_EXT_CAPS    0x0080

#define PCI_FILL_PHYS_SLOT    0x0100

#define PCI_FILL_MODULE_ALIAS    0x0200

#define PCI_FILL_LABEL        0x0400

#define PCI_FILL_NUMA_NODE    0x0800

#define PCI_FILL_IO_FLAGS    0x1000

#define PCI_FILL_RESCAN        0x00010000

 

void pci_setup_cache(struct pci_dev *, u8 *cache, int len) PCI_ABI;

 

/*

*    Capabilities

*/

 

struct pci_cap {

struct pci_cap *next;

u16 id;                /* PCI_CAP_ID_xxx */

u16 type;                /* PCI_CAP_xxx */

unsigned int addr;            /* Position in the config space */

};

 

#define PCI_CAP_NORMAL        1    /* Traditional PCI capabilities */

#define PCI_CAP_EXTENDED    2    /* PCIe extended capabilities */

 

struct pci_cap *pci_find_cap(struct pci_dev *, unsigned int id, unsigned int type) PCI_ABI;

 

/*

*    Filters

*/

 

struct pci_filter {

int domain, bus, slot, func;            /* -1 = ANY */

int vendor, device, device_class;

int rfu[3];

};

 

void pci_filter_init(struct pci_access *, struct pci_filter *) PCI_ABI;

char *pci_filter_parse_slot(struct pci_filter *, char *) PCI_ABI;

char *pci_filter_parse_id(struct pci_filter *, char *) PCI_ABI;

int pci_filter_match(struct pci_filter *, struct pci_dev *) PCI_ABI;

 

/*

*    Conversion of PCI ID's to names (according to the pci.ids file)

*

*    Call pci_lookup_name() to identify different types of ID's:

*

*    VENDOR                (vendorID) -> vendor

*    DEVICE                (vendorID, deviceID) -> device

*    VENDOR | DEVICE            (vendorID, deviceID) -> combined vendor and device

*    SUBSYSTEM | VENDOR        (subvendorID) -> subsystem vendor

*    SUBSYSTEM | DEVICE        (vendorID, deviceID, subvendorID, subdevID) -> subsystem device

*    SUBSYSTEM | VENDOR | DEVICE    (vendorID, deviceID, subvendorID, subdevID) -> combined subsystem v+d

*    SUBSYSTEM | ...            (-1, -1, subvendorID, subdevID) -> generic subsystem

*    CLASS                (classID) -> class

*    PROGIF                (classID, progif) -> programming interface

*/

 

char *pci_lookup_name(struct pci_access *a, char *buf, int size, int flags, ...) PCI_ABI;

 

int pci_load_name_list(struct pci_access *a) PCI_ABI;    /* Called automatically by pci_lookup_*() when needed; returns success */

void pci_free_name_list(struct pci_access *a) PCI_ABI;    /* Called automatically by pci_cleanup() */

void pci_set_name_list_path(struct pci_access *a, char *name, int to_be_freed) PCI_ABI;

void pci_id_cache_flush(struct pci_access *a) PCI_ABI;

 

enum pci_lookup_mode {

PCI_LOOKUP_VENDOR = 1,        /* Vendor name (args: vendorID) */

PCI_LOOKUP_DEVICE = 2,        /* Device name (args: vendorID, deviceID) */

PCI_LOOKUP_CLASS = 4,            /* Device class (args: classID) */

PCI_LOOKUP_SUBSYSTEM = 8,

PCI_LOOKUP_PROGIF = 16,        /* Programming interface (args: classID, prog_if) */

PCI_LOOKUP_NUMERIC = 0x10000,        /* Want only formatted numbers; default if access->numeric_ids is set */

PCI_LOOKUP_NO_NUMBERS = 0x20000,    /* Return NULL if not found in the database; default is to print numerically */

PCI_LOOKUP_MIXED = 0x40000,        /* Include both numbers and names */

PCI_LOOKUP_NETWORK = 0x80000,        /* Try to resolve unknown ID's by DNS */

PCI_LOOKUP_SKIP_LOCAL = 0x100000,    /* Do not consult local database */

PCI_LOOKUP_CACHE = 0x200000,        /* Consult the local cache before using DNS */

PCI_LOOKUP_REFRESH_CACHE = 0x400000,    /* Forget all previously cached entries, but still allow updating the cache */

PCI_LOOKUP_NO_HWDB = 0x800000,    /* Do not ask udev's hwdb */

};

 

#endif

 

 

 

David Daney (1):
     phylib: Make PHYs children of their MDIO bus, not the bus' parent.

David Henningsson (1):
     ALSA: hda - Shutdown CX20722 on reboot/free to avoid spurious noises

Eugene Shatokhin (1):
     usbnet: Get EVENT_NO_RUNTIME_PM bit before it is cleared

Florian Fainelli (1):
     net: bcmgenet: Avoid sleeping in bcmgenet_timeout

Guilherme G. Piccoli (2):
     PCI: Make pci_msi_setup_pci_dev() non-static for use by arch code
     powerpc/PCI: Disable MSI/MSI-X interrupts at PCI probe time in OF case

Guillermo A. Amaral (1):
     Add factory recertified Crucial M500s to blacklist

Iyappan Subramanian (1):
     drivers: net: xgene: fix: Oops in linkwatch_fire_event

J. Bruce Fields (1):
     nfsd: Add Jeff Layton as co-maintainer

Jaedon Shin (1):
     net: bcmgenet: fix uncleaned dma flags

Jan Beulich (1):
     LSM: restore certain default error codes

Javi Merino (1):
     thermal: power_allocator: allocate with kcalloc what you free with kfree

Jeff Moyer (1):
     mtip32x: fix regression introduced by blk-mq per-hctx flush

Jurgen Kramer (1):
     ALSA: usb: Add native DSD support for Gustard DAC-X20U

Kazuya Mizuguchi (1):
     net: compile renesas directory if NET_VENDOR_RENESAS is configured

Ken-ichirou MATSUZAWA (1):
     netlink: mmap: fix tx type check

Linus Torvalds (1):
     Linux 4.2

Madalin Bucur (1):
     net: phy: fixed: propagate fixed link values to struct

Marc Kleine-Budde (1):
     can: pcan_usb: don't provide CAN FD bittimings by non-FD adapters

Marc Zyngier (1):
     arm64: KVM: Fix host crash when injecting a fault into a 32bit guest

Marcelo Ricardo Leitner (1):
     vxlan: re-ignore EADDRINUSE from igmp_join

Markus Osterhoff (1):
     ALSA: hda: fix possible NULL dereference

Ross Zwisler (1):
     nfit, nd_blk: BLK status register is only 32 bits

Russell King (2):
     net: phy: add locking to phy_read_mmd_indirect()/phy_write_mmd_indirect()
     net: fec: use reinit_completion() in mdio accessor functions

Takashi Iwai (2):
     ALSA: hda - Check all inputs for is_active_nid_for_any()
     ALSA: hda - Fix path power activation

Tejun Heo (1):
     writeback: sync_inodes_sb() must write out I_DIRTY_TIME inodes
and always call wait_sb_inodes()

Thomas Gleixner (1):
     x86/apic: Fix fallout from x2apic cleanup

Toshi Kani (1):
     nfit: Clarify memory device state flags strings

WANG Cong (1):
     cls_u32: complete the check for non-forced case in u32_destroy()

huaibin Wang (1):
     ip6_gre: release cached dst on tunnel removal

lucien (2):
     sctp: asconf's process should verify address parameter is in the beginning
     sctp: donot reset the overall_error_count in SHUTDOWN_RECEIVE state

(文/开源中国)    

上一篇:没有了
下一篇:没有了

更多新闻推荐

Copyright © 2015-2019 http://www.77zhth.net. 美高梅官方网站66159有限公司 版权所有