Add pci_get_max_payload() to fetch the PCI-express maximum payload size.

Approved by:	re (gjb)
MFC after:	2 weeks
Sponsored by:	Chelsio Communications
Differential Revision:	https://reviews.freebsd.org/D6951
This commit is contained in:
John Baldwin 2016-06-24 17:26:42 +00:00
parent 4dad99bf48
commit 2ab0398d94
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=302175
3 changed files with 31 additions and 1 deletions

View File

@ -25,7 +25,7 @@
.\"
.\" $FreeBSD$
.\"
.Dd May 16, 2016
.Dd June 24, 2016
.Dt PCI 9
.Os
.Sh NAME
@ -44,6 +44,7 @@
.Nm pci_find_htcap ,
.Nm pci_find_pcie_root_port ,
.Nm pci_get_id ,
.Nm pci_get_max_payload ,
.Nm pci_get_max_read_req ,
.Nm pci_get_powerstate ,
.Nm pci_get_vpd_ident ,
@ -100,6 +101,8 @@
.Ft int
.Fn pci_get_id "device_t dev" "enum pci_id_type type" "uintptr_t *id"
.Ft int
.Fn pci_get_max_payload "device_t dev"
.Ft int
.Fn pci_get_max_read_req "device_t dev"
.Ft int
.Fn pci_get_powerstate "device_t dev"
@ -461,6 +464,16 @@ or
.Xr bus_activate_resource 9 .
.Pp
The
.Fn pci_get_max_payload
function returns the current maximum TLP payload size in bytes for a
PCI-express device.
If the
.Fa dev
device is not a PCI-express device,
.Fn pci_get_max_payload
returns zero.
.Pp
The
.Fn pci_get_max_read_req
function returns the current maximum read request size in bytes for a
PCI-express device.

View File

@ -1992,6 +1992,22 @@ pci_ht_map_msi(device_t dev, uint64_t addr)
}
}
int
pci_get_max_payload(device_t dev)
{
struct pci_devinfo *dinfo = device_get_ivars(dev);
int cap;
uint16_t val;
cap = dinfo->cfg.pcie.pcie_location;
if (cap == 0)
return (0);
val = pci_read_config(dev, cap + PCIER_DEVICE_CTL, 2);
val &= PCIEM_CTL_MAX_PAYLOAD;
val >>= 5;
return (1 << (val + 7));
}
int
pci_get_max_read_req(device_t dev)
{

View File

@ -585,6 +585,7 @@ int pci_msix_device_blacklisted(device_t dev);
void pci_ht_map_msi(device_t dev, uint64_t addr);
device_t pci_find_pcie_root_port(device_t dev);
int pci_get_max_payload(device_t dev);
int pci_get_max_read_req(device_t dev);
void pci_restore_state(device_t dev);
void pci_save_state(device_t dev);