lspci代码摘录

代码稍有改动,自行阅读匹配;


/*
 * The PCI interface treats multi-function devices as independent
 * devices.  The slot/function address of each device is encoded
 * in a single byte as follows:
 *
 *    7:3 = slot
 *    2:0 = function
 */
#define PCI_DEVFN(slot,func)    ((((slot) & 0x1f) << 3) | ((func) & 0x07))
#define PCI_SLOT(devfn)        (((devfn) >> 3) & 0x1f)
#define PCI_FUNC(devfn)        ((devfn) & 0x07)
#define cpu_to_le16(x) (x)
#define cpu_to_le32(x) (x)
#define le16_to_cpu(x) (x)
#define le32_to_cpu(x) (x)

int pci_cfg_read(int bus,int dev,int func, int pos, unsigned char *buf, int len)
{

    int bus=0;
    int dev=0;
    int func=0;
    
  int addr = 0xcfc + (pos&3);

  //printf(" enter conf1_read u=%d",u);
  
  iopl(3);
  
  if (pos >= 4096)
    return 0;

  
  //printf(" enter conf1_read bus=%d dev=%d func=%d",bus,dev,func);
  //sleep(3);  
  outl(0x80000000 | ((bus & 0xff) << 16) | (PCI_DEVFN(dev, func) << 8) | (pos&~3), 0xcf8);
  
  //printf(" outl to cf8\n");
  
  switch (len)
    {
    case 1:
      buf[0] = inb(addr);
      break;
    case 2:
      ((u16 *) buf)[0] = cpu_to_le16(inw(addr));
      break;
    case 4:
      ((u32 *) buf)[0] = cpu_to_le32(inl(addr));
      //printf(" inl from cfc\n");
      break;
    default:
      
      return 0;
    }
  return 1;
}

int conf1_read(int u, int pos, unsigned char *buf, int len)
{
    int bus=0;
    int dev=0;
    int func=0;
    
  int addr = 0xcfc + (pos&3);

  //printf(" enter conf1_read u=%d",u);
  
  iopl(3);
  
  if (pos >= 4096)
    return 0;

   //printf(" enter conf1_read bus=%d dev=%d func=%d",bus,dev,func);
  //sleep(3);  
  outl(0x80000000 | ((bus & 0xff) << 16) | (PCI_DEVFN(dev, func) << 8) | (pos&~3), 0xcf8);
  
  //printf(" outl to cf8\n");
  
  switch (len)
    {
    case 1:
      buf[0] = inb(addr);
      break;
    case 2:
      ((u16 *) buf)[0] = cpu_to_le16(inw(addr));
      break;
    case 4:
      ((u32 *) buf)[0] = cpu_to_le32(inl(addr));
      //printf(" inl from cfc\n");
      break;
    default:
      
      return 0;
    }
  return 1;
}

int conf1_write(int u, int pos, unsigned char *buf, int len)
{
    int bus=0;
    int dev=0;
    int func=0;

  int addr = 0xcfc + (pos&3);

  iopl(3);


  if (pos >= 256)
    return 0;

  outl(0x80000000 | ((bus & 0xff) << 16) | (PCI_DEVFN(dev, func) << 8) | (pos&~3), 0xcf8);

  switch (len)
    {
    case 1:
      outb(buf[0], addr);
      break;
    case 2:
      outw(le16_to_cpu(((u16 *) buf)[0]), addr);
      break;
    case 4:
      outl(le32_to_cpu(((u32 *) buf)[0]), addr);
      break;
    default:
      
      return 0;
    }
  return 1;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值