test: dm: pci: Test more than one device on the same bus
authorBin Meng <bmeng.cn@gmail.com>
Fri, 3 Aug 2018 08:14:39 +0000 (01:14 -0700)
committerSimon Glass <sjg@chromium.org>
Wed, 8 Aug 2018 11:49:31 +0000 (12:49 +0100)
It's quite common to have more than one device on the same PCI bus.
This updates the test case to test such scenario.

Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
Reviewed-by: Simon Glass <sjg@chromium.org>
arch/sandbox/dts/test.dts
test/dm/pci.c

index 137679abea9ccbc54de8d49e11277fd9810b486f..237266d4baa3e52df910e0760f94bed498fad8a3 100644 (file)
                #size-cells = <2>;
                ranges = <0x02000000 0 0x10000000 0x10000000 0 0x2000
                                0x01000000 0 0x20000000 0x20000000 0 0x2000>;
+               pci@0,0 {
+                       compatible = "pci-generic";
+                       reg = <0x0000 0 0 0 0>;
+                       emul@0,0 {
+                               compatible = "sandbox,swap-case";
+                       };
+               };
                pci@1f,0 {
                        compatible = "pci-generic";
                        reg = <0xf800 0 0 0 0>;
index be1208cfbdf1f279e50cc0776f3a0081cd81f35b..f2bd52a0b0f4ca1daa4b0a0e21c0b96b4a8b3e13 100644 (file)
@@ -20,16 +20,24 @@ static int dm_test_pci_base(struct unit_test_state *uts)
 }
 DM_TEST(dm_test_pci_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 
-/* Test that sandbox PCI bus numbering works correctly */
-static int dm_test_pci_busnum(struct unit_test_state *uts)
+/* Test that sandbox PCI bus numbering and device works correctly */
+static int dm_test_pci_busdev(struct unit_test_state *uts)
 {
        struct udevice *bus;
+       struct udevice *emul, *swap;
 
        ut_assertok(uclass_get_device_by_seq(UCLASS_PCI, 0, &bus));
 
+       ut_assertok(uclass_get_device(UCLASS_PCI_EMUL, 0, &emul));
+       ut_assertok(dm_pci_bus_find_bdf(PCI_BDF(0, 0x00, 0), &swap));
+       ut_assert(device_active(swap));
+       ut_assertok(uclass_get_device(UCLASS_PCI_EMUL, 1, &emul));
+       ut_assertok(dm_pci_bus_find_bdf(PCI_BDF(0, 0x1f, 0), &swap));
+       ut_assert(device_active(swap));
+
        return 0;
 }
-DM_TEST(dm_test_pci_busnum, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
+DM_TEST(dm_test_pci_busdev, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
 
 /* Test that we can use the swapcase device correctly */
 static int dm_test_pci_swapcase(struct unit_test_state *uts)
@@ -38,7 +46,28 @@ static int dm_test_pci_swapcase(struct unit_test_state *uts)
        ulong io_addr, mem_addr;
        char *ptr;
 
-       /* Check that asking for the device automatically fires up PCI */
+       /* Check that asking for the device 0 automatically fires up PCI */
+       ut_assertok(dm_pci_bus_find_bdf(PCI_BDF(0, 0x00, 0), &swap));
+
+       /* First test I/O */
+       io_addr = dm_pci_read_bar32(swap, 0);
+       outb(2, io_addr);
+       ut_asserteq(2, inb(io_addr));
+
+       /*
+        * Now test memory mapping - note we must unmap and remap to cause
+        * the swapcase emulation to see our data and response.
+        */
+       mem_addr = dm_pci_read_bar32(swap, 1);
+       ptr = map_sysmem(mem_addr, 20);
+       strcpy(ptr, "This is a TesT");
+       unmap_sysmem(ptr);
+
+       ptr = map_sysmem(mem_addr, 20);
+       ut_asserteq_str("tHIS IS A tESt", ptr);
+       unmap_sysmem(ptr);
+
+       /* Check that asking for the device 1 automatically fires up PCI */
        ut_assertok(dm_pci_bus_find_bdf(PCI_BDF(0, 0x1f, 0), &swap));
 
        /* First test I/O */