ahci: add test_pci_enable to ahci-test.
This adds a test wherein we engage the PCI AHCI device and ensure that the memory region for the HBA functionality is now accessible. Under Q35 environments, additional PCI configuration is performed to ensure that the HBA functionality will become usable. Signed-off-by: John Snow <jsnow@redhat.com> Message-id: 1408643079-30675-5-git-send-email-jsnow@redhat.com Signed-off-by: Stefan Hajnoczi <stefanha@redhat.com>
This commit is contained in:
parent
8840a843dc
commit
96d6d3bad9
@ -66,6 +66,7 @@ static uint32_t ahci_fingerprint;
|
|||||||
|
|
||||||
/*** Function Declarations ***/
|
/*** Function Declarations ***/
|
||||||
static QPCIDevice *get_ahci_device(void);
|
static QPCIDevice *get_ahci_device(void);
|
||||||
|
static QPCIDevice *start_ahci_device(QPCIDevice *dev, void **hba_base);
|
||||||
static void free_ahci_device(QPCIDevice *dev);
|
static void free_ahci_device(QPCIDevice *dev);
|
||||||
static void ahci_test_pci_spec(QPCIDevice *ahci);
|
static void ahci_test_pci_spec(QPCIDevice *ahci);
|
||||||
static void ahci_test_pci_caps(QPCIDevice *ahci, uint16_t header,
|
static void ahci_test_pci_caps(QPCIDevice *ahci, uint16_t header,
|
||||||
@ -169,6 +170,44 @@ static void ahci_shutdown(QPCIDevice *ahci)
|
|||||||
qtest_shutdown();
|
qtest_shutdown();
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*** Logical Device Initialization ***/
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Start the PCI device and sanity-check default operation.
|
||||||
|
*/
|
||||||
|
static void ahci_pci_enable(QPCIDevice *ahci, void **hba_base)
|
||||||
|
{
|
||||||
|
uint8_t reg;
|
||||||
|
|
||||||
|
start_ahci_device(ahci, hba_base);
|
||||||
|
|
||||||
|
switch (ahci_fingerprint) {
|
||||||
|
case AHCI_INTEL_ICH9:
|
||||||
|
/* ICH9 has a register at PCI 0x92 that
|
||||||
|
* acts as a master port enabler mask. */
|
||||||
|
reg = qpci_config_readb(ahci, 0x92);
|
||||||
|
reg |= 0x3F;
|
||||||
|
qpci_config_writeb(ahci, 0x92, reg);
|
||||||
|
ASSERT_BIT_SET(qpci_config_readb(ahci, 0x92), 0x3F);
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Map BAR5/ABAR, and engage the PCI device.
|
||||||
|
*/
|
||||||
|
static QPCIDevice *start_ahci_device(QPCIDevice *ahci, void **hba_base)
|
||||||
|
{
|
||||||
|
/* Map AHCI's ABAR (BAR5) */
|
||||||
|
*hba_base = qpci_iomap(ahci, 5, NULL);
|
||||||
|
|
||||||
|
/* turns on pci.cmd.iose, pci.cmd.mse and pci.cmd.bme */
|
||||||
|
qpci_device_enable(ahci);
|
||||||
|
|
||||||
|
return ahci;
|
||||||
|
}
|
||||||
|
|
||||||
/*** Specification Adherence Tests ***/
|
/*** Specification Adherence Tests ***/
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -428,6 +467,19 @@ static void test_pci_spec(void)
|
|||||||
ahci_shutdown(ahci);
|
ahci_shutdown(ahci);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Engage the PCI AHCI device and sanity check the response.
|
||||||
|
* Perform additional PCI config space bringup for the HBA.
|
||||||
|
*/
|
||||||
|
static void test_pci_enable(void)
|
||||||
|
{
|
||||||
|
QPCIDevice *ahci;
|
||||||
|
void *hba_base;
|
||||||
|
ahci = ahci_boot();
|
||||||
|
ahci_pci_enable(ahci, &hba_base);
|
||||||
|
ahci_shutdown(ahci);
|
||||||
|
}
|
||||||
|
|
||||||
/******************************************************************************/
|
/******************************************************************************/
|
||||||
|
|
||||||
int main(int argc, char **argv)
|
int main(int argc, char **argv)
|
||||||
@ -479,6 +531,7 @@ int main(int argc, char **argv)
|
|||||||
/* Run the tests */
|
/* Run the tests */
|
||||||
qtest_add_func("/ahci/sanity", test_sanity);
|
qtest_add_func("/ahci/sanity", test_sanity);
|
||||||
qtest_add_func("/ahci/pci_spec", test_pci_spec);
|
qtest_add_func("/ahci/pci_spec", test_pci_spec);
|
||||||
|
qtest_add_func("/ahci/pci_enable", test_pci_enable);
|
||||||
|
|
||||||
ret = g_test_run();
|
ret = g_test_run();
|
||||||
|
|
||||||
|
@ -71,6 +71,12 @@ void qpci_device_enable(QPCIDevice *dev)
|
|||||||
cmd = qpci_config_readw(dev, PCI_COMMAND);
|
cmd = qpci_config_readw(dev, PCI_COMMAND);
|
||||||
cmd |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER;
|
cmd |= PCI_COMMAND_IO | PCI_COMMAND_MEMORY | PCI_COMMAND_MASTER;
|
||||||
qpci_config_writew(dev, PCI_COMMAND, cmd);
|
qpci_config_writew(dev, PCI_COMMAND, cmd);
|
||||||
|
|
||||||
|
/* Verify the bits are now set. */
|
||||||
|
cmd = qpci_config_readw(dev, PCI_COMMAND);
|
||||||
|
g_assert_cmphex(cmd & PCI_COMMAND_IO, ==, PCI_COMMAND_IO);
|
||||||
|
g_assert_cmphex(cmd & PCI_COMMAND_MEMORY, ==, PCI_COMMAND_MEMORY);
|
||||||
|
g_assert_cmphex(cmd & PCI_COMMAND_MASTER, ==, PCI_COMMAND_MASTER);
|
||||||
}
|
}
|
||||||
|
|
||||||
uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id)
|
uint8_t qpci_find_capability(QPCIDevice *dev, uint8_t id)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user