QemuEPC multi function verify for pci

Signed-off-by: yezhonghui <yezhonghui@xiaomi.com>
This commit is contained in:
yezhonghui 2024-08-09 16:17:05 +08:00 committed by Xiang Xiao
parent db19d00e64
commit 786dabfb13
1 changed files with 34 additions and 17 deletions

View File

@ -41,6 +41,8 @@
* Pre-processor Definitions
****************************************************************************/
#define PCI_EPF_TEST_FUNCTIONS 2
#define PCI_EPF_TEST_IRQ_TYPE_LEGACY 0
#define PCI_EPF_TEST_IRQ_TYPE_MSI 1
#define PCI_EPF_TEST_IRQ_TYPE_MSIX 2
@ -64,9 +66,6 @@
#define PCI_EPF_TEST_WORK_PERIOD MSEC2TICK(10)
#define ALIGN_UP(x, m) (((x) + ((m) - 1)) \
& ~((uintptr_t)(m) - 1))
/****************************************************************************
* Private Types
****************************************************************************/
@ -118,10 +117,17 @@ static const struct pci_epf_ops_s g_pci_epf_test_ops =
static const struct pci_epf_device_id_s g_pci_epf_test_id_table[] =
{
{.name = "pci_epf_test", },
{.name = "pci_epf_test_0", },
{.name = "pci_epf_test_1", },
{}
};
static FAR const char *g_pci_epf_test_name[] =
{
"pci_epf_test_0",
"pci_epf_test_1",
};
static struct pci_epf_driver_s g_pci_epf_test_driver =
{
.id_table = g_pci_epf_test_id_table,
@ -649,7 +655,7 @@ static int pci_epf_test_bind(FAR struct pci_epf_device_s *epf)
ret = pci_epc_start(epf->epc);
if (ret < 0)
{
pcierr("start error %d\n", ret);
pcierr("epc control start error\n");
return ret;
}
@ -674,7 +680,7 @@ static int pci_epf_test_probe(FAR struct pci_epf_device_s *epf)
test->header.vendorid = 0x104c;
test->header.deviceid = 0xb500;
test->header.baseclass_code = PCI_CLASS_OTHERS;
test->header.interrupt_pin = PCI_INTERRUPT_INTA;
test->header.interrupt_pin = PCI_INTERRUPT_INTA + epf->funcno;
test->bar_size[0] = 1024;
test->bar_size[1] = 512;
test->bar_size[2] = 1024;
@ -706,30 +712,41 @@ int pci_register_epf_test_device(FAR const char *epc_name)
{
FAR struct pci_epf_device_s *epf;
int ret;
int i;
epf = kmm_zalloc(sizeof(*epf));
epf = kmm_zalloc(sizeof(*epf) * PCI_EPF_TEST_FUNCTIONS);
if (NULL == epf)
{
pcierr("create epf error\n");
return -ENOMEM;
}
epf->name = "pci_epf_test";
epf->epc_name = epc_name;
epf->msi_interrupts = 1;
epf->msix_interrupts = 32;
nxmutex_init(&epf->lock);
ret = pci_epf_device_register(epf);
for (i = 0; i < PCI_EPF_TEST_FUNCTIONS; i++)
{
epf[i].name = g_pci_epf_test_name[i];
epf[i].epc_name = epc_name;
epf[i].msi_interrupts = 1;
epf[i].msix_interrupts = 32;
epf[i].funcno = i;
nxmutex_init(&epf[i].lock);
ret = pci_epf_device_register(&epf[i]);
if (ret < 0)
{
pcierr("link error");
pcierr("func %d link error\n", i);
goto err;
}
}
return 0;
err:
nxmutex_destroy(&epf->lock);
nxmutex_destroy(&epf[i].lock);
while (i-- > 0)
{
pci_epf_device_unregister(&epf[i]);
nxmutex_destroy(&epf[i].lock);
}
kmm_free(epf);
return ret;
}