Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in / Register
Toggle navigation
L
linux
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Merge Requests
0
Merge Requests
0
Analytics
Analytics
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Commits
Issue Boards
Open sidebar
nexedi
linux
Commits
3ebb9566
Commit
3ebb9566
authored
Jun 18, 2012
by
Joerg Roedel
Browse files
Options
Browse Files
Download
Plain Diff
Merge remote-tracking branch 'pci-bjorn/topic/alex-vfio-prep' into groups
parents
485802a6
a0dee2ed
Changes
7
Hide whitespace changes
Inline
Side-by-side
Showing
7 changed files
with
312 additions
and
25 deletions
+312
-25
drivers/pci/access.c
drivers/pci/access.c
+4
-2
drivers/pci/pci.c
drivers/pci/pci.c
+69
-0
drivers/pci/pci.h
drivers/pci/pci.h
+0
-7
drivers/pci/quirks.c
drivers/pci/quirks.c
+84
-0
drivers/xen/xen-pciback/conf_space.c
drivers/xen/xen-pciback/conf_space.c
+3
-3
include/linux/pci.h
include/linux/pci.h
+51
-1
include/linux/pci_regs.h
include/linux/pci_regs.h
+101
-12
No files found.
drivers/pci/access.c
View file @
3ebb9566
...
...
@@ -162,7 +162,8 @@ int pci_user_read_config_##size \
if (ret > 0) \
ret = -EINVAL; \
return ret; \
}
} \
EXPORT_SYMBOL_GPL(pci_user_read_config_##size);
/* Returns 0 on success, negative values indicate error. */
#define PCI_USER_WRITE_CONFIG(size,type) \
...
...
@@ -181,7 +182,8 @@ int pci_user_write_config_##size \
if (ret > 0) \
ret = -EINVAL; \
return ret; \
}
} \
EXPORT_SYMBOL_GPL(pci_user_write_config_##size);
PCI_USER_READ_CONFIG
(
byte
,
u8
)
PCI_USER_READ_CONFIG
(
word
,
u16
)
...
...
drivers/pci/pci.c
View file @
3ebb9566
...
...
@@ -2364,6 +2364,75 @@ void pci_enable_acs(struct pci_dev *dev)
pci_write_config_word
(
dev
,
pos
+
PCI_ACS_CTRL
,
ctrl
);
}
/**
* pci_acs_enabled - test ACS against required flags for a given device
* @pdev: device to test
* @acs_flags: required PCI ACS flags
*
* Return true if the device supports the provided flags. Automatically
* filters out flags that are not implemented on multifunction devices.
*/
bool
pci_acs_enabled
(
struct
pci_dev
*
pdev
,
u16
acs_flags
)
{
int
pos
,
ret
;
u16
ctrl
;
ret
=
pci_dev_specific_acs_enabled
(
pdev
,
acs_flags
);
if
(
ret
>=
0
)
return
ret
>
0
;
if
(
!
pci_is_pcie
(
pdev
))
return
false
;
/* Filter out flags not applicable to multifunction */
if
(
pdev
->
multifunction
)
acs_flags
&=
(
PCI_ACS_RR
|
PCI_ACS_CR
|
PCI_ACS_EC
|
PCI_ACS_DT
);
if
(
pdev
->
pcie_type
==
PCI_EXP_TYPE_DOWNSTREAM
||
pdev
->
pcie_type
==
PCI_EXP_TYPE_ROOT_PORT
||
pdev
->
multifunction
)
{
pos
=
pci_find_ext_capability
(
pdev
,
PCI_EXT_CAP_ID_ACS
);
if
(
!
pos
)
return
false
;
pci_read_config_word
(
pdev
,
pos
+
PCI_ACS_CTRL
,
&
ctrl
);
if
((
ctrl
&
acs_flags
)
!=
acs_flags
)
return
false
;
}
return
true
;
}
/**
* pci_acs_path_enable - test ACS flags from start to end in a hierarchy
* @start: starting downstream device
* @end: ending upstream device or NULL to search to the root bus
* @acs_flags: required flags
*
* Walk up a device tree from start to end testing PCI ACS support. If
* any step along the way does not support the required flags, return false.
*/
bool
pci_acs_path_enabled
(
struct
pci_dev
*
start
,
struct
pci_dev
*
end
,
u16
acs_flags
)
{
struct
pci_dev
*
pdev
,
*
parent
=
start
;
do
{
pdev
=
parent
;
if
(
!
pci_acs_enabled
(
pdev
,
acs_flags
))
return
false
;
if
(
pci_is_root_bus
(
pdev
->
bus
))
return
(
end
==
NULL
);
parent
=
pdev
->
bus
->
self
;
}
while
(
pdev
!=
end
);
return
true
;
}
/**
* pci_swizzle_interrupt_pin - swizzle INTx for device behind bridge
* @dev: the PCI device
...
...
drivers/pci/pci.h
View file @
3ebb9566
...
...
@@ -86,13 +86,6 @@ static inline bool pci_is_bridge(struct pci_dev *pci_dev)
return
!!
(
pci_dev
->
subordinate
);
}
extern
int
pci_user_read_config_byte
(
struct
pci_dev
*
dev
,
int
where
,
u8
*
val
);
extern
int
pci_user_read_config_word
(
struct
pci_dev
*
dev
,
int
where
,
u16
*
val
);
extern
int
pci_user_read_config_dword
(
struct
pci_dev
*
dev
,
int
where
,
u32
*
val
);
extern
int
pci_user_write_config_byte
(
struct
pci_dev
*
dev
,
int
where
,
u8
val
);
extern
int
pci_user_write_config_word
(
struct
pci_dev
*
dev
,
int
where
,
u16
val
);
extern
int
pci_user_write_config_dword
(
struct
pci_dev
*
dev
,
int
where
,
u32
val
);
struct
pci_vpd_ops
{
ssize_t
(
*
read
)(
struct
pci_dev
*
dev
,
loff_t
pos
,
size_t
count
,
void
*
buf
);
ssize_t
(
*
write
)(
struct
pci_dev
*
dev
,
loff_t
pos
,
size_t
count
,
const
void
*
buf
);
...
...
drivers/pci/quirks.c
View file @
3ebb9566
...
...
@@ -3205,3 +3205,87 @@ int pci_dev_specific_reset(struct pci_dev *dev, int probe)
return
-
ENOTTY
;
}
static
struct
pci_dev
*
pci_func_0_dma_source
(
struct
pci_dev
*
dev
)
{
if
(
!
PCI_FUNC
(
dev
->
devfn
))
return
pci_dev_get
(
dev
);
return
pci_get_slot
(
dev
->
bus
,
PCI_DEVFN
(
PCI_SLOT
(
dev
->
devfn
),
0
));
}
static
const
struct
pci_dev_dma_source
{
u16
vendor
;
u16
device
;
struct
pci_dev
*
(
*
dma_source
)(
struct
pci_dev
*
dev
);
}
pci_dev_dma_source
[]
=
{
/*
* https://bugzilla.redhat.com/show_bug.cgi?id=605888
*
* Some Ricoh devices use the function 0 source ID for DMA on
* other functions of a multifunction device. The DMA devices
* is therefore function 0, which will have implications of the
* iommu grouping of these devices.
*/
{
PCI_VENDOR_ID_RICOH
,
0xe822
,
pci_func_0_dma_source
},
{
PCI_VENDOR_ID_RICOH
,
0xe230
,
pci_func_0_dma_source
},
{
PCI_VENDOR_ID_RICOH
,
0xe832
,
pci_func_0_dma_source
},
{
PCI_VENDOR_ID_RICOH
,
0xe476
,
pci_func_0_dma_source
},
{
0
}
};
/*
* IOMMUs with isolation capabilities need to be programmed with the
* correct source ID of a device. In most cases, the source ID matches
* the device doing the DMA, but sometimes hardware is broken and will
* tag the DMA as being sourced from a different device. This function
* allows that translation. Note that the reference count of the
* returned device is incremented on all paths.
*/
struct
pci_dev
*
pci_get_dma_source
(
struct
pci_dev
*
dev
)
{
const
struct
pci_dev_dma_source
*
i
;
for
(
i
=
pci_dev_dma_source
;
i
->
dma_source
;
i
++
)
{
if
((
i
->
vendor
==
dev
->
vendor
||
i
->
vendor
==
(
u16
)
PCI_ANY_ID
)
&&
(
i
->
device
==
dev
->
device
||
i
->
device
==
(
u16
)
PCI_ANY_ID
))
return
i
->
dma_source
(
dev
);
}
return
pci_dev_get
(
dev
);
}
static
const
struct
pci_dev_acs_enabled
{
u16
vendor
;
u16
device
;
int
(
*
acs_enabled
)(
struct
pci_dev
*
dev
,
u16
acs_flags
);
}
pci_dev_acs_enabled
[]
=
{
{
0
}
};
int
pci_dev_specific_acs_enabled
(
struct
pci_dev
*
dev
,
u16
acs_flags
)
{
const
struct
pci_dev_acs_enabled
*
i
;
int
ret
;
/*
* Allow devices that do not expose standard PCIe ACS capabilities
* or control to indicate their support here. Multi-function express
* devices which do not allow internal peer-to-peer between functions,
* but do not implement PCIe ACS may wish to return true here.
*/
for
(
i
=
pci_dev_acs_enabled
;
i
->
acs_enabled
;
i
++
)
{
if
((
i
->
vendor
==
dev
->
vendor
||
i
->
vendor
==
(
u16
)
PCI_ANY_ID
)
&&
(
i
->
device
==
dev
->
device
||
i
->
device
==
(
u16
)
PCI_ANY_ID
))
{
ret
=
i
->
acs_enabled
(
dev
,
acs_flags
);
if
(
ret
>=
0
)
return
ret
;
}
}
return
-
ENOTTY
;
}
drivers/xen/xen-pciback/conf_space.c
View file @
3ebb9566
...
...
@@ -124,7 +124,7 @@ static inline u32 merge_value(u32 val, u32 new_val, u32 new_val_mask,
return
val
;
}
static
int
pcibios_err_to_errno
(
int
err
)
static
int
xen_
pcibios_err_to_errno
(
int
err
)
{
switch
(
err
)
{
case
PCIBIOS_SUCCESSFUL
:
...
...
@@ -202,7 +202,7 @@ int xen_pcibk_config_read(struct pci_dev *dev, int offset, int size,
pci_name
(
dev
),
size
,
offset
,
value
);
*
ret_val
=
value
;
return
pcibios_err_to_errno
(
err
);
return
xen_
pcibios_err_to_errno
(
err
);
}
int
xen_pcibk_config_write
(
struct
pci_dev
*
dev
,
int
offset
,
int
size
,
u32
value
)
...
...
@@ -290,7 +290,7 @@ int xen_pcibk_config_write(struct pci_dev *dev, int offset, int size, u32 value)
}
}
return
pcibios_err_to_errno
(
err
);
return
xen_
pcibios_err_to_errno
(
err
);
}
void
xen_pcibk_config_free_dyn_fields
(
struct
pci_dev
*
dev
)
...
...
include/linux/pci.h
View file @
3ebb9566
...
...
@@ -476,6 +476,32 @@ static inline bool pci_dev_msi_enabled(struct pci_dev *pci_dev) { return false;
#define PCIBIOS_SET_FAILED 0x88
#define PCIBIOS_BUFFER_TOO_SMALL 0x89
/*
* Translate above to generic errno for passing back through non-pci.
*/
static
inline
int
pcibios_err_to_errno
(
int
err
)
{
if
(
err
<=
PCIBIOS_SUCCESSFUL
)
return
err
;
/* Assume already errno */
switch
(
err
)
{
case
PCIBIOS_FUNC_NOT_SUPPORTED
:
return
-
ENOENT
;
case
PCIBIOS_BAD_VENDOR_ID
:
return
-
EINVAL
;
case
PCIBIOS_DEVICE_NOT_FOUND
:
return
-
ENODEV
;
case
PCIBIOS_BAD_REGISTER_NUMBER
:
return
-
EFAULT
;
case
PCIBIOS_SET_FAILED
:
return
-
EIO
;
case
PCIBIOS_BUFFER_TOO_SMALL
:
return
-
ENOSPC
;
}
return
-
ENOTTY
;
}
/* Low-level architecture-dependent routines */
struct
pci_ops
{
...
...
@@ -779,6 +805,14 @@ static inline int pci_write_config_dword(const struct pci_dev *dev, int where,
return
pci_bus_write_config_dword
(
dev
->
bus
,
dev
->
devfn
,
where
,
val
);
}
/* user-space driven config access */
int
pci_user_read_config_byte
(
struct
pci_dev
*
dev
,
int
where
,
u8
*
val
);
int
pci_user_read_config_word
(
struct
pci_dev
*
dev
,
int
where
,
u16
*
val
);
int
pci_user_read_config_dword
(
struct
pci_dev
*
dev
,
int
where
,
u32
*
val
);
int
pci_user_write_config_byte
(
struct
pci_dev
*
dev
,
int
where
,
u8
val
);
int
pci_user_write_config_word
(
struct
pci_dev
*
dev
,
int
where
,
u16
val
);
int
pci_user_write_config_dword
(
struct
pci_dev
*
dev
,
int
where
,
u32
val
);
int
__must_check
pci_enable_device
(
struct
pci_dev
*
dev
);
int
__must_check
pci_enable_device_io
(
struct
pci_dev
*
dev
);
int
__must_check
pci_enable_device_mem
(
struct
pci_dev
*
dev
);
...
...
@@ -1334,6 +1368,9 @@ static inline struct pci_dev *pci_get_bus_and_slot(unsigned int bus,
static
inline
int
pci_domain_nr
(
struct
pci_bus
*
bus
)
{
return
0
;
}
static
inline
struct
pci_dev
*
pci_dev_get
(
struct
pci_dev
*
dev
)
{
return
NULL
;
}
#define dev_is_pci(d) (false)
#define dev_is_pf(d) (false)
#define dev_num_vf(d) (0)
...
...
@@ -1488,9 +1525,20 @@ enum pci_fixup_pass {
#ifdef CONFIG_PCI_QUIRKS
void
pci_fixup_device
(
enum
pci_fixup_pass
pass
,
struct
pci_dev
*
dev
);
struct
pci_dev
*
pci_get_dma_source
(
struct
pci_dev
*
dev
);
int
pci_dev_specific_acs_enabled
(
struct
pci_dev
*
dev
,
u16
acs_flags
);
#else
static
inline
void
pci_fixup_device
(
enum
pci_fixup_pass
pass
,
struct
pci_dev
*
dev
)
{}
static
inline
struct
pci_dev
*
pci_get_dma_source
(
struct
pci_dev
*
dev
)
{
return
pci_dev_get
(
dev
);
}
static
inline
int
pci_dev_specific_acs_enabled
(
struct
pci_dev
*
dev
,
u16
acs_flags
)
{
return
-
ENOTTY
;
}
#endif
void
__iomem
*
pcim_iomap
(
struct
pci_dev
*
pdev
,
int
bar
,
unsigned
long
maxlen
);
...
...
@@ -1593,7 +1641,9 @@ static inline bool pci_is_pcie(struct pci_dev *dev)
}
void
pci_request_acs
(
void
);
bool
pci_acs_enabled
(
struct
pci_dev
*
pdev
,
u16
acs_flags
);
bool
pci_acs_path_enabled
(
struct
pci_dev
*
start
,
struct
pci_dev
*
end
,
u16
acs_flags
);
#define PCI_VPD_LRDT 0x80
/* Large Resource Data Type */
#define PCI_VPD_LRDT_ID(x) (x | PCI_VPD_LRDT)
...
...
include/linux/pci_regs.h
View file @
3ebb9566
...
...
@@ -26,6 +26,7 @@
* Under PCI, each device has 256 bytes of configuration address space,
* of which the first 64 bytes are standardized as follows:
*/
#define PCI_STD_HEADER_SIZEOF 64
#define PCI_VENDOR_ID 0x00
/* 16 bits */
#define PCI_DEVICE_ID 0x02
/* 16 bits */
#define PCI_COMMAND 0x04
/* 16 bits */
...
...
@@ -209,9 +210,12 @@
#define PCI_CAP_ID_SHPC 0x0C
/* PCI Standard Hot-Plug Controller */
#define PCI_CAP_ID_SSVID 0x0D
/* Bridge subsystem vendor/device ID */
#define PCI_CAP_ID_AGP3 0x0E
/* AGP Target PCI-PCI bridge */
#define PCI_CAP_ID_SECDEV 0x0F
/* Secure Device */
#define PCI_CAP_ID_EXP 0x10
/* PCI Express */
#define PCI_CAP_ID_MSIX 0x11
/* MSI-X */
#define PCI_CAP_ID_SATA 0x12
/* SATA Data/Index Conf. */
#define PCI_CAP_ID_AF 0x13
/* PCI Advanced Features */
#define PCI_CAP_ID_MAX PCI_CAP_ID_AF
#define PCI_CAP_LIST_NEXT 1
/* Next capability in the list */
#define PCI_CAP_FLAGS 2
/* Capability defined flags (16 bits) */
#define PCI_CAP_SIZEOF 4
...
...
@@ -276,6 +280,7 @@
#define PCI_VPD_ADDR_MASK 0x7fff
/* Address mask */
#define PCI_VPD_ADDR_F 0x8000
/* Write 0, 1 indicates completion */
#define PCI_VPD_DATA 4
/* 32-bits of data returned here */
#define PCI_CAP_VPD_SIZEOF 8
/* Slot Identification */
...
...
@@ -297,8 +302,10 @@
#define PCI_MSI_ADDRESS_HI 8
/* Upper 32 bits (if PCI_MSI_FLAGS_64BIT set) */
#define PCI_MSI_DATA_32 8
/* 16 bits of data for 32-bit devices */
#define PCI_MSI_MASK_32 12
/* Mask bits register for 32-bit devices */
#define PCI_MSI_PENDING_32 16
/* Pending intrs for 32-bit devices */
#define PCI_MSI_DATA_64 12
/* 16 bits of data for 64-bit devices */
#define PCI_MSI_MASK_64 16
/* Mask bits register for 64-bit devices */
#define PCI_MSI_PENDING_64 20
/* Pending intrs for 64-bit devices */
/* MSI-X registers */
#define PCI_MSIX_FLAGS 2
...
...
@@ -308,6 +315,7 @@
#define PCI_MSIX_TABLE 4
#define PCI_MSIX_PBA 8
#define PCI_MSIX_FLAGS_BIRMASK (7 << 0)
#define PCI_CAP_MSIX_SIZEOF 12
/* size of MSIX registers */
/* MSI-X entry's format */
#define PCI_MSIX_ENTRY_SIZE 16
...
...
@@ -338,6 +346,7 @@
#define PCI_AF_CTRL_FLR 0x01
#define PCI_AF_STATUS 5
#define PCI_AF_STATUS_TP 0x01
#define PCI_CAP_AF_SIZEOF 6
/* size of AF registers */
/* PCI-X registers */
...
...
@@ -374,6 +383,10 @@
#define PCI_X_STATUS_SPL_ERR 0x20000000
/* Rcvd Split Completion Error Msg */
#define PCI_X_STATUS_266MHZ 0x40000000
/* 266 MHz capable */
#define PCI_X_STATUS_533MHZ 0x80000000
/* 533 MHz capable */
#define PCI_X_ECC_CSR 8
/* ECC control and status */
#define PCI_CAP_PCIX_SIZEOF_V0 8
/* size of registers for Version 0 */
#define PCI_CAP_PCIX_SIZEOF_V1 24
/* size for Version 1 */
#define PCI_CAP_PCIX_SIZEOF_V2 PCI_CAP_PCIX_SIZEOF_V1
/* Same for v2 */
/* PCI Bridge Subsystem ID registers */
...
...
@@ -462,6 +475,7 @@
#define PCI_EXP_LNKSTA_DLLLA 0x2000
/* Data Link Layer Link Active */
#define PCI_EXP_LNKSTA_LBMS 0x4000
/* Link Bandwidth Management Status */
#define PCI_EXP_LNKSTA_LABS 0x8000
/* Link Autonomous Bandwidth Status */
#define PCI_CAP_EXP_ENDPOINT_SIZEOF_V1 20
/* v1 endpoints end here */
#define PCI_EXP_SLTCAP 20
/* Slot Capabilities */
#define PCI_EXP_SLTCAP_ABP 0x00000001
/* Attention Button Present */
#define PCI_EXP_SLTCAP_PCP 0x00000002
/* Power Controller Present */
...
...
@@ -521,6 +535,7 @@
#define PCI_EXP_OBFF_MSGA_EN 0x2000
/* OBFF enable with Message type A */
#define PCI_EXP_OBFF_MSGB_EN 0x4000
/* OBFF enable with Message type B */
#define PCI_EXP_OBFF_WAKE_EN 0x6000
/* OBFF using WAKE# signaling */
#define PCI_CAP_EXP_ENDPOINT_SIZEOF_V2 44
/* v2 endpoints end here */
#define PCI_EXP_LNKCTL2 48
/* Link Control 2 */
#define PCI_EXP_SLTCTL2 56
/* Slot Control 2 */
...
...
@@ -529,23 +544,43 @@
#define PCI_EXT_CAP_VER(header) ((header >> 16) & 0xf)
#define PCI_EXT_CAP_NEXT(header) ((header >> 20) & 0xffc)
#define PCI_EXT_CAP_ID_ERR 1
#define PCI_EXT_CAP_ID_VC 2
#define PCI_EXT_CAP_ID_DSN 3
#define PCI_EXT_CAP_ID_PWR 4
#define PCI_EXT_CAP_ID_VNDR 11
#define PCI_EXT_CAP_ID_ACS 13
#define PCI_EXT_CAP_ID_ARI 14
#define PCI_EXT_CAP_ID_ATS 15
#define PCI_EXT_CAP_ID_SRIOV 16
#define PCI_EXT_CAP_ID_PRI 19
#define PCI_EXT_CAP_ID_LTR 24
#define PCI_EXT_CAP_ID_PASID 27
#define PCI_EXT_CAP_ID_ERR 0x01
/* Advanced Error Reporting */
#define PCI_EXT_CAP_ID_VC 0x02
/* Virtual Channel Capability */
#define PCI_EXT_CAP_ID_DSN 0x03
/* Device Serial Number */
#define PCI_EXT_CAP_ID_PWR 0x04
/* Power Budgeting */
#define PCI_EXT_CAP_ID_RCLD 0x05
/* Root Complex Link Declaration */
#define PCI_EXT_CAP_ID_RCILC 0x06
/* Root Complex Internal Link Control */
#define PCI_EXT_CAP_ID_RCEC 0x07
/* Root Complex Event Collector */
#define PCI_EXT_CAP_ID_MFVC 0x08
/* Multi-Function VC Capability */
#define PCI_EXT_CAP_ID_VC9 0x09
/* same as _VC */
#define PCI_EXT_CAP_ID_RCRB 0x0A
/* Root Complex RB? */
#define PCI_EXT_CAP_ID_VNDR 0x0B
/* Vendor Specific */
#define PCI_EXT_CAP_ID_CAC 0x0C
/* Config Access - obsolete */
#define PCI_EXT_CAP_ID_ACS 0x0D
/* Access Control Services */
#define PCI_EXT_CAP_ID_ARI 0x0E
/* Alternate Routing ID */
#define PCI_EXT_CAP_ID_ATS 0x0F
/* Address Translation Services */
#define PCI_EXT_CAP_ID_SRIOV 0x10
/* Single Root I/O Virtualization */
#define PCI_EXT_CAP_ID_MRIOV 0x11
/* Multi Root I/O Virtualization */
#define PCI_EXT_CAP_ID_MCAST 0x12
/* Multicast */
#define PCI_EXT_CAP_ID_PRI 0x13
/* Page Request Interface */
#define PCI_EXT_CAP_ID_AMD_XXX 0x14
/* reserved for AMD */
#define PCI_EXT_CAP_ID_REBAR 0x15
/* resizable BAR */
#define PCI_EXT_CAP_ID_DPA 0x16
/* dynamic power alloc */
#define PCI_EXT_CAP_ID_TPH 0x17
/* TPH request */
#define PCI_EXT_CAP_ID_LTR 0x18
/* latency tolerance reporting */
#define PCI_EXT_CAP_ID_SECPCI 0x19
/* Secondary PCIe */
#define PCI_EXT_CAP_ID_PMUX 0x1A
/* Protocol Multiplexing */
#define PCI_EXT_CAP_ID_PASID 0x1B
/* Process Address Space ID */
#define PCI_EXT_CAP_ID_MAX PCI_EXT_CAP_ID_PASID
#define PCI_EXT_CAP_DSN_SIZEOF 12
#define PCI_EXT_CAP_MCAST_ENDPOINT_SIZEOF 40
/* Advanced Error Reporting */
#define PCI_ERR_UNCOR_STATUS 4
/* Uncorrectable Error Status */
#define PCI_ERR_UNC_TRAIN 0x00000001
/* Training */
#define PCI_ERR_UNC_DLP 0x00000010
/* Data Link Protocol */
#define PCI_ERR_UNC_SURPDN 0x00000020
/* Surprise Down */
#define PCI_ERR_UNC_POISON_TLP 0x00001000
/* Poisoned TLP */
#define PCI_ERR_UNC_FCP 0x00002000
/* Flow Control Protocol */
#define PCI_ERR_UNC_COMP_TIME 0x00004000
/* Completion Timeout */
...
...
@@ -555,6 +590,11 @@
#define PCI_ERR_UNC_MALF_TLP 0x00040000
/* Malformed TLP */
#define PCI_ERR_UNC_ECRC 0x00080000
/* ECRC Error Status */
#define PCI_ERR_UNC_UNSUP 0x00100000
/* Unsupported Request */
#define PCI_ERR_UNC_ACSV 0x00200000
/* ACS Violation */
#define PCI_ERR_UNC_INTN 0x00400000
/* internal error */
#define PCI_ERR_UNC_MCBTLP 0x00800000
/* MC blocked TLP */
#define PCI_ERR_UNC_ATOMEG 0x01000000
/* Atomic egress blocked */
#define PCI_ERR_UNC_TLPPRE 0x02000000
/* TLP prefix blocked */
#define PCI_ERR_UNCOR_MASK 8
/* Uncorrectable Error Mask */
/* Same bits as above */
#define PCI_ERR_UNCOR_SEVER 12
/* Uncorrectable Error Severity */
...
...
@@ -565,6 +605,9 @@
#define PCI_ERR_COR_BAD_DLLP 0x00000080
/* Bad DLLP Status */
#define PCI_ERR_COR_REP_ROLL 0x00000100
/* REPLAY_NUM Rollover */
#define PCI_ERR_COR_REP_TIMER 0x00001000
/* Replay Timer Timeout */
#define PCI_ERR_COR_ADV_NFAT 0x00002000
/* Advisory Non-Fatal */
#define PCI_ERR_COR_INTERNAL 0x00004000
/* Corrected Internal */
#define PCI_ERR_COR_LOG_OVER 0x00008000
/* Header Log Overflow */
#define PCI_ERR_COR_MASK 20
/* Correctable Error Mask */
/* Same bits as above */
#define PCI_ERR_CAP 24
/* Advanced Error Capabilities */
...
...
@@ -596,12 +639,18 @@
/* Virtual Channel */
#define PCI_VC_PORT_REG1 4
#define PCI_VC_REG1_EVCC 0x7
/* extended vc count */
#define PCI_VC_PORT_REG2 8
#define PCI_VC_REG2_32_PHASE 0x2
#define PCI_VC_REG2_64_PHASE 0x4
#define PCI_VC_REG2_128_PHASE 0x8
#define PCI_VC_PORT_CTRL 12
#define PCI_VC_PORT_STATUS 14
#define PCI_VC_RES_CAP 16
#define PCI_VC_RES_CTRL 20
#define PCI_VC_RES_STATUS 26
#define PCI_CAP_VC_BASE_SIZEOF 0x10
#define PCI_CAP_VC_PER_VC_SIZEOF 0x0C
/* Power Budgeting */
#define PCI_PWR_DSR 4
/* Data Select Register */
...
...
@@ -614,6 +663,7 @@
#define PCI_PWR_DATA_RAIL(x) (((x) >> 18) & 7)
/* Power Rail */
#define PCI_PWR_CAP 12
/* Capability */
#define PCI_PWR_CAP_BUDGET(x) ((x) & 1)
/* Included in system budget */
#define PCI_EXT_CAP_PWR_SIZEOF 16
/*
* Hypertransport sub capability types
...
...
@@ -646,6 +696,8 @@
#define HT_CAPTYPE_ERROR_RETRY 0xC0
/* Retry on error configuration */
#define HT_CAPTYPE_GEN3 0xD0
/* Generation 3 hypertransport configuration */
#define HT_CAPTYPE_PM 0xE0
/* Hypertransport powermanagement configuration */
#define HT_CAP_SIZEOF_LONG 28
/* slave & primary */
#define HT_CAP_SIZEOF_SHORT 24
/* host & secondary */
/* Alternative Routing-ID Interpretation */
#define PCI_ARI_CAP 0x04
/* ARI Capability Register */
...
...
@@ -656,6 +708,7 @@
#define PCI_ARI_CTRL_MFVC 0x0001
/* MFVC Function Groups Enable */
#define PCI_ARI_CTRL_ACS 0x0002
/* ACS Function Groups Enable */
#define PCI_ARI_CTRL_FG(x) (((x) >> 4) & 7)
/* Function Group */
#define PCI_EXT_CAP_ARI_SIZEOF 8
/* Address Translation Service */
#define PCI_ATS_CAP 0x04
/* ATS Capability Register */
...
...
@@ -665,6 +718,7 @@
#define PCI_ATS_CTRL_ENABLE 0x8000
/* ATS Enable */
#define PCI_ATS_CTRL_STU(x) ((x) & 0x1f)
/* Smallest Translation Unit */
#define PCI_ATS_MIN_STU 12
/* shift of minimum STU block */
#define PCI_EXT_CAP_ATS_SIZEOF 8
/* Page Request Interface */
#define PCI_PRI_CTRL 0x04
/* PRI control register */
...
...
@@ -676,6 +730,7 @@
#define PCI_PRI_STATUS_STOPPED 0x100
/* PRI Stopped */
#define PCI_PRI_MAX_REQ 0x08
/* PRI max reqs supported */
#define PCI_PRI_ALLOC_REQ 0x0c
/* PRI max reqs allowed */
#define PCI_EXT_CAP_PRI_SIZEOF 16
/* PASID capability */
#define PCI_PASID_CAP 0x04
/* PASID feature register */
...
...
@@ -685,6 +740,7 @@
#define PCI_PASID_CTRL_ENABLE 0x01
/* Enable bit */
#define PCI_PASID_CTRL_EXEC 0x02
/* Exec permissions Enable */
#define PCI_PASID_CTRL_PRIV 0x04
/* Priviledge Mode Enable */
#define PCI_EXT_CAP_PASID_SIZEOF 8
/* Single Root I/O Virtualization */
#define PCI_SRIOV_CAP 0x04
/* SR-IOV Capabilities */
...
...
@@ -716,12 +772,14 @@
#define PCI_SRIOV_VFM_MI 0x1
/* Dormant.MigrateIn */
#define PCI_SRIOV_VFM_MO 0x2
/* Active.MigrateOut */
#define PCI_SRIOV_VFM_AV 0x3
/* Active.Available */
#define PCI_EXT_CAP_SRIOV_SIZEOF 64
#define PCI_LTR_MAX_SNOOP_LAT 0x4
#define PCI_LTR_MAX_NOSNOOP_LAT 0x6
#define PCI_LTR_VALUE_MASK 0x000003ff
#define PCI_LTR_SCALE_MASK 0x00001c00
#define PCI_LTR_SCALE_SHIFT 10
#define PCI_EXT_CAP_LTR_SIZEOF 8
/* Access Control Service */
#define PCI_ACS_CAP 0x04
/* ACS Capability Register */
...
...
@@ -732,7 +790,38 @@
#define PCI_ACS_UF 0x10
/* Upstream Forwarding */
#define PCI_ACS_EC 0x20
/* P2P Egress Control */
#define PCI_ACS_DT 0x40
/* Direct Translated P2P */
#define PCI_ACS_EGRESS_BITS 0x05
/* ACS Egress Control Vector Size */
#define PCI_ACS_CTRL 0x06
/* ACS Control Register */
#define PCI_ACS_EGRESS_CTL_V 0x08
/* ACS Egress Control Vector */
#define PCI_VSEC_HDR 4
/* extended cap - vendor specific */
#define PCI_VSEC_HDR_LEN_SHIFT 20
/* shift for length field */
/* sata capability */
#define PCI_SATA_REGS 4
/* SATA REGs specifier */
#define PCI_SATA_REGS_MASK 0xF
/* location - BAR#/inline */
#define PCI_SATA_REGS_INLINE 0xF
/* REGS in config space */
#define PCI_SATA_SIZEOF_SHORT 8
#define PCI_SATA_SIZEOF_LONG 16
/* resizable BARs */
#define PCI_REBAR_CTRL 8
/* control register */
#define PCI_REBAR_CTRL_NBAR_MASK (7 << 5)
/* mask for # bars */
#define PCI_REBAR_CTRL_NBAR_SHIFT 5
/* shift for # bars */
/* dynamic power allocation */
#define PCI_DPA_CAP 4
/* capability register */
#define PCI_DPA_CAP_SUBSTATE_MASK 0x1F
/* # substates - 1 */
#define PCI_DPA_BASE_SIZEOF 16
/* size with 0 substates */
/* TPH Requester */
#define PCI_TPH_CAP 4
/* capability register */
#define PCI_TPH_CAP_LOC_MASK 0x600
/* location mask */
#define PCI_TPH_LOC_NONE 0x000
/* no location */
#define PCI_TPH_LOC_CAP 0x200
/* in capability */
#define PCI_TPH_LOC_MSIX 0x400
/* in MSI-X */
#define PCI_TPH_CAP_ST_MASK 0x07FF0000
/* st table mask */
#define PCI_TPH_CAP_ST_SHIFT 16
/* st table shift */
#define PCI_TPH_BASE_SIZEOF 12
/* size with no st table */
#endif
/* LINUX_PCI_REGS_H */
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment