| /* pci_mgr.h - hypervisor PCI bus manager */ |
| |
| /* |
| * Copyright (c) 2009-2011, 2013-2014 Wind River Systems, Inc. |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef __inc_pci_mgr_h |
| #define __inc_pci_mgr_h |
| |
| #ifdef __cplusplus |
| extern "C" { |
| |
| /* Remapped reserved C++ words */ |
| #define class _class |
| |
| #endif /* __cplusplus */ |
| |
| /* requests available from the PCI bus manager */ |
| |
| #define SYS_PCI_REQUEST_READ_DATA 1 |
| #define SYS_PCI_REQUEST_WRITE_DATA 2 |
| #define SYS_PCI_REQUEST_READ_ADDR 3 |
| #define SYS_PCI_REQUEST_WRITE_ADDR 4 |
| |
| /* requests results */ |
| |
| #define SYS_PCI_REQUEST_OK 0 |
| #define SYS_PCI_REQUEST_FAILED 1 |
| |
| /* data access sizes */ |
| |
| #define SYS_PCI_ACCESS_8BIT 0 |
| #define SYS_PCI_ACCESS_16BIT 1 |
| #define SYS_PCI_ACCESS_32BIT 3 |
| |
| #define PCI_MAX_ADDR_CACHE 8 /* cache up to 8 addr writes */ |
| |
| #define PCI_HEADER_WORDS 64 /* 64 32-bit words in the header */ |
| |
| #define PCI_NO_OFFSET 0 |
| |
| /* default controller to use */ |
| |
| #define DEFAULT_PCI_CONTROLLER 0 |
| #define NO_PCI_CONTROLLER 0xffff |
| |
| /* maximum number of controllers supported */ |
| |
| #define PCI_MAX_CONTROLLER 4 |
| #define PCI_MAX_MGR PCI_MAX_CONTROLLER |
| |
| /* maximum number of extended capabilities */ |
| |
| #define PCI_MAX_ECP 32 |
| |
| /* invalid pci controller */ |
| |
| #define PCI_INVALID_CONTROLLER_ID 0xffffffff |
| |
| #ifndef _ASMLANGUAGE |
| |
| /* |
| * |
| * PCI Address Register |
| * |
| * The configuration address register is a 32-bit register with the format |
| * shown below. Bit 31 is an enable flag for determining when accesses to the |
| * configuration data should be translated to configuration cycles. Bits 23 |
| * through 16 allow the configuration software to choose a specific PCI bus in |
| * the system. Bits 15 through 11 select the specific device on the PCI Bus. |
| * Bits 10 through 8 choose a specific function in a device (if the device |
| * supports multiple functions). Bits 7 through 2 select the specific 32-bit |
| * area in the device's configuration space. |
| * |
| * +--------------------------------------------------------+ |
| * | Bit 31 | Bits 30-24 | Bits 23-16 | |
| * +------------------+------------------+------------------+ |
| * | Enable | Reserved | Bus Number | |
| * +--------------------------------------------------------+ |
| * |
| * +---------------------------------------------------------------------------+ |
| * | Bits 15-11 | Bits 10-8 | Bits 7-2 | Bits 1-0 | |
| * +------------------+------------------+------------------+------------------+ |
| * | Device Number | Function Number | Register Number | 00 | |
| * +---------------------------------------------------------------------------+ |
| * |
| */ |
| |
| union pci_addr_reg { |
| struct { |
| #ifdef _BIG_ENDIAN |
| u32_t enable : 1; /* access enabled */ |
| u32_t reserved1 : 7; |
| u32_t bus : 8; /* PCI bus number */ |
| u32_t device : 5; /* PCI device number */ |
| u32_t func : 3; /* device function number */ |
| u32_t reg : 6; /* config space register number */ |
| u32_t offset : 2; /* offset for access data */ |
| #else |
| u32_t offset : 2; /* offset for access data */ |
| u32_t reg : 6; /* config space register number */ |
| u32_t func : 3; /* device function number */ |
| u32_t device : 5; /* PCI device number */ |
| u32_t bus : 8; /* PCI bus number */ |
| u32_t reserved1 : 7; |
| u32_t enable : 1; /* access enabled */ |
| #endif |
| } field; |
| u32_t value; |
| }; |
| |
| |
| /* |
| * |
| * PCI Extended Address Register |
| * |
| * The configuration address register is a 32-bit register with the format |
| * shown below. Bit 31 is an enable flag for determining when accesses to the9 |
| * configuration data should be translated to configuration cycles. Bits 23 |
| * through 16 allow the configuration software to choose a specific PCI bus in |
| * the system. Bits 15 through 11 select the specific device on the PCI Bus. |
| * Bits 10 through 8 choose a specific function in a device (if the device |
| * supports multiple functions). Bits 7 through 2 select the specific 32-bit |
| * area in the device's configuration space. |
| * |
| * +--------------------------------------------------------+ |
| * | Bit 31 | Bits 30-24 | Bits 23-16 | |
| * +------------------+------------------+------------------+ |
| * | Enable | Reserved | Bus Number | |
| * +--------------------------------------------------------+ |
| * |
| * +---------------------------------------------------------------------------+ |
| * | Bits 15-11 | Bits 10-8 | Bits 7-2 | Bits 1-0 | |
| * +------------------+------------------+------------------+------------------+ |
| * | Device Number | Function Number | Register Number | 00 | |
| * +---------------------------------------------------------------------------+ |
| */ |
| |
| union pcie_addr_reg { |
| struct { |
| #ifdef _BIG_ENDIAN |
| u32_t reserved1 : 4; |
| u32_t bus : 8; /* PCI bus number */ |
| u32_t device : 5; /* PCI device number */ |
| u32_t func : 3; /* device function number */ |
| u32_t reg : 10; /* config space register number */ |
| u32_t reserved0 : 2; |
| #else |
| u32_t reserved0 : 2; |
| u32_t reg : 10; /* config space register number */ |
| u32_t func : 3; /* device function number */ |
| u32_t device : 5; /* PCI device number */ |
| u32_t bus : 8; /* PCI bus number */ |
| u32_t reserved1 : 4; |
| #endif |
| } field; |
| u32_t value; |
| }; |
| |
| /* |
| * PCI Device Structure |
| * |
| * The PCI Specification defines the organization of the 256-byte Configuration |
| * Space registers and imposes a specific template for the space. The table |
| * below shows the layout of the 256-byte Configuration space. All PCI |
| * compliant devices must support the Vendor ID, Device ID, Command and Status, |
| * Revision ID, Class Code and Header Type fields. Implementation of the other |
| * registers is optional, depending upon the devices functionality. |
| * |
| * The PCI devices follow little ENDIAN ordering. The lower addresses contain |
| * the least significant portions of the field. Software to manipulate this |
| * structure must take particular care that the endian-ordering follows the PCI |
| * devices, not the CPUs. |
| * |
| * Header Type 0x00: |
| * |
| * +---------------------------------------------------------------------------+ |
| * | Register | Bits 31-24 | Bits 23-16 | Bits 15-8 | Bits 7-0 | |
| * +----------+---------------+----------------+----------------+--------------+ |
| * | 00 | Device ID | Vendor ID | |
| * +----------+--------------------------------+-------------------------------+ |
| * | 04 | Status | Command | |
| * +----------+---------------+----------------+-------------------------------+ |
| * | 08 | Class Code | Subclass | Register IF | Revision ID | |
| * +----------+---------------+----------------+----------------+--------------+ |
| * | 0C | BIST | Header type |Latency Timer |Cache Line Size| |
| * +----------+---------------+----------------+----------------+--------------+ |
| * | 10 | Base address #0 (BAR0) | |
| * +----------+----------------------------------------------------------------+ |
| * | 14 | Base address #1 (BAR1) | |
| * +----------+----------------------------------------------------------------+ |
| * | 18 | Base address #2 (BAR2) | |
| * +----------+----------------------------------------------------------------+ |
| * | 1C | Base address #3 (BAR3) | |
| * +----------+----------------------------------------------------------------+ |
| * | 20 | Base address #4 (BAR4) | |
| * +----------+----------------------------------------------------------------+ |
| * | 24 | Base address #5 (BAR5) | |
| * +----------+----------------------------------------------------------------+ |
| * | 28 | Cardbus CIS Pointer | |
| * +----------+--------------------------------+-------------------------------+ |
| * | 2C | Subsystem ID | Subsystem Vendor ID | |
| * +----------+--------------------------------+-------------------------------+ |
| * | 30 | Expansion ROM base address | |
| * +----------+----------------------------------------------------------------+ |
| * | 34 | Reserved |Capability Ptr| |
| * +----------+----------------------------------------------------------------+ |
| * | 38 | Reserved | |
| * +----------+---------------+----------------+----------------+--------------+ |
| * | 3C | Max Latency | Min Grant | Interrupt PIN |Interrupt Line| |
| * +---------------------------------------------------------------------------+ |
| * |
| * |
| * Header Type 0x01 (PCI-to-PCI bridge): |
| * |
| * +---------------------------------------------------------------------------+ |
| * | Register | Bits 31-24 | Bits 23-16 | Bits 15-8 | Bits 7-0 | |
| * +----------+----------------+----------------+---------------+--------------+ |
| * | 00 | Device ID | Vendor ID | |
| * +----------+---------------------------------+------------------------------+ |
| * | 04 | Status | Command | |
| * +----------+----------------+----------------+------------------------------+ |
| * | 08 | Class Code | Subclass | Revision ID | |
| * +----------+----------------+----------------+---------------+--------------+ |
| * | 0C | BIST | Header type | Latency Timer |CacheLine Size| |
| * +----------+----------------+----------------+---------------+--------------+ |
| * | 10 | Base address #0 (BAR0) | |
| * +----------+----------------------------------------------------------------+ |
| * | 14 | Base address #1 (BAR1) | |
| * +----------+----------------+----------------+----------------+-------------+ |
| * | 18 | Sec Latency | Subordinate Bus| Secondary Bus | Primary Bus | |
| * +----------+----------------+----------------+----------------+-------------+ |
| * | 1C | Secondary Status | I/O Limit | I/O Base | |
| * +----------+---------------------------------+----------------+-------------+ |
| * | 20 | Memory Limit | Memory Base | |
| * +----------+---------------------------------+------------------------------+ |
| * | 24 | Prefetchable Memory Limit | Prefetchable Memory Base | |
| * +----------+---------------------------------+------------------------------+ |
| * | 28 | Prefetchable Base Upper 32 Bits | |
| * +----------+----------------------------------------------------------------+ |
| * | 2C | Prefetchable Limit Upper 32 Bits | |
| * +----------+---------------------------------+------------------------------+ |
| * | 30 | I/O Limit Upper 16 Bits | I/O Base Upper 16 Bits | |
| * +----------+---------------------------------+----------------+-------------+ |
| * | 34 | Reserved |CapabilityPtr| |
| * +----------+--------------------------------------------------+-------------+ |
| * | 38 | Expansion ROM base address | |
| * +----------+----------------------------------------------------------------+ |
| * | 3C | Bridge Control | Interrupt PIN |InterruptLine| |
| * +---------------------------------------------------------------------------+ |
| */ |
| |
| union pci_dev { |
| |
| /* Header Type 0x00: standard device */ |
| |
| struct { |
| /* offset 00: */ |
| #ifdef _BIG_ENDIAN |
| u32_t device_id |
| : 16; /* device identification */ |
| u32_t vendor_id |
| : 16; /* vendor identification */ |
| #else |
| u32_t vendor_id |
| : 16; /* vendor identification */ |
| u32_t device_id |
| : 16; /* device identification */ |
| #endif |
| |
| /* offset 04: */ |
| |
| #ifdef _BIG_ENDIAN |
| u32_t status : 16; /* device status */ |
| u32_t command : 16; /* device command register */ |
| #else |
| u32_t command : 16; /* device command register */ |
| u32_t status : 16; /* device status */ |
| #endif |
| |
| /* offset 08: */ |
| #ifdef _BIG_ENDIAN |
| u32_t class : 8; |
| u32_t subclass : 8; |
| u32_t reg_if : 8; |
| u32_t revision : 8; |
| #else |
| u32_t revision : 8; |
| u32_t reg_if : 8; |
| u32_t subclass : 8; |
| u32_t class : 8; |
| #endif |
| |
| /* offset 0C: */ |
| #ifdef _BIG_ENDIAN |
| u32_t bist : 8; |
| u32_t hdr_type : 8; |
| u32_t latency_timer : 8; |
| u32_t cache_line : 8; |
| #else |
| u32_t cache_line : 8; |
| u32_t latency_timer : 8; |
| u32_t hdr_type : 8; |
| u32_t bist : 8; |
| #endif |
| |
| u32_t bar0; /* offset 10: base address register 0 */ |
| u32_t bar1; /* offset 14: base address register 0 */ |
| u32_t bar2; /* offset 18: base address register 0 */ |
| u32_t bar3; /* offset 1C: base address register 0 */ |
| u32_t bar4; /* offset 20: base address register 0 */ |
| u32_t bar5; /* offset 24: base address register 0 */ |
| u32_t cardbus; /* offset 28: base address register 0 */ |
| |
| /* offset 2C: */ |
| #ifdef _BIG_ENDIAN |
| u32_t subsys_id |
| : 16; /* subsystem identifier */ |
| u32_t subvendor_id |
| : 16; /* subsystem vendor identifier */ |
| #else |
| u32_t subvendor_id |
| : 16; /* subsystem vendor identifier */ |
| u32_t subsys_id |
| : 16; /* subsystem identifier */ |
| #endif |
| |
| /* offset 30: */ |
| u32_t rom_address; |
| |
| /* offset 34: */ |
| |
| #ifdef _BIG_ENDIAN |
| u32_t reserved1 : 24; |
| u32_t capability_ptr : 8; |
| #else |
| u32_t capability_ptr : 8; |
| u32_t reserved1 : 24; |
| #endif |
| |
| u32_t reserved2; /* offset 38: */ |
| |
| /* offset 3C: */ |
| #ifdef _BIG_ENDIAN |
| u32_t max_latency : 8; |
| u32_t min_grant : 8; |
| u32_t interrupt_pin |
| : 8; /* interrupt pin assignment */ |
| u32_t interrupt_line |
| : 8; /* interrupt line assignment */ |
| #else |
| u32_t interrupt_line |
| : 8; /* interrupt line assignment */ |
| u32_t interrupt_pin |
| : 8; /* interrupt pin assignment */ |
| u32_t min_grant : 8; |
| u32_t max_latency : 8; |
| #endif |
| } field; |
| |
| /* Header Type 0x01: PCI-to-PCI bridge */ |
| |
| struct { |
| /* offset 00: */ |
| #ifdef _BIG_ENDIAN |
| u32_t device_id |
| : 16; /* device identification */ |
| u32_t vendor_id |
| : 16; /* vendor identification */ |
| #else |
| u32_t vendor_id |
| : 16; /* vendor identification */ |
| u32_t device_id |
| : 16; /* device identification */ |
| #endif |
| |
| /* offset 04: */ |
| #ifdef _BIG_ENDIAN |
| u32_t status : 16; /* device status */ |
| u32_t command |
| : 16; /* device command register */ |
| #else |
| u32_t command |
| : 16; /* device command register */ |
| u32_t status : 16; /* device status */ |
| #endif |
| |
| /* offset 08: */ |
| #ifdef _BIG_ENDIAN |
| u32_t class : 8; |
| u32_t subclass : 8; |
| u32_t reg_if : 8; |
| u32_t revision : 8; |
| #else |
| u32_t revision : 8; |
| u32_t reg_if : 8; |
| u32_t subclass : 8; |
| u32_t class : 8; |
| #endif |
| |
| /* offset 0C: */ |
| #ifdef _BIG_ENDIAN |
| u32_t bist : 8; |
| u32_t hdr_type : 8; |
| u32_t latency_timer : 8; |
| u32_t cache_line : 8; |
| #else |
| u32_t cache_line : 8; |
| u32_t latency_timer : 8; |
| u32_t hdr_type : 8; |
| u32_t bist : 8; |
| #endif |
| |
| u32_t bar0; /* offset 10: base address register 0 */ |
| u32_t bar1; /* offset 14: base address register 0 */ |
| |
| /* offset 18: */ |
| #ifdef _BIG_ENDIAN |
| u32_t secondary_latency : 8; |
| u32_t subord_bus : 8; |
| u32_t secondary_bus : 8; |
| u32_t primary_bus : 8; |
| #else |
| u32_t primary_bus : 8; |
| u32_t secondary_bus : 8; |
| u32_t subord_bus : 8; |
| u32_t secondary_latency : 8; |
| |
| #endif |
| |
| /* offset 1C: */ |
| #ifdef _BIG_ENDIAN |
| u32_t secondary_status : 16; |
| u32_t io_limit : 8; |
| u32_t io_base : 8; |
| #else |
| u32_t io_base : 8; |
| u32_t io_limit : 8; |
| u32_t secondary_status : 16; |
| #endif |
| |
| /* offset 20: */ |
| #ifdef _BIG_ENDIAN |
| u32_t mem_limit : 16; |
| u32_t mem_base : 16; |
| #else |
| u32_t mem_base : 16; |
| u32_t mem_limit : 16; |
| #endif |
| |
| /* offset 24: */ |
| #ifdef _BIG_ENDIAN |
| u32_t pre_mem_limit : 16; |
| u32_t pre_mem_base : 16; |
| #else |
| u32_t pre_mem_base : 16; |
| u32_t pre_mem_limit : 16; |
| #endif |
| |
| /* offset 28: */ |
| u32_t pre_mem_base_upper; |
| |
| /* offset 2C: */ |
| u32_t pre_mem_limit_upper; |
| |
| /* offset 30: */ |
| #ifdef _BIG_ENDIAN |
| u32_t io_limit_upper : 16; |
| u32_t io_base_upper : 16; |
| #else |
| u32_t io_base_upper : 16; |
| u32_t io_limit_upper : 16; |
| #endif |
| |
| /* offset 34: */ |
| #ifdef _BIG_ENDIAN |
| u32_t reserved : 24; |
| u32_t capability_ptr : 8; |
| #else |
| u32_t capability_ptr : 8; |
| u32_t reserved : 24; |
| #endif |
| |
| /* offset 38: */ |
| u32_t rom_address; |
| |
| /* offset 3C: */ |
| #ifdef _BIG_ENDIAN |
| u32_t bridge_control : 16; |
| u32_t interrupt_pin |
| : 8; /* interrupt pin assignment */ |
| u32_t interrupt_line |
| : 8; /* interrupt line assignment */ |
| #else |
| u32_t interrupt_line |
| : 8; /* interrupt line assignment */ |
| u32_t interrupt_pin |
| : 8; /* interrupt pin assignment */ |
| u32_t bridge_control : 16; |
| #endif |
| |
| } bridge_field; |
| |
| /* direct access to each word in the PCI header */ |
| |
| struct { |
| u32_t word0; /* word 0: offset 00 */ |
| u32_t word1; /* word 1: offset 04 */ |
| u32_t word2; /* word 2: offset 08 */ |
| u32_t word3; /* word 3: offset 0C */ |
| u32_t word4; /* word 4: offset 10 */ |
| u32_t word5; /* word 5: offset 14 */ |
| u32_t word6; /* word 6: offset 18 */ |
| u32_t word7; /* word 7: offset 1C */ |
| u32_t word8; /* word 8: offset 20 */ |
| u32_t word9; /* word 9: offset 24 */ |
| u32_t word10; /* word 10: offset 28 */ |
| u32_t word11; /* word 11: offset 2C */ |
| u32_t word12; /* word 12: offset 30 */ |
| u32_t word13; /* word 13: offset 34 */ |
| u32_t word14; /* word 14: offset 38 */ |
| u32_t word15; /* word 15: offset 3C */ |
| } word; |
| |
| struct { |
| /* array of words for the header */ |
| u32_t word[PCI_HEADER_WORDS]; |
| } words; |
| |
| }; |
| |
| /* |
| * Generic Capability register set header: |
| * |
| * +---------------------------------------------------------------------------+ |
| * | Register | Bits 31-24 | Bits 23-16 | Bits 15-8 | Bits 7-0 | |
| * +----------+----------------+----------------+---------------+--------------+ |
| * | 00 | Capability specific data | Next Pointer | Cap ID | |
| * +---------------------------------------------------------------------------+ |
| */ |
| |
| union pci_cap_hdr { |
| struct { |
| /* offset 00: */ |
| u32_t id : 8; /* capability ID */ |
| u32_t next_ptr |
| : 8; /* pointer to next capability */ |
| u32_t feature |
| : 16; /* capability specific field */ |
| } field; |
| |
| u32_t word; /* array of words for the header */ |
| } pci_cap_hdr_t; |
| |
| union pcie_cap_hdr { |
| struct { |
| /* offset 00: */ |
| u32_t id : 16; /* capability ID */ |
| u32_t version : 4; /* version */ |
| u32_t next_ptr |
| : 12; /* pointer to next capability */ |
| } field; |
| |
| u32_t word; /* array of words for the header */ |
| }; |
| |
| /* |
| * MSI Capability register set (32-bit): |
| * |
| * +---------------------------------------------------------------------------+ |
| * |Register| Bits 31-24 | Bits 23-16 | Bits 15-8 | Bits 7-0 | |
| * +--------+----------------+----------------+----------------+---------------+ |
| * | 00 | Message Control Register | Next Pointer | Cap ID | |
| * +--------+---------------------------------+----------------+---------------+ |
| * | 04 | Message Address Register 0 0 | |
| * +--------+---------------------------------+--------------------------------+ |
| * | 0C | | Message Data Register | |
| * +---------------------------------------------------------------------------+ |
| * |
| * MSI Capability register set (64-bit): |
| * |
| * +---------------------------------------------------------------------------+ |
| * |Register| Bits 31-24 | Bits 23-16 | Bits 15-8 | Bits 7-0 | |
| * +--------+----------------+----------------+----------------+---------------+ |
| * | 00 | Message Control Register | Next Pointer | Cap ID | |
| * +--------+---------------------------------+----------------+---------------+ |
| * | 04 | Least-Significant 32-bits of Message Address Register 0 0 | |
| * +--------+--------------------------------------------------+---------------+ |
| * | 08 | Most-Significant 32-bits of Message Address Register | |
| * +--------+---------------------------------+--------------------------------+ |
| * | 0C | | Message Data Register | |
| * +---------------------------------------------------------------------------+ |
| */ |
| |
| struct _pci_msi_hdr { |
| /* common MSI header */ |
| union { |
| struct { |
| /* offset 00: */ |
| u32_t id : 8; /* capability ID */ |
| u32_t next_ptr : 8; /* pointer to next capability */ |
| u32_t enabled : 1; /* MSI enabled */ |
| u32_t msg_req : 3; /* requested message count */ |
| u32_t msg_grant : 3; /* granted message count */ |
| u32_t is_64_bit : 1; /* 64-bit capable */ |
| u32_t reserved : 8; /* */ |
| } msi_cap; |
| |
| struct { |
| /* offset 00: */ |
| u32_t id : 8; /* capability ID */ |
| u32_t next_ptr : 8; /* pointer to next capability */ |
| u32_t table_size : 11; /* MSI-x table size */ |
| u32_t reserved : 3; /* */ |
| u32_t func_mask : 1; /* 1 for vectors masked */ |
| u32_t enabled : 1; /* MSI-x enabled */ |
| } msix_cap; |
| } cap; |
| |
| union { |
| /* 32-bit MSI header */ |
| struct { |
| /* offset 04: */ |
| u32_t addr; /* message address register */ |
| /* offset 08 */ |
| u32_t data : 16; /* message data register */ |
| u32_t spare : 16; /* */ |
| } regs32; |
| /* 64-bit MSI header */ |
| struct { |
| /* offset 04: */ |
| u32_t addr_low; /* message address register |
| * (lower) |
| */ |
| /* offset 08: */ |
| u32_t addr_high; /* message address register |
| * (upper) |
| */ |
| /* offset 0C: */ |
| u32_t data : 16; /* message data register */ |
| u32_t spare : 16; /* */ |
| } regs64; |
| } regs; |
| }; |
| |
| union pci_msi_hdr { |
| struct _pci_msi_hdr field; /* MSI header fields */ |
| u32_t word[4]; /* array of words for the header */ |
| }; |
| |
| /* |
| * number of pci controllers; initialized to 0 until the controllers have been |
| * created |
| */ |
| extern u32_t pci_controller_cnt; |
| |
| struct pci_msix_table { |
| u32_t msg_addr; |
| u32_t msg_addr_high; |
| u32_t msg_data; |
| u32_t vec_ctrl; |
| }; |
| |
| struct pci_msix_entry { |
| u32_t vector; /* guest to write a vector */ |
| u16_t entry; /* driver to specify entry, guest OS writes */ |
| }; |
| |
| struct pci_msix_info { |
| u32_t bus_no; |
| u32_t dev_no; |
| u32_t func_no; |
| u32_t msix_vec; |
| }; |
| |
| /* manager interface API */ |
| |
| extern void pci_read(u32_t controller, |
| union pci_addr_reg addr, |
| u32_t size, |
| u32_t *data); |
| extern void pci_write(u32_t controller, |
| union pci_addr_reg addr, |
| u32_t size, |
| u32_t data); |
| |
| extern void pci_header_get(u32_t controller, |
| union pci_addr_reg pci_ctrl_addr, |
| union pci_dev *pci_dev_header); |
| |
| /* General PCI configuration access routines */ |
| |
| extern void pci_config_out_long(u32_t bus, /* bus number */ |
| u32_t dev, /* device number */ |
| u32_t func, /* function number */ |
| u32_t offset, /* offset into the configuration |
| * space |
| */ |
| u32_t data /* data written to the offset */ |
| ); |
| |
| extern void pci_config_out_word(u32_t bus, /* bus number */ |
| u32_t dev, /* device number */ |
| u32_t func, /* function number */ |
| u32_t offset, /* offset into the configuration |
| * space |
| */ |
| u16_t data /* data written to the offset */ |
| ); |
| |
| extern void pci_config_out_byte(u32_t bus, /* bus number */ |
| u32_t dev, /* device number */ |
| u32_t func, /* function number */ |
| u32_t offset, /* offset into the configuration |
| * space |
| */ |
| u8_t data /* data written to the offset */ |
| ); |
| |
| extern void pci_config_in_long(u32_t bus, /* bus number */ |
| u32_t dev, /* device number */ |
| u32_t func, /* function number */ |
| u32_t offset, /* offset into the configuration |
| * space |
| */ |
| u32_t *data /* return value address */ |
| ); |
| |
| extern void pci_config_in_word(u32_t bus, /* bus number */ |
| u32_t dev, /* device number */ |
| u32_t func, /* function number */ |
| u32_t offset, /* offset into the configuration |
| * space |
| */ |
| u16_t *data /* return value address */ |
| ); |
| |
| extern void pci_config_in_byte(u32_t bus, /* bus number */ |
| u32_t dev, /* device number */ |
| u32_t func, /* function number */ |
| u32_t offset, /* offset into the configuration |
| * space |
| */ |
| u8_t *data /* return value address */ |
| ); |
| |
| extern int pci_config_ext_cap_ptr_find( |
| u8_t ext_cap_find_id, /* Extended capabilities ID to search for */ |
| u32_t bus, /* PCI bus number */ |
| u32_t device, /* PCI device number */ |
| u32_t function, /* PCI function number */ |
| u8_t *p_offset /* returned config space offset */ |
| ); |
| |
| #endif /* _ASMLANGUAGE */ |
| |
| #define PCI_CMD 4 /* command register */ |
| |
| /* PCI command bits */ |
| |
| #define PCI_CMD_IO_ENABLE 0x0001 /* IO access enable */ |
| #define PCI_CMD_MEM_ENABLE 0x0002 /* memory access enable */ |
| #define PCI_CMD_MASTER_ENABLE 0x0004 /* bus master enable */ |
| #define PCI_CMD_MON_ENABLE 0x0008 /* monitor special cycles enable */ |
| #define PCI_CMD_WI_ENABLE 0x0010 /* write and invalidate enable */ |
| #define PCI_CMD_SNOOP_ENABLE 0x0020 /* palette snoop enable */ |
| #define PCI_CMD_PERR_ENABLE 0x0040 /* parity error enable */ |
| #define PCI_CMD_WC_ENABLE 0x0080 /* wait cycle enable */ |
| #define PCI_CMD_SERR_ENABLE 0x0100 /* system error enable */ |
| #define PCI_CMD_FBTB_ENABLE 0x0200 /* fast back to back enable */ |
| #define PCI_CMD_INTX_DISABLE 0x0400 /* INTx disable */ |
| |
| /* PCI status bits */ |
| |
| #define PCI_STATUS_NEW_CAP 0x0010 |
| #define PCI_STATUS_66_MHZ 0x0020 |
| #define PCI_STATUS_UDF 0x0040 |
| #define PCI_STATUS_FAST_BB 0x0080 |
| #define PCI_STATUS_DATA_PARITY_ERR 0x0100 |
| #define PCI_STATUS_TARGET_ABORT_GEN 0x0800 |
| #define PCI_STATUS_TARGET_ABORT_RCV 0x1000 |
| #define PCI_STATUS_MASTER_ABORT_RCV 0x2000 |
| #define PCI_STATUS_ASSERT_SERR 0x4000 |
| #define PCI_STATUS_PARITY_ERROR 0x8000 |
| |
| /* Standard device Type 0 configuration register offsets */ |
| /* Note that only modulo-4 addresses are written to the address register */ |
| |
| #define PCI_CFG_VENDOR_ID 0x00 |
| #define PCI_CFG_DEVICE_ID 0x02 |
| #define PCI_CFG_COMMAND 0x04 |
| #define PCI_CFG_STATUS 0x06 |
| #define PCI_CFG_REVISION 0x08 |
| #define PCI_CFG_PROGRAMMING_IF 0x09 |
| #define PCI_CFG_SUBCLASS 0x0a |
| #define PCI_CFG_CLASS 0x0b |
| #define PCI_CFG_CACHE_LINE_SIZE 0x0c |
| #define PCI_CFG_LATENCY_TIMER 0x0d |
| #define PCI_CFG_HEADER_TYPE 0x0e |
| #define PCI_CFG_BIST 0x0f |
| #define PCI_CFG_BASE_ADDRESS_0 0x10 |
| #define PCI_CFG_BASE_ADDRESS_1 0x14 |
| #define PCI_CFG_BASE_ADDRESS_2 0x18 |
| #define PCI_CFG_BASE_ADDRESS_3 0x1c |
| #define PCI_CFG_BASE_ADDRESS_4 0x20 |
| #define PCI_CFG_BASE_ADDRESS_5 0x24 |
| #define PCI_CFG_CIS 0x28 |
| #define PCI_CFG_SUB_VENDER_ID 0x2c |
| #define PCI_CFG_SUB_SYSTEM_ID 0x2e |
| #define PCI_CFG_EXPANSION_ROM 0x30 |
| #define PCI_CFG_CAP_PTR 0x34 |
| #define PCI_CFG_RESERVED_0 0x35 |
| #define PCI_CFG_RESERVED_1 0x38 |
| #define PCI_CFG_DEV_INT_LINE 0x3c |
| #define PCI_CFG_DEV_INT_PIN 0x3d |
| #define PCI_CFG_MIN_GRANT 0x3e |
| #define PCI_CFG_MAX_LATENCY 0x3f |
| #define PCI_CFG_SPECIAL_USE 0x41 |
| #define PCI_CFG_MODE 0x43 |
| #define PCI_NUM_BARS 6 /* Number of BARs */ |
| |
| /* PCI base address mask bits */ |
| |
| #define PCI_MEMBASE_MASK ~0xf /* mask for memory base address */ |
| #define PCI_IOBASE_MASK ~0x3 /* mask for IO base address */ |
| #define PCI_BASE_IO 0x1 /* IO space indicator */ |
| #define PCI_BASE_BELOW_1M 0x2 /* memory locate below 1MB */ |
| #define PCI_BASE_IN_64BITS 0x4 /* memory locate anywhere in 64 bits */ |
| #define PCI_BASE_PREFETCH 0x8 /* memory prefetchable */ |
| |
| /* Base Address Register Memory/IO Attribute bits */ |
| |
| #define PCI_BAR_MEM_TYPE_MASK (0x06) |
| #define PCI_BAR_MEM_ADDR32 (0x00) |
| #define PCI_BAR_MEM_BELOW_1MB (0x02) |
| #define PCI_BAR_MEM_ADDR64 (0x04) |
| #define PCI_BAR_MEM_RESERVED (0x06) |
| |
| #define PCI_BAR_MEM_PREF_MASK (0x08) |
| #define PCI_BAR_MEM_PREFETCH (0x08) |
| #define PCI_BAR_MEM_NON_PREF (0x00) |
| |
| #define PCI_BAR_ALL_MASK \ |
| (PCI_BAR_SPACE_MASK | PCI_BAR_MEM_TYPE_MASK | PCI_BAR_MEM_PREF_MASK) |
| |
| #define PCI_BAR_SPACE_MASK (0x01) |
| #define PCI_BAR_SPACE_IO (0x01) |
| #define PCI_BAR_SPACE_MEM (0x00) |
| #define PCI_BAR_SPACE_NONE PCI_BAR_MEM_RESERVED |
| |
| #define PCI_BAR_NONE 0 |
| #define PCI_BAR_IO 0x1 |
| #define PCI_BAR_MEM 0x2 |
| |
| #define PCI_EXP_2_CAP 0x24 /* Dev 2 cap */ |
| #define PCI_EXP_2_CTRL 0x28 /* Dev 2 control */ |
| #define PCI_EXP_2_STATUS 0x2a /* Dev 2 status */ |
| #define PCI_EXP_2_LINK_CAP 0x2c /* Dev 2 Link cap */ |
| #define PCI_EXP_2_LINK_CTRL 0x30 /* Dev 2 Link control */ |
| #define PCI_EXP_2_LINK_STATUS 0x32 /* Dev 2 Link status */ |
| #define PCI_EXP_2_SLOT_CAP 0x34 /* Dev 2 Slot cap */ |
| #define PCI_EXP_2_SLOT_CTRL 0x38 /* Dev 2 slot control */ |
| #define PCI_EXP_2_SLOT_STATUS 0x3a /* Dev 2 slot status */ |
| |
| #define PCI_CFG_SPACE_SIZE 0x100 |
| #define PCIE_CFG_SPACE_SIZE 0x1000 |
| #define PCIE_CFG_SPACE_TOTAL ((PCIE_CFG_SPACE_SIZE - PCI_CFG_SPACE_SIZE) / 4) |
| |
| /* Extended Capabilities (PCI-X 2.0 and Express) */ |
| #define PCIE_EXT_CAP_ID(header) (header & 0x0000ffff) |
| #define PCIE_EXT_CAP_VER(header) ((header >> 16) & 0xf) |
| #define PCIE_EXT_CAP_NEXT(header) ((header >> 20) & 0xffc) |
| |
| #define PCIE_EXT_CAP_ID_ERR 1 |
| #define PCIE_EXT_CAP_ID_VC 2 |
| #define PCIE_EXT_CAP_ID_DSN 3 |
| #define PCIE_EXT_CAP_ID_PWR 4 |
| #define PCIE_EXT_CAP_ID_ARI 14 |
| #define PCIE_EXT_CAP_ID_ATS 15 |
| #define PCIE_EXT_CAP_ID_SRIOV 16 |
| |
| /* Advanced Error Reporting */ |
| |
| #define PCIE_ERR_UNCOR_STATUS 4 /* Uncorrectable Error Status*/ |
| #define PCIE_ERR_UNC_TRAIN 0x00000001 /* Training */ |
| #define PCIE_ERR_UNC_DLP 0x00000010 /* Data Link Protocol */ |
| #define PCIE_ERR_UNC_POISON_TLP 0x00001000 /* Poisoned TLP */ |
| #define PCIE_ERR_UNC_FCP 0x00002000 /* Flow Control Protocol */ |
| #define PCIE_ERR_UNC_COMP_TIME 0x00004000 /* Completion Timeout */ |
| #define PCIE_ERR_UNC_COMP_ABORT 0x00008000 /* Completer Abort */ |
| #define PCIE_ERR_UNC_UNX_COMP 0x00010000 /* Unexpected Completion */ |
| #define PCIE_ERR_UNC_RX_OVER 0x00020000 /* Receiver Overflow */ |
| #define PCIE_ERR_UNC_MALF_TLP 0x00040000 /* Malformed TLP */ |
| #define PCIE_ERR_UNC_ECRC 0x00080000 /* ECRC Error Status */ |
| #define PCIE_ERR_UNC_UNSUP 0x00100000 /* Unsupported Request */ |
| #define PCIE_ERR_UNCOR_MASK 8 /* Uncorrectable Error Mask */ |
| /* Same bits as above */ |
| #define PCIE_ERR_UNCOR_SEVER 12 /* Uncorrectable Erro Sev. */ |
| /* Same bits as above */ |
| #define PCIE_ERR_COR_STATUS 16 /* Correctable Error Status */ |
| #define PCIE_ERR_COR_RCVR 0x00000001 /* Receiver Error Status */ |
| #define PCIE_ERR_COR_BAD_TLP 0x00000040 /* Bad TLP Status */ |
| #define PCIE_ERR_COR_BAD_DLLP 0x00000080 /* Bad DLLP Status */ |
| #define PCIE_ERR_COR_REP_ROLL 0x00000100 /* REPLAY_NUM Rollover */ |
| #define PCIE_ERR_COR_REP_TIMER 0x00001000 /* Replay Timer Timeout */ |
| #define PCIE_ERR_COR_MASK 20 /* Correctable Error Mask */ |
| /* Same bits as above */ |
| #define PCIE_ERR_CAP 24 /* Advanced Error Cap */ |
| #define PCIE_ERR_CAP_FEP(x) ((x) & 31) /* First Error Pointer */ |
| #define PCIE_ERR_CAP_ECRC_GENC 0x00000020 /* ECRC Generation Capable */ |
| #define PCIE_ERR_CAP_ECRC_GENE 0x00000040 /* ECRC Generation Enable */ |
| #define PCIE_ERR_CAP_ECRC_CHKC 0x00000080 /* ECRC Check Capable */ |
| #define PCIE_ERR_CAP_ECRC_CHKE 0x00000100 /* ECRC Check Enable */ |
| #define PCIE_ERR_HEADER_LOG 28 /* Header Log Reg (16 bytes) */ |
| #define PCIE_ERR_ROOT_COMMAND 44 /* Root Error Command */ |
| #define PCIE_ERR_ROOT_CMD_COR_EN 0x00000001 /* Correctable Err Report */ |
| #define PCIE_ERR_ROOT_CMD_NONFATAL_EN 0x00000002 /* Non-fatal Err Reporting */ |
| #define PCIE_ERR_ROOT_CMD_FATAL_EN 0x00000004 /* Fatal Err Reporting En */ |
| #define PCIE_ERR_ROOT_STATUS 48 |
| #define PCIE_ERR_ROOT_COR_RCV 0x00000001 /* ERR_COR Received */ |
| #define PCIE_ERR_ROOT_MULTI_COR_RCV 0x00000002 /* Multi ERR_COR Received */ |
| #define PCIE_ERR_ROOT_UNCOR_RCV 0x00000004 /* ERR_FATAL/NONFATAL Rcv */ |
| #define PCIE_ERR_ROOT_MULTI_UNCOR_RCV 0x00000008 /* Multi ERR_FATAL/NONFATAL*/ |
| #define PCIE_ERR_ROOT_FIRST_FATAL 0x00000010 /* First Fatal */ |
| #define PCIE_ERR_ROOT_NONFATAL_RCV 0x00000020 /* Non-Fatal Received */ |
| #define PCIE_ERR_ROOT_FATAL_RCV 0x00000040 /* Fatal Received */ |
| #define PCIE_ERR_ROOT_COR_SRC 52 |
| #define PCIE_ERR_ROOT_SRC 54 |
| |
| /* Virtual Channel */ |
| |
| #define PCIE_VC_PORT_REG1 4 |
| #define PCIE_VC_PORT_REG2 8 |
| #define PCIE_VC_PORT_CTRL 12 |
| #define PCIE_VC_PORT_STATUS 14 |
| #define PCIE_VC_RES_CAP 16 |
| #define PCIE_VC_RES_CTRL 20 |
| #define PCIE_VC_RES_STATUS 26 |
| |
| /* Power Budgeting */ |
| |
| #define PCIE_PWR_DSR 4 /* Data Select Register */ |
| #define PCIE_PWR_DATA 8 /* Data Register */ |
| #define PCIE_PWR_DATA_BASE(x) ((x) & 0xff) /* Base Power */ |
| #define PCIE_PWR_DATA_SCALE(x) (((x) >> 8) & 3) /* Data Scale */ |
| #define PCIE_PWR_DATA_PM_SUB(x) (((x) >> 10) & 7) /* PM Sub State */ |
| #define PCIE_PWR_DATA_PM_STATE(x) (((x) >> 13) & 3) /* PM State */ |
| #define PCIE_PWR_DATA_TYPE(x) (((x) >> 15) & 7) /* Type */ |
| #define PCIE_PWR_DATA_RAIL(x) (((x) >> 18) & 7) /* Power Rail */ |
| #define PCIE_PWR_CAP 12 /* Capability */ |
| #define PCIE_PWR_CAP_BUDGET(x) ((x) & 1) /* Included in sys budget */ |
| |
| /* |
| * Hypertransport sub capability types |
| * |
| * Unfortunately there are both 3 bit and 5 bit capability types defined |
| * in the HT spec, catering for that is a little messy. You probably don't |
| * want to use these directly, just use pci_find_ht_capability() and it |
| * will do the right thing for you. |
| */ |
| |
| #define HT_3BIT_CAP_MASK 0xE0 |
| #define HT_CAPTYPE_SLAVE 0x00 /* Slave/Primary link configuration */ |
| #define HT_CAPTYPE_HOST 0x20 /* Host/Secondary link configuration */ |
| |
| #define HT_5BIT_CAP_MASK 0xF8 |
| #define HT_CAPTYPE_IRQ 0x80 /* IRQ Configuration */ |
| #define HT_CAPTYPE_REMAPPING_40 0xA0 /* 40 bit address remapping */ |
| #define HT_CAPTYPE_REMAPPING_64 0xA2 /* 64 bit address remapping */ |
| #define HT_CAPTYPE_UNITID_CLUMP 0x90 /* Unit ID clumping */ |
| #define HT_CAPTYPE_EXTCONF 0x98 /* Extended Configuration Space Access*/ |
| #define HT_CAPTYPE_MSI_MAPPING 0xA8 /* MSI Mapping Capability */ |
| #define HT_MSI_FLAGS 0x02 /* Offset to flags */ |
| #define HT_MSI_FLAGS_ENABLE 0x1 /* Mapping enable */ |
| #define HT_MSI_FLAGS_FIXED 0x2 /* Fixed mapping only */ |
| /* Fixed addr */ |
| #define HT_MSI_FIXED_ADDR 0x00000000FEE00000ULL |
| #define HT_MSI_ADDR_LO 0x04 /* Offset to low addr bits */ |
| /* Low address bit mask */ |
| #define HT_MSI_ADDR_LO_MASK 0xFFF00000 |
| #define HT_MSI_ADDR_HI 0x08 /* Offset to high addr bits */ |
| #define HT_CAPTYPE_DIRECT_ROUTE 0xB0 /* Direct routing configuration */ |
| #define HT_CAPTYPE_VCSET 0xB8 /* Virtual Channel configuration */ |
| #define HT_CAPTYPE_ERROR_RETRY 0xC0 /* Retry on error configuration */ |
| #define HT_CAPTYPE_GEN3 0xD0 /* Generation 3 hypertransport config */ |
| #define HT_CAPTYPE_PM 0xE0 /* Hypertransport powermanagement cfg */ |
| |
| /* Alternative Routing-ID Interpretation */ |
| #define PCIE_ARI_CAP 0x04 /* ARI Capability Register */ |
| #define PCIE_ARI_CAP_MFVC 0x0001 /* MFVC Function Groups Capability */ |
| #define PCIE_ARI_CAP_ACS 0x0002 /* ACS Function Groups Capability */ |
| /* Next Function Number */ |
| #define PCIE_ARI_CAP_NFN(x) (((x) >> 8) & 0xff) |
| #define PCIE_ARI_CTRL 0x06 /* ARI Control Register */ |
| #define PCIE_ARI_CTRL_MFVC 0x0001 /* MFVC Function Groups Enable */ |
| #define PCIE_ARI_CTRL_ACS 0x0002 /* ACS Function Groups Enable */ |
| /* Function Group */ |
| #define PCIE_ARI_CTRL_FG(x) (((x) >> 4) & 7) |
| |
| /* Address Translation Service */ |
| #define PCIE_ATS_CAP 0x04 /* ATS Capability Register */ |
| /* Invalidate Queue Depth */ |
| #define PCIE_ATS_CAP_QDEP(x) ((x) & 0x1f) |
| #define PCIE_ATS_MAX_QDEP 32 /* Max Invalidate Queue Depth */ |
| #define PCIE_ATS_CTRL 0x06 /* ATS Control Register */ |
| #define PCIE_ATS_CTRL_ENABLE 0x8000 /* ATS Enable */ |
| /* Smallest Translation Unit */ |
| #define PCIE_ATS_CTRL_STU(x) ((x) & 0x1f) |
| #define PCIE_ATS_MIN_STU 12 /* shift of minimum STU block */ |
| |
| /* Single Root I/O Virtualization */ |
| #define PCIE_SRIOV_CAP 0x04 /* SR-IOV Capabilities */ |
| #define PCIE_SRIOV_CAP_VFM 0x01 /* VF Migration Capable */ |
| /* Interrupt Message Number */ |
| #define PCIE_SRIOV_CAP_INTR(x) ((x) >> 21) |
| #define PCIE_SRIOV_CTRL 0x08 /* SR-IOV Control */ |
| #define PCIE_SRIOV_CTRL_VFE 0x01 /* VF Enable */ |
| #define PCIE_SRIOV_CTRL_VFM 0x02 /* VF Migration Enable */ |
| #define PCIE_SRIOV_CTRL_INTR 0x04 /* VF Migration Interrupt Enable */ |
| #define PCIE_SRIOV_CTRL_MSE 0x08 /* VF Memory Space Enable */ |
| #define PCIE_SRIOV_CTRL_ARI 0x10 /* ARI Capable Hierarchy */ |
| #define PCIE_SRIOV_STATUS 0x0a /* SR-IOV Status */ |
| #define PCIE_SRIOV_STATUS_VFM 0x01 /* VF Migration Status */ |
| #define PCIE_SRIOV_INITIAL_VF 0x0c /* Initial VFs */ |
| #define PCIE_SRIOV_TOTAL_VF 0x0e /* Total VFs */ |
| #define PCIE_SRIOV_NUM_VF 0x10 /* Number of VFs */ |
| #define PCIE_SRIOV_FUNC_LINK 0x12 /* Function Dependency Link */ |
| #define PCIE_SRIOV_VF_OFFSET 0x14 /* First VF Offset */ |
| #define PCIE_SRIOV_VF_STRIDE 0x16 /* Following VF Stride */ |
| #define PCIE_SRIOV_VF_DID 0x1a /* VF Device ID */ |
| #define PCIE_SRIOV_SUP_PGSIZE 0x1c /* Supported Page Sizes */ |
| #define PCIE_SRIOV_SYS_PGSIZE 0x20 /* System Page Size */ |
| #define PCIE_SRIOV_BAR0 0x24 /* VF BAR0 */ |
| #define PCIE_SRIOV_BAR0_UPPER 0x28 /* VF BAR0 upper*/ |
| #define PCIE_SRIOV_BAR3 0x30 /* VF BAR3 */ |
| #define PCIE_SRIOV_BAR3_UPPER 0x34 /* VF BAR3 upper */ |
| |
| #define PCIE_SRIOV_NUM_BARS 6 /* Number of VF BARs */ |
| #define PCIE_SRIOV_VFM 0x3c /* VF Migration State Array Offset*/ |
| /* State BIR */ |
| #define PCIE_SRIOV_VFM_BIR(x) ((x) & 7) |
| /* State Offset */ |
| #define PCIE_SRIOV_VFM_OFFSET(x) ((x) & ~7) |
| #define PCIE_SRIOV_VFM_UA 0x0 /* Inactive.Unavailable */ |
| #define PCIE_SRIOV_VFM_MI 0x1 /* Dormant.MigrateIn */ |
| #define PCIE_SRIOV_VFM_MO 0x2 /* Active.MigrateOut */ |
| #define PCIE_SRIOV_VFM_AV 0x3 /* Active.Available */ |
| |
| /* Extended Capabilities (PCI-X 2.0 and Express) */ |
| |
| #define PCI_EXT_CAP_ID(header) (header & 0x0000ffff) |
| #define PCI_EXT_CAP_VER(header) ((header >> 16) & 0xf) |
| #define PCI_EXT_CAP_NEXT(header) ((header >> 20) & 0xffc) |
| |
| #define PCI_MSIX_ENTRY_SIZE 16 |
| #define PCI_MSIX_ENTRY_LOWER_ADDR 0 |
| #define PCI_MSIX_ENTRY_UPPER_ADDR 4 |
| #define PCI_MSIX_ENTRY_DATA 8 |
| #define PCI_MSIX_ENTRY_VECTOR_CTRL 12 |
| #define PCI_MSIX_ENTRY_VECTOR_MASKED 0x1 |
| |
| /* PCI-to-PCI bridge Type 1 configuration register offsets */ |
| /* Note that only modulo-4 addresses are written to the address register */ |
| |
| #define PCI_CFG_PRIMARY_BUS 0x18 |
| #define PCI_CFG_SECONDARY_BUS 0x19 |
| #define PCI_CFG_SUBORDINATE_BUS 0x1a |
| #define PCI_CFG_SEC_LATENCY 0x1b |
| #define PCI_CFG_IO_BASE 0x1c |
| #define PCI_CFG_IO_LIMIT 0x1d |
| #define PCI_CFG_SEC_STATUS 0x1e |
| #define PCI_CFG_MEM_BASE 0x20 |
| #define PCI_CFG_MEM_LIMIT 0x22 |
| #define PCI_CFG_PRE_MEM_BASE 0x24 |
| #define PCI_CFG_PRE_MEM_LIMIT 0x26 |
| #define PCI_CFG_PRE_MEM_BASE_U 0x28 |
| #define PCI_CFG_PRE_MEM_LIMIT_U 0x2c |
| #define PCI_CFG_IO_BASE_U 0x30 |
| #define PCI_CFG_IO_LIMIT_U 0x32 |
| #define PCI_CFG_ROM_BASE 0x38 |
| #define PCI_CFG_BRG_INT_LINE 0x3c |
| #define PCI_CFG_BRG_INT_PIN 0x3d |
| #define PCI_CFG_BRIDGE_CONTROL 0x3e |
| |
| /* PCI-to-CardBus bridge Type 2 configuration register offsets */ |
| |
| #define PCI_CFG_CB_CAP_PTR 0x14 |
| /* 0x15 - reserved */ |
| #define PCI_CFG_CB_SEC_STATUS 0x16 |
| #define PCI_CFG_CB_PRIMARY_BUS 0x18 /* PCI bus no. */ |
| #define PCI_CFG_CB_BUS 0x19 /* CardBus bus no */ |
| #define PCI_CFG_CB_SUBORDINATE_BUS 0x1a /* Subordinate bus no. */ |
| #define PCI_CFG_CB_LATENCY_TIMER 0x1b /* CardBus latency timer */ |
| #define PCI_CFG_CB_MEM_BASE_0 0x1c |
| #define PCI_CFG_CB_MEM_LIMIT_0 0x20 |
| #define PCI_CFG_CB_MEM_BASE_1 0x24 |
| #define PCI_CFG_CB_MEM_LIMIT_1 0x28 |
| #define PCI_CFG_CB_IO_BASE_0 0x2c |
| #define PCI_CFG_CB_IO_BASE_0_HI 0x2e |
| #define PCI_CFG_CB_IO_LIMIT_0 0x30 |
| #define PCI_CFG_CB_IO_LIMIT_0_HI 0x32 |
| #define PCI_CFG_CB_IO_BASE_1 0x34 |
| #define PCI_CFG_CB_IO_BASE_1_HI 0x36 |
| #define PCI_CFG_CB_IO_LIMIT_1 0x38 |
| #define PCI_CFG_CB_IO_LIMIT_1_HI 0x3a |
| #define PCI_CFG_CB_BRIDGE_CONTROL 0x3e |
| #define PCI_CFG_CB_SUB_VENDOR_ID 0x40 |
| #define PCI_CFG_CB_SUB_SYSTEM_ID 0x42 |
| #define PCI_CFG_CB_16BIT_LEGACY 0x44 |
| /* 0x48 - 0x7f are reserved */ |
| |
| /* PCI Bridge Control Register (0x3E) bits */ |
| |
| #define PCI_CFG_PARITY_ERROR 0x01 /* Enable parity detection */ |
| #define PCI_CFG_SERR 0x02 /* SERR enable */ |
| #define PCI_CFG_ISA_ENABLE 0x04 /* ISA Disable - bit set = disable*/ |
| #define PCI_CFG_VGA_ENABLE 0x08 /* Enable VGA addresses */ |
| #define PCI_CFG_MASTER_ABORT 0x20 /* Signal master abort */ |
| #define PCI_CFG_SEC_BUS_RESET 0x40 /* secondary bus reset */ |
| #define PCI_CFG_FAST_BACK 0x80 /* FBB enabled on secondary */ |
| #define PCI_CFG_PRI_DIS_TO 0x100 /* Primary Discard Timeout: *2^10 PCI cycles */ |
| #define PCI_CFG_SEC_DIS_TO 0x200 /* 2ndary Discard Timeout: * 2^10 PCI cycles */ |
| #define PCI_CFG_DIS_TIMER_STAT 0x400 /* Discard Timer status */ |
| #define PCI_CFG_DIS_TIMER_ENABLE 0x800 /* Discard Timer enable */ |
| |
| /* Cardbus Bridge Control Register (0x3E) bits */ |
| |
| #define PCI_CFG_CB_PARITY_ERROR 0x01 /* Enable parity detection */ |
| #define PCI_CFG_CB_SERR 0x02 /* SERR enable */ |
| #define PCI_CFG_CB_ISA_ENABLE 0x04 /* ISA Disable - bit set = disable*/ |
| #define PCI_CFG_CB_VGA_ENABLE 0x08 /* Enable VGA addresses */ |
| #define PCI_CFG_CB_MASTER_ABORT 0x20 /* Signal master abort */ |
| #define PCI_CFG_CB_RESET 0x40 /* Cardbus reset */ |
| #define PCI_CFG_CB_16BIT_INT 0x80 /* Enable ints for 16-bit cards */ |
| #define PCI_CFG_CB_PREFETCH0 0x0100 /* Memory 0 prefetch enable */ |
| #define PCI_CFG_CB_PREFETCH1 0x0200 /* Memory 1 prefetch enable */ |
| #define PCI_CFG_CB_POST_WRITES 0x0400 /* Posted Writes */ |
| |
| /* Power Management registers */ |
| |
| #define PCI_PM_CTRL 4 /* PM control register */ |
| #define PCI_PM_CTRL_NO_RST 0x0008 /* No reset issued by d3-d0 */ |
| |
| #define PCI_PSTATE_MASK 0x0003 /* Power state bits */ |
| #define PCI_PSTATE_D0 0x0000 |
| #define PCI_PSTATE_D1 0x0001 |
| #define PCI_PSTATE_D2 0x0002 |
| #define PCI_PSTATE_D3_HOT 0x0003 |
| #define PCI_PSTATE_D3_COLD 0x0004 |
| |
| /* Advanced Features */ |
| |
| #define PCI_AF_CAP 3 |
| #define PCI_AF_CAP_TRPND 0x01 |
| #define PCI_AF_CAP_FLR 0x02 |
| #define PCI_AF_CTRL 4 |
| #define PCI_AF_CTRL_FLR 0x01 |
| #define PCI_AF_STATUS 5 |
| #define PCI_AF_STATUS_TRPND 0x01 |
| |
| /* CompactPCI Hot Swap Control & Status Register (HSCSR) defines */ |
| |
| #define PCI_HS_CSR_RSVD0 0x01 /* Reserved */ |
| #define PCI_HS_CSR_EIM 0x02 /* ENUM Interrupt Mask */ |
| #define PCI_HS_CSR_RSVD2 0x04 /* Reserved */ |
| #define PCI_HS_CSR_LOO 0x08 /* Blue LED On/Off */ |
| #define PCI_HS_CSR_RSVD4 0x10 /* Reserved */ |
| #define PCI_HS_CSR_RSVD5 0x20 /* Reserved */ |
| #define PCI_HS_CSR_EXT 0x40 /* ENUM Status - EXTract */ |
| #define PCI_HS_CSR_INS 0x80 /* ENUM Status - INSert */ |
| |
| /* PCI Standard Classifications */ |
| |
| /* |
| * PCI classifications are composed from the concatenation of four byte-size |
| * components: primary (base) class, sub-class, register interface, and |
| * revision ID. The following comprise the standard PCI classification |
| * definitions. |
| */ |
| |
| /* |
| * PCI Primary (Base) Class definitions for find by class function |
| * Classes 0x12 - 0xFE are reserved for future enhancements |
| */ |
| |
| #define PCI_CLASS_PRE_PCI20 0x00 |
| #define PCI_CLASS_MASS_STORAGE 0x01 |
| #define PCI_CLASS_NETWORK_CTLR 0x02 |
| #define PCI_CLASS_DISPLAY_CTLR 0x03 |
| #define PCI_CLASS_MMEDIA_DEVICE 0x04 |
| #define PCI_CLASS_MEM_CTLR 0x05 |
| #define PCI_CLASS_BRIDGE_CTLR 0x06 |
| #define PCI_CLASS_COMM_CTLR 0x07 |
| #define PCI_CLASS_BASE_PERIPH 0x08 |
| #define PCI_CLASS_INPUT_DEVICE 0x09 |
| #define PCI_CLASS_DOCK_DEVICE 0x0A |
| #define PCI_CLASS_PROCESSOR 0x0B |
| #define PCI_CLASS_SERIAL_BUS 0x0C |
| #define PCI_CLASS_WIRELESS 0x0D |
| #define PCI_CLASS_INTLGNT_IO 0x0E |
| #define PCI_CLASS_SAT_COMM 0x0F |
| #define PCI_CLASS_EN_DECRYPTION 0x10 |
| #define PCI_CLASS_DAQ_DSP 0x11 |
| #define PCI_CLASS_UNDEFINED 0xFF |
| |
| /* PCI Subclass definitions */ |
| |
| #define PCI_SUBCLASS_00 0x00 |
| #define PCI_SUBCLASS_01 0x01 |
| #define PCI_SUBCLASS_02 0x02 |
| #define PCI_SUBCLASS_03 0x03 |
| #define PCI_SUBCLASS_04 0x04 |
| #define PCI_SUBCLASS_05 0x05 |
| #define PCI_SUBCLASS_06 0x06 |
| #define PCI_SUBCLASS_07 0x07 |
| #define PCI_SUBCLASS_08 0x08 |
| #define PCI_SUBCLASS_09 0x09 |
| #define PCI_SUBCLASS_0A 0x0A |
| #define PCI_SUBCLASS_10 0x10 |
| #define PCI_SUBCLASS_11 0x11 |
| #define PCI_SUBCLASS_12 0x12 |
| #define PCI_SUBCLASS_20 0x20 |
| #define PCI_SUBCLASS_40 0x40 |
| #define PCI_SUBCLASS_80 0x80 |
| #define PCI_SUBCLASS_UNDEFINED 0xFF |
| |
| /* Base Class 00 are Rev 1.0 and are not defined here. */ |
| |
| /* Mass Storage subclasses - Base Class 01h */ |
| |
| #define PCI_SUBCLASS_MASS_SCSI (PCI_SUBCLASS_00) |
| #define PCI_SUBCLASS_MASS_IDE (PCI_SUBCLASS_01) |
| #define PCI_SUBCLASS_MASS_FLOPPY (PCI_SUBCLASS_02) |
| #define PCI_SUBCLASS_MASS_IPI (PCI_SUBCLASS_03) |
| #define PCI_SUBCLASS_MASS_RAID (PCI_SUBCLASS_04) |
| #define PCI_SUBCLASS_MASS_ATA (PCI_SUBCLASS_05) |
| #define PCI_REG_IF_ATA_SNGL 0x20 |
| #define PCI_REG_IF_ATA_CHND 0x30 |
| #define PCI_SUBCLASS_MASS_OTHER (PCI_SUBCLASS_80) |
| |
| /* Network subclasses - Base Class 02h */ |
| |
| #define PCI_SUBCLASS_NET_ETHERNET (PCI_SUBCLASS_00) |
| #define PCI_SUBCLASS_NET_TOKEN_RING (PCI_SUBCLASS_01) |
| #define PCI_SUBCLASS_NET_FDDI (PCI_SUBCLASS_02) |
| #define PCI_SUBCLASS_NET_ATM (PCI_SUBCLASS_03) |
| #define PCI_SUBCLASS_NET_ISDN (PCI_SUBCLASS_04) |
| #define PCI_SUBCLASS_NET_WFIP (PCI_SUBCLASS_05) |
| #define PCI_SUBCLASS_NET_PCMIG214 (PCI_SUBCLASS_06) |
| #define PCI_SUBCLASS_NET_OTHER (PCI_SUBCLASS_80) |
| |
| /* Display subclasses - Base Class 03h */ |
| |
| #define PCI_SUBCLASS_DISPLAY_VGA (PCI_SUBCLASS_00) |
| #define PCI_REG_IF_VGA_STD 0x00 |
| #define PCI_REG_IF_VGA_8514 0x01 |
| #define PCI_SUBCLASS_DISPLAY_XGA (PCI_SUBCLASS_01) |
| #define PCI_SUBCLASS_DISPLAY_3D (PCI_SUBCLASS_02) |
| #define PCI_SUBCLASS_DISPLAY_OTHER (PCI_SUBCLASS_80) |
| |
| /* Multimedia subclasses - Base Class 04h */ |
| |
| #define PCI_SUBCLASS_MMEDIA_VIDEO (PCI_SUBCLASS_00) |
| #define PCI_SUBCLASS_MMEDIA_AUDIO (PCI_SUBCLASS_01) |
| #define PCI_SUBCLASS_MMEDIA_PHONY (PCI_SUBCLASS_02) |
| #define PCI_SUBCLASS_MMEDIA_OTHER (PCI_SUBCLASS_80) |
| |
| /* Memory subclasses - Base Class 05h */ |
| |
| #define PCI_SUBCLASS_MEM_RAM (PCI_SUBCLASS_00) |
| #define PCI_SUBCLASS_MEM_FLASH (PCI_SUBCLASS_01) |
| #define PCI_SUBCLASS_MEM_OTHER (PCI_SUBCLASS_80) |
| |
| /* Bus Bridge Device subclasses - Base Class 06h */ |
| |
| #define PCI_SUBCLASS_HOST_PCI_BRIDGE (PCI_SUBCLASS_00) |
| #define PCI_SUBCLASS_ISA_BRIDGE (PCI_SUBCLASS_01) |
| #define PCI_SUBCLASS_EISA_BRIDGE (PCI_SUBCLASS_02) |
| #define PCI_SUBCLASS_MCA_BRIDGE (PCI_SUBCLASS_03) |
| #define PCI_SUBCLASS_P2P_BRIDGE (PCI_SUBCLASS_04) |
| #define PCI_REG_IF_P2P_STD 0x00 |
| #define PCI_REG_IF_P2P_SUB_DECODE 0x01 |
| #define PCI_SUBCLASS_PCMCIA_BRIDGE (PCI_SUBCLASS_05) |
| #define PCI_SUBCLASS_NUBUS_BRIDGE (PCI_SUBCLASS_06) |
| #define PCI_SUBCLASS_CARDBUS_BRIDGE (PCI_SUBCLASS_07) |
| #define PCI_SUBCLASS_RACEWAY_BRIDGE (PCI_SUBCLASS_08) |
| #define PCI_REG_IF_RACEWAY_XPARENT 0x00 |
| #define PCI_REG_IF_RACEWAY_END_PNT 0x01 |
| #define PCI_SUBCLASS_SEMI_XPARENT (PCI_SUBCLASS_09) |
| #define PCI_REG_IF_SEMI_XPARENT_PRI 0x40 |
| #define PCI_REG_IF_SEMI_XPARENT_SEC 0x80 |
| #define PCI_SUBCLASS_INFINI2PCI (PCI_SUBCLASS_0A) |
| #define PCI_SUBCLASS_OTHER_BRIDGE (PCI_SUBCLASS_80) |
| |
| /* Simple Communications Controller subclasses - Base Class 07h */ |
| |
| #define PCI_SUBCLASS_SCC_SERIAL (PCI_SUBCLASS_00) |
| #define PCI_REG_IF_SERIAL_XT 0x00 |
| #define PCI_REG_IF_SERIAL_16450 0x01 |
| #define PCI_REG_IF_SERIAL_16550 0x02 |
| #define PCI_REG_IF_SERIAL_16650 0x03 |
| #define PCI_REG_IF_SERIAL_16750 0x04 |
| #define PCI_REG_IF_SERIAL_16850 0x05 |
| #define PCI_REG_IF_SERIAL_16950 0x06 |
| #define PCI_SUBCLASS_SCC_PARLEL (PCI_SUBCLASS_01) |
| #define PCI_REG_IF_PARLEL_XT 0x00 |
| #define PCI_REG_IF_PARLEL_BIDIR 0x01 |
| #define PCI_REG_IF_PARLEL_ECP 0x02 |
| #define PCI_REG_IF_PARLEL_1284CTLR 0x03 |
| #define PCI_REG_IF_PARLEL_1284TGT 0xFE |
| #define PCI_SUBCLASS_SCC_MULTI (PCI_SUBCLASS_02) |
| #define PCI_SUBCLASS_SCC_MODEM (PCI_SUBCLASS_03) |
| #define PCI_REG_IF_MODEM_GENERIC 0x00 |
| #define PCI_REG_IF_MODEM_16450 0x01 |
| #define PCI_REG_IF_MODEM_16550 0x02 |
| #define PCI_REG_IF_MODEM_16650 0x03 |
| #define PCI_REG_IF_MODEM_16750 0x04 |
| #define PCI_SUBCLASS_SCC_GPIB (PCI_SUBCLASS_04) |
| #define PCI_SUBCLASS_SCC_SMRTCRD (PCI_SUBCLASS_05) |
| #define PCI_SUBCLASS_SCC_OTHER (PCI_SUBCLASS_80) |
| |
| /* Base System subclasses - Base Class 08h */ |
| |
| #define PCI_SUBCLASS_BASESYS_PIC (PCI_SUBCLASS_00) |
| #define PCI_REG_IF_PIC_GEN8259 0x00 |
| #define PCI_REG_IF_PIC_ISA 0x01 |
| #define PCI_REG_IF_PIC_EISA 0x02 |
| #define PCI_REG_IF_PIC_APIC 0x10 |
| #define PCI_REG_IF_PIC_xAPIC 0x20 |
| #define PCI_SUBCLASS_BASESYS_DMA (PCI_SUBCLASS_01) |
| #define PCI_REG_IF_DMA_GEN8237 0x00 |
| #define PCI_REG_IF_DMA_ISA 0x01 |
| #define PCI_REG_IF_DMA_EISA 0x02 |
| #define PCI_SUBCLASS_BASESYS_TIMER (PCI_SUBCLASS_02) |
| #define PCI_REG_IF_TIMER_GEN8254 0x00 |
| #define PCI_REG_IF_TIMER_ISA 0x01 |
| #define PCI_REG_IF_TIMER_EISA 0x02 |
| #define PCI_SUBCLASS_BASESYS_RTC (PCI_SUBCLASS_03) |
| #define PCI_REG_IF_RTC_GENERIC 0x00 |
| #define PCI_REG_IF_RTC_ISA 0x01 |
| #define PCI_SUBCLASS_BASESYS_HOTPLUG (PCI_SUBCLASS_04) |
| #define PCI_SUBCLASS_BASESYS_OTHER (PCI_SUBCLASS_80) |
| |
| /* Input Device subclasses - Base Class 09h */ |
| |
| #define PCI_SUBCLASS_INPUT_KEYBD (PCI_SUBCLASS_00) |
| #define PCI_SUBCLASS_INPUT_PEN (PCI_SUBCLASS_01) |
| #define PCI_SUBCLASS_INPUT_MOUSE (PCI_SUBCLASS_02) |
| #define PCI_SUBCLASS_INPUT_SCANR (PCI_SUBCLASS_03) |
| #define PCI_SUBCLASS_INPUT_GAMEPORT (PCI_SUBCLASS_04) |
| #define PCI_REG_IF_GAMEPORT_GENERIC 0x00 |
| #define PCI_REG_IF_GAMEPORT_LEGACY 0x10 |
| #define PCI_SUBCLASS_INPUT_OTHER (PCI_SUBCLASS_80) |
| |
| /* Docking Station subclasses - Base Class 0Ah */ |
| |
| #define PCI_SUBCLASS_DOCSTATN_GENERIC (PCI_SUBCLASS_00) |
| #define PCI_SUBCLASS_DOCSTATN_OTHER (PCI_SUBCLASS_80) |
| |
| /* Processor subclasses - Base Class 0Bh */ |
| |
| #define PCI_SUBCLASS_PROCESSOR_386 (PCI_SUBCLASS_00) |
| #define PCI_SUBCLASS_PROCESSOR_486 (PCI_SUBCLASS_01) |
| #define PCI_SUBCLASS_PROCESSOR_PENTIUM (PCI_SUBCLASS_02) |
| #define PCI_SUBCLASS_PROCESSOR_ALPHA (PCI_SUBCLASS_10) |
| #define PCI_SUBCLASS_PROCESSOR_POWERPC (PCI_SUBCLASS_20) |
| #define PCI_SUBCLASS_PROCESSOR_MIPS (PCI_SUBCLASS_30) |
| #define PCI_SUBCLASS_PROCESSOR_COPROC (PCI_SUBCLASS_40) |
| |
| /* Serial bus subclasses - Base Class 0Ch */ |
| |
| #define PCI_SUBCLASS_SERBUS_FIREWIRE (PCI_SUBCLASS_00) |
| #define PCI_REG_IF_FIREWIRE_1394 0x00 |
| #define PCI_REG_IF_FIREWIRE_HCI1394 0x10 |
| #define PCI_SUBCLASS_SERBUS_ACCESS (PCI_SUBCLASS_01) |
| #define PCI_SUBCLASS_SERBUS_SSA (PCI_SUBCLASS_02) |
| #define PCI_SUBCLASS_SERBUS_USB (PCI_SUBCLASS_03) |
| #define PCI_REG_IF_USB_UHCI 0x00 |
| #define PCI_REG_IF_USB_OHCI 0x10 |
| #define PCI_REG_IF_USB_EHCI 0x20 |
| #define PCI_REG_IF_USB_XHCI 0x30 |
| #define PCI_REG_IF_USB_ANY 0x80 |
| #define PCI_REG_IF_USB_NONHOST 0xFE |
| #define PCI_SUBCLASS_SERBUS_FIBRE_CHAN (PCI_SUBCLASS_04) |
| #define PCI_SUBCLASS_SERBUS_SMBUS (PCI_SUBCLASS_05) |
| #define PCI_SUBCLASS_SERBUS_INFINI (PCI_SUBCLASS_06) |
| #define PCI_SUBCLASS_SERBUS_IPMI (PCI_SUBCLASS_07) |
| #define PCI_REG_IF_IPMI_SMIC 0x00 |
| #define PCI_REG_IF_IPMI_KYBD 0x01 |
| #define PCI_REG_IF_IPMI_BLCK 0x02 |
| #define PCI_SUBCLASS_SERBUS_SERCOS (PCI_SUBCLASS_08) |
| #define PCI_SUBCLASS_SERBUS_CAN (PCI_SUBCLASS_09) |
| #define PCI_SUBCLASS_SERBUS_OTHER (PCI_SUBCLASS_80) |
| |
| /* Wireless subclasses - Base Class 0Dh */ |
| |
| #define PCI_SUBCLASS_WIRELESS_IRDA (PCI_SUBCLASS_00) |
| #define PCI_SUBCLASS_WIRELESS_OTHER_IR (PCI_SUBCLASS_01) |
| #define PCI_SUBCLASS_WIRELESS_RF (PCI_SUBCLASS_10) |
| #define PCI_SUBCLASS_WIRELESS_BTOOTH (PCI_SUBCLASS_11) |
| #define PCI_SUBCLASS_WIRELESS_BBAND (PCI_SUBCLASS_12) |
| #define PCI_SUBCLASS_WIRELESS_OTHER (PCI_SUBCLASS_80) |
| |
| /* |
| * Intelligent I/O subclasses - Base Class 0Eh |
| * REG_IF values greater than 0x00 are reserved for I2O |
| */ |
| |
| #define PCI_SUBCLASS_INTELIO (PCI_SUBCLASS_00) |
| #define PCI_REG_IF_INTELIO_MSG_FIFO 0x00 |
| #define PCI_8UBCLASS_INTELIO_OTHER (PCI_SUBCLASS_00) |
| |
| /* Satellite Device Communication subclasses - Base Class 0Fh */ |
| |
| #define PCI_SUBCLASS_SATCOM_TV (PCI_SUBCLASS_00) |
| #define PCI_SUBCLASS_SATCOM_AUDIO (PCI_SUBCLASS_01) |
| #define PCI_SUBCLASS_SATCOM_VOICE (PCI_SUBCLASS_03) |
| #define PCI_SUBCLASS_SATCOM_DATA (PCI_SUBCLASS_04) |
| #define PCI_SUBCLASS_SATCOM_OTHER (PCI_SUBCLASS_80) |
| |
| /* Encryption/Decryption subclasses - Base Class 10h */ |
| |
| #define PCI_SUBCLASS_EN_DECRYP_NETWORK (PCI_SUBCLASS_00) |
| #define PCI_SUBCLASS_EN_DECRYP_ENTRTMNT (PCI_SUBCLASS_10) |
| #define PCI_SUBCLASS_EN_DECRYP_OTHER (PCI_SUBCLASS_80) |
| |
| /* Data Acquisition and Signal Processing subclasses - Base Class 11h */ |
| |
| #define PCI_SUBCLASS_DAQ_DSP_DPIO (PCI_SUBCLASS_00) |
| #define PCI_SUBCLASS_DAQ_DSP_PCTRS (PCI_SUBCLASS_01) |
| #define PCI_SUBCLASS_DAQ_DSP_COMM (PCI_SUBCLASS_10) |
| #define PCI_SUBCLASS_DAQ_DSP_MGMT (PCI_SUBCLASS_20) |
| #define PCI_SUBCLASS_DAQ_DSP_OTHER (PCI_SUBCLASS_80) |
| |
| /* PCI status field bit definitions */ |
| |
| #define PCI_STATUS_RESERVED_0 0x0001 |
| #define PCI_STATUS_RESERVED_1 0x0002 |
| #define PCI_STATUS_RESERVED_2 0x0004 |
| #define PCI_STATUS_INT_STATUS 0x0008 |
| #define PCI_STATUS_CAPABILITY_LIST 0x0010 |
| #define PCI_STATUS_66MHZ 0x0020 |
| #define PCI_STATUS_UDF_SUPPORTED 0x0040 |
| #define PCI_STATUS_FAST_B_TO_B 0x0080 |
| #define PCI_STATUS_DATA_PARITY_ERROR 0x0100 |
| #define PCI_STATUS_DEVSEL_TIMING 0x0600 |
| #define PCI_STATUS_SIG_TGT_ABORT 0x0800 |
| #define PCI_STATUS_RCV_TGT_ABORT 0x1000 |
| #define PCI_STATUS_RCV_MAST_ABORT 0x2000 |
| #define PCI_STATUS_SIG_SYS_ERROR 0x4000 |
| #define PCI_STATUS_DETECT_PARITY_ERROR 0x8000 |
| |
| /* PCI Capability register set identification */ |
| |
| #define PCI_CAP_RESERVED 0x00 |
| #define PCI_CAP_POWER_MGMT 0x01 /* Power Management interface */ |
| #define PCI_CAP_AGP 0x02 /* AGP Capability */ |
| #define PCI_CAP_VPD 0x03 /* Vital Product Data */ |
| #define PCI_CAP_SLOT_ID 0x04 /* Bridge Slot Identification */ |
| #define PCI_CAP_MSI 0x05 /* Message Signaled Interrupts*/ |
| #define PCI_CAP_HOT_SWAP 0x06 /* CompactPCI Hot Swap */ |
| #define PCI_CAP_PCIX 0x07 /* PCI-X features */ |
| #define PCI_CAP_HYPERTRANSPORT 0x08 /* hypertransport support */ |
| #define PCI_CAP_VENDOR_SPECIFIC 0x09 /* vendor specific */ |
| #define PCI_CAP_DEBUG_PORT 0x0a /* debug port info */ |
| #define PCI_CAP_CPCI_RES_CTRL 0x0b /* CompactPCI resource control*/ |
| #define PCI_CAP_SHPC 0x0c /* hot-plug controller */ |
| #define PCI_CAP_P2P_SSID 0x0d /* subsystem ID capability */ |
| #define PCI_CAP_AGP_TARGET 0x0e /* Accelerated Graphics Port */ |
| #define PCI_CAP_SECURE 0x0f /* secure device */ |
| #define PCI_CAP_PCI_EXPRESS 0x10 /* PCI Express */ |
| #define PCI_CAP_MSIX 0x11 /* optional extension to MSI */ |
| #define PCI_CAP_ADVANCED 0x13 /* advanced Features */ |
| |
| /* Extended Capability IDs */ |
| |
| #define PCI_EXT_CAP_PCI_PM PCI_CAP_POWER_MGMT |
| #define PCI_EXT_CAP_AGP PCI_CAP_AGP |
| #define PCI_EXT_CAP_VPD PCI_CAP_VPD |
| #define PCI_EXT_CAP_SLOTID PCI_CAP_SLOT_ID |
| #define PCI_EXT_CAP_MSI PCI_CAP_MSI |
| #define PCI_EXT_CAP_HOT_SWAP PCI_CAP_HOT_SWAP |
| #define PCI_EXT_CAP_PCIX PCI_CAP_PCIX |
| #define PCI_EXT_CAP_DBG_PORT PCI_CAP_DEBUG_PORT |
| #define PCI_EXT_CAP_CPCI_RES PCI_CAP_CPCI_RES_CTRL |
| #define PCI_EXT_CAP_HPC PCI_CAP_SHPC |
| #define PCI_EXT_CAP_EXP PCI_CAP_PCI_EXPRESS |
| #define PCI_EXT_CAP_MSIX PCI_CAP_MSIX |
| #define PCI_EXT_CAP_AF PCI_CAP_ADVANCED |
| |
| /* Power Management Registers */ |
| |
| #define PCI_POWER_MGMT_CAP 2 /* PM Capabilities Register */ |
| #define PCI_POWER_MGMT_CSR 4 /* PM CSR Register */ |
| #define PCI_PM_STATE_MASK 0x0003 /* Current power state (D0 to D3) */ |
| #define PCI_PM_NO_SOFT_RESET 0x0008 /* No reset for D3hot->D0 */ |
| #define PCI_PM_PME_ENABLE 0x0100 /* PME pin enable */ |
| #define PCI_PM_DATA_SEL_MASK 0x1e00 /* Data select (??) */ |
| #define PCI_PM_DATA_SCALE_MASK 0x6000 /* Data scale (??) */ |
| #define PCI_PM_PME_STATUS 0x8000 /* PME pin status */ |
| |
| #define PCI_PWR_D0 0 |
| #define PCI_PWR_D1 1 |
| #define PCI_PWR_D2 2 |
| #define PCI_PWR_D3hot 3 |
| #define PCI_PWR_D3cold 4 |
| #define PCI_PWR_BOOTUP 5 |
| |
| #define PCI_MSI_FLAGS_ENABLE 0x1 |
| #define PCI_MSI_FLAGS 2 |
| |
| /* MSI-X registers (these are at offset PCI_MSIX_FLAGS) */ |
| |
| #define PCI_MSIX_FLAGS 2 |
| #define PCI_MSIX_FLAGS_QSIZE 0x7FF |
| #define PCI_MSIX_FLAGS_ENABLE (1 << 15) |
| #define PCI_MSIX_FLAGS_MASKALL (1 << 14) |
| #define PCI_MSIX_FLAGS_BIRMASK (7 << 0) |
| #define PCI_MSIX_TABLE_OFFSET 0x4 |
| |
| /* Macros to support Intel VT-d code */ |
| |
| #define PCI_BUS(bdf) (((bdf) >> 8) & 0xff) |
| #define PCI_SLOT(bdf) (((bdf) >> 3) & 0x1f) |
| #define PCI_FUNC(bdf) ((bdf) & 0x07) |
| #define PCI_DEVFN(d, f) ((((d) & 0x1f) << 3) | ((f) & 0x07)) |
| #define PCI_DEVFN2(bdf) ((bdf) & 0xff) |
| #define PCI_BDF(b, d, f) ((((b) & 0xff) << 8) | PCI_DEVFN(d, f)) |
| #define PCI_BDF2(b, df) ((((b) & 0xff) << 8) | ((df) & 0xff)) |
| |
| /* PCI Express capability registers */ |
| |
| #define PCI_EXP_FLAGS 2 /* Capabilities register */ |
| #define PCI_EXP_FLAGS_VERS 0x000f /* Capability version */ |
| #define PCI_EXP_FLAGS_TYPE 0x00f0 /* Device/Port type */ |
| #define PCI_EXP_TYPE_ENDPOINT 0x0 /* Express Endpoint */ |
| #define PCI_EXP_TYPE_LEG_END 0x1 /* Legacy Endpoint */ |
| #define PCI_EXP_TYPE_ROOT_PORT 0x4 /* Root Port */ |
| #define PCI_EXP_TYPE_UPSTREAM 0x5 /* Upstream Port */ |
| #define PCI_EXP_TYPE_DOWNSTREAM 0x6 /* Downstream Port */ |
| #define PCI_EXP_TYPE_PCI_BRIDGE 0x7 /* PCI/PCI-X Bridge */ |
| #define PCI_EXP_TYPE_RC_END 0x9 /* Root Complex Integrated endpt.*/ |
| #define PCI_EXP_FLAGS_SLOT 0x0100 /* Slot implemented */ |
| #define PCI_EXP_FLAGS_IRQ 0x3e00 /* Interrupt message number */ |
| #define PCI_EXP_DEVCAP 4 /* Device capabilities */ |
| #define PCI_EXP_DEVCAP_PAYLOAD 0x07 /* Max_Payload_Size */ |
| #define PCI_EXP_DEVCAP_PHANTOM 0x18 /* Phantom functions */ |
| #define PCI_EXP_DEVCAP_EXT_TAG 0x20 /* Extended tags */ |
| #define PCI_EXP_DEVCAP_L0S 0x1c0 /* L0s Acceptable Latency */ |
| #define PCI_EXP_DEVCAP_L1 0xe00 /* L1 Acceptable Latency */ |
| #define PCI_EXP_DEVCAP_ATN_BUT 0x1000 /* Attention Button Present */ |
| #define PCI_EXP_DEVCAP_ATN_IND 0x2000 /* Attention Indicator Present */ |
| #define PCI_EXP_DEVCAP_PWR_IND 0x4000 /* Power Indicator Present */ |
| #define PCI_EXP_DEVCAP_PWR_VAL 0x3fc0000 /* Slot Power Limit Value */ |
| #define PCI_EXP_DEVCAP_PWR_SCL 0xc000000 /* Slot Power Limit Scale */ |
| #define PCI_EXP_DEVCAP_FLR 0x10000000 /* Function Level Reset */ |
| #define PCI_EXP_DEVCTL 8 /* Device Control */ |
| #define PCI_EXP_DEVCTL_CERE 0x0001 /* Correctable Error Reporting En*/ |
| #define PCI_EXP_DEVCTL_NFERE 0x0002 /* Non-Fatal Error Reporting En */ |
| #define PCI_EXP_DEVCTL_FERE 0x0004 /* Fatal Error Reporting Enable */ |
| #define PCI_EXP_DEVCTL_URRE 0x0008 /* Unsupported Request Reporting */ |
| #define PCI_EXP_DEVCTL_RELAX_EN 0x0010 /* Enable relaxed ordering */ |
| #define PCI_EXP_DEVCTL_PAYLOAD 0x00e0 /* Max_Payload_Size */ |
| #define PCI_EXP_DEVCTL_EXT_TAG 0x0100 /* Extended Tag Field Enable */ |
| #define PCI_EXP_DEVCTL_PHANTOM 0x0200 /* Phantom Functions Enable */ |
| #define PCI_EXP_DEVCTL_AUX_PME 0x0400 /* Auxiliary Power PM Enable */ |
| #define PCI_EXP_DEVCTL_NOSNOOP_EN 0x0800 /* Enable No Snoop */ |
| #define PCI_EXP_DEVCTL_READRQ 0x7000 /* Max_Read_Request_Size */ |
| #define PCI_EXP_DEVCTL_BCR_FLR 0x8000 /* BCR / FLR */ |
| #define PCI_EXP_DEVSTA 10 /* Device Status */ |
| #define PCI_EXP_DEVSTA_CED 0x01 /* Correctable Error Detected */ |
| #define PCI_EXP_DEVSTA_NFED 0x02 /* Non-Fatal Error Detected */ |
| #define PCI_EXP_DEVSTA_FED 0x04 /* Fatal Error Detected */ |
| #define PCI_EXP_DEVSTA_URD 0x08 /* Unsupported Request Detected */ |
| #define PCI_EXP_DEVSTA_AUXPD 0x10 /* AUX Power Detected */ |
| #define PCI_EXP_DEVSTA_TRPND 0x20 /* Transactions Pending */ |
| #define PCI_EXP_LNKCAP 12 /* Link Capabilities */ |
| #define PCI_EXP_LNKCTL 16 /* Link Control */ |
| #define PCI_EXP_LNKCTL_CLKREQ_EN 0x100 /* Enable clkreq */ |
| #define PCI_EXP_LNKSTA 18 /* Link Status */ |
| #define PCI_EXP_SLTCAP 20 /* Slot Capabilities */ |
| #define PCI_EXP_SLTCTL 24 /* Slot Control */ |
| #define PCI_EXP_SLTSTA 26 /* Slot Status */ |
| #define PCI_EXP_RTCTL 28 /* Root Control */ |
| #define PCI_EXP_RTCTL_SECEE 0x01 /* System Error on Corr. Error */ |
| #define PCI_EXP_RTCTL_SENFEE 0x02 /* System Error on Non-Fatal Err */ |
| #define PCI_EXP_RTCTL_SEFEE 0x04 /* System Error on Fatal Error */ |
| #define PCI_EXP_RTCTL_PMEIE 0x08 /* PME Interrupt Enable */ |
| #define PCI_EXP_RTCTL_CRSSVE 0x10 /* CRS Software Visibility En */ |
| #define PCI_EXP_RTCAP 30 /* Root Capabilities */ |
| #define PCI_EXP_RTSTA 32 /* Root Status */ |
| |
| /* PCI-X registers */ |
| |
| #define PCI_X_CMD 2 |
| |
| #ifdef __cplusplus |
| |
| /* Remapped reserved C++ words */ |
| #undef class |
| } |
| #endif /* __cplusplus */ |
| |
| #endif /* __inc_pci_mgr_h */ |