mirror of
https://github.com/ipxe/ipxe
synced 2026-02-28 03:11:18 +03:00
[pci] Generalise function-level reset mechanism
Signed-off-by: Michael Brown <mcb30@ipxe.org>
This commit is contained in:
@@ -1,6 +1,7 @@
|
||||
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||
|
||||
#include <stdint.h>
|
||||
#include <ipxe/timer.h>
|
||||
#include <ipxe/pci.h>
|
||||
|
||||
static int pci_find_capability_common ( struct pci_device *pci,
|
||||
@@ -112,3 +113,24 @@ unsigned long pci_bar_size ( struct pci_device *pci, unsigned int reg ) {
|
||||
size = size & ~( size - 1 );
|
||||
return size;
|
||||
}
|
||||
|
||||
/**
|
||||
* Perform PCI Express function-level reset (FLR)
|
||||
*
|
||||
* @v pci PCI device
|
||||
* @v exp PCI Express Capability address
|
||||
*/
|
||||
void pci_reset ( struct pci_device *pci, unsigned int exp ) {
|
||||
uint16_t control;
|
||||
|
||||
/* Perform a PCIe function-level reset */
|
||||
pci_read_config_word ( pci, ( exp + PCI_EXP_DEVCTL ), &control );
|
||||
control |= PCI_EXP_DEVCTL_FLR;
|
||||
pci_write_config_word ( pci, ( exp + PCI_EXP_DEVCTL ), control );
|
||||
|
||||
/* Allow time for reset to complete */
|
||||
mdelay ( PCI_EXP_FLR_DELAY_MS );
|
||||
|
||||
/* Re-enable device */
|
||||
adjust_pci_device ( pci );
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user