Unix & Linux Stack Exchange is a question and answer site for users of Linux, FreeBSD and other Un*x-like operating systems. It's 100% free, no registration required.

Sign up
Here's how it works:
  1. Anybody can ask a question
  2. Anybody can answer
  3. The best answers are voted up and rise to the top

I'm trying to develope a pci driver but I can not compile it because my pci header is quite different from books and references. My distribution is 3.15.7-1-ARCH.


When the reference's pci.h looks complete, I can not understand why my laptop's header is just below:

 *  pci.h
 *  PCI defines and function prototypes
 *  Copyright 1994, Drew Eckhardt
 *  Copyright 1997--1999 Martin Mares <mj@ucw.cz>
 *  For more information, please consult the following manuals (look at
 *  http://www.pcisig.com/ for how to get them):
 *  PCI BIOS Specification
 *  PCI Local Bus Specification
 *  PCI to PCI Bridge Specification
 *  PCI System Design Guide

#ifndef LINUX_PCI_H
#define LINUX_PCI_H

#include <linux/pci_regs.h> /* The pci register defines */

 * 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)

/* Ioctls for /proc/bus/pci/X/Y nodes. */
#define PCIIOC_BASE     ('P' << 24 | 'C' << 16 | 'I' << 8)
#define PCIIOC_CONTROLLER   (PCIIOC_BASE | 0x00)    /* Get controller for PCI device. */
#define PCIIOC_MMAP_IS_IO   (PCIIOC_BASE | 0x01)    /* Set mmap state to I/O space. */
#define PCIIOC_MMAP_IS_MEM  (PCIIOC_BASE | 0x02)    /* Set mmap state to MEM space. */
#define PCIIOC_WRITE_COMBINE    (PCIIOC_BASE | 0x03)    /* Enable/disable write-combining. */

#endif /* LINUX_PCI_H */
share|improve this question
up vote 1 down vote accepted

The free-electrons header is internal to the kernel source, and you will find it if you look in [src]/include/linux; if you are compiling kernel code, that should be in play.

The header you've pasted is the system header, from /usr/include/linux. That's for user land code that needs access to the constants and macros defined therein.

These don't actually conflict. Notice at the top of the longer, kernel internal one:

#include <uapi/linux/pci.h>

That path doesn't exist in the normal system include directories, but it does exist in [src]/include, and if you check there for this file, you'll notice it's pretty much identical to your system's /usr/include/linux/pci.h. That's how kernel code can access the same values, plus all the stuff it needs internally, since the usual linux/pci.h will have been overridden by something like -I[src]/include, but kernel code which contains #include <linux/pci.h> will pull in [src]/include/linux/pci.h which pulls in [src]/include/uapi/pci.h which is identical to /usr/include/linux/pci.h.

share|improve this answer

Your Answer


By posting your answer, you agree to the privacy policy and terms of service.

Not the answer you're looking for? Browse other questions tagged or ask your own question.