/** * Write to PCI configuration space * * @v pci PCI device * @v location Encoded offset and width * @v value Value * @ret rc Return status code */ int efipci_write ( struct pci_device *pci, unsigned long location, unsigned long value ) { EFI_BOOT_SERVICES *bs = efi_systab->BootServices; EFI_PCI_ROOT_BRIDGE_IO_PROTOCOL *root; EFI_HANDLE handle; EFI_STATUS efirc; int rc; /* Identify root bridge */ if ( ( rc = efipci_root ( pci, &handle, &root ) ) != 0 ) goto err_root; /* Read from configuration space */ if ( ( efirc = root->Pci.Write ( root, EFIPCI_WIDTH ( location ), efipci_address ( pci, location ), 1, &value ) ) != 0 ) { rc = -EEFI ( efirc ); DBGC ( pci, "EFIPCI " PCI_FMT " config write to offset %02lx " "failed: %s\n", PCI_ARGS ( pci ), EFIPCI_OFFSET ( location ), strerror ( rc ) ); goto err_write; } err_write: bs->CloseProtocol ( handle, &efi_pci_root_bridge_io_protocol_guid, efi_image_handle, handle ); err_root: return rc; }
int efipci_write ( struct pci_device *pci, unsigned long location, unsigned long value ) { EFI_STATUS efirc; if ( ( efirc = efipci->Pci.Write ( efipci, EFIPCI_WIDTH ( location ), efipci_address ( pci, location ), 1, &value ) ) != 0 ) { DBG ( "EFIPCI config write to %02x:%02x.%x offset %02lx " "failed: %s\n", pci->bus, PCI_SLOT ( pci->devfn ), PCI_FUNC ( pci->devfn ), EFIPCI_OFFSET ( location ), efi_strerror ( efirc ) ); return -EIO; } return 0; }
int efipci_write ( struct pci_device *pci, unsigned long location, unsigned long value ) { EFI_STATUS efirc; int rc; if ( ( efirc = efipci->Pci.Write ( efipci, EFIPCI_WIDTH ( location ), efipci_address ( pci, location ), 1, &value ) ) != 0 ) { rc = -EEFI ( efirc ); DBG ( "EFIPCI config write to " PCI_FMT " offset %02lx " "failed: %s\n", PCI_ARGS ( pci ), EFIPCI_OFFSET ( location ), strerror ( rc ) ); return -EIO; } return 0; }