blob: f2bd52a0b0f4ca1daa4b0a0e21c0b96b4a8b3e13 [file] [log] [blame]
Tom Rini10e47792018-05-06 17:58:06 -04001// SPDX-License-Identifier: GPL-2.0+
Simon Glass3a6eae62015-03-05 12:25:34 -07002/*
3 * Copyright (C) 2015 Google, Inc
Simon Glass3a6eae62015-03-05 12:25:34 -07004 */
5
6#include <common.h>
7#include <dm.h>
8#include <asm/io.h>
9#include <dm/test.h>
Joe Hershberger3a77be52015-05-20 14:27:27 -050010#include <test/ut.h>
Simon Glass3a6eae62015-03-05 12:25:34 -070011
12/* Test that sandbox PCI works correctly */
Joe Hershberger3a77be52015-05-20 14:27:27 -050013static int dm_test_pci_base(struct unit_test_state *uts)
Simon Glass3a6eae62015-03-05 12:25:34 -070014{
15 struct udevice *bus;
16
17 ut_assertok(uclass_get_device(UCLASS_PCI, 0, &bus));
18
19 return 0;
20}
21DM_TEST(dm_test_pci_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
22
Bin Mengcbf071b2018-08-03 01:14:39 -070023/* Test that sandbox PCI bus numbering and device works correctly */
24static int dm_test_pci_busdev(struct unit_test_state *uts)
Simon Glassa8149412015-05-10 21:08:06 -060025{
26 struct udevice *bus;
Bin Mengcbf071b2018-08-03 01:14:39 -070027 struct udevice *emul, *swap;
Simon Glassa8149412015-05-10 21:08:06 -060028
29 ut_assertok(uclass_get_device_by_seq(UCLASS_PCI, 0, &bus));
30
Bin Mengcbf071b2018-08-03 01:14:39 -070031 ut_assertok(uclass_get_device(UCLASS_PCI_EMUL, 0, &emul));
32 ut_assertok(dm_pci_bus_find_bdf(PCI_BDF(0, 0x00, 0), &swap));
33 ut_assert(device_active(swap));
34 ut_assertok(uclass_get_device(UCLASS_PCI_EMUL, 1, &emul));
35 ut_assertok(dm_pci_bus_find_bdf(PCI_BDF(0, 0x1f, 0), &swap));
36 ut_assert(device_active(swap));
37
Simon Glassa8149412015-05-10 21:08:06 -060038 return 0;
39}
Bin Mengcbf071b2018-08-03 01:14:39 -070040DM_TEST(dm_test_pci_busdev, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
Simon Glassa8149412015-05-10 21:08:06 -060041
Simon Glass3a6eae62015-03-05 12:25:34 -070042/* Test that we can use the swapcase device correctly */
Joe Hershberger3a77be52015-05-20 14:27:27 -050043static int dm_test_pci_swapcase(struct unit_test_state *uts)
Simon Glass3a6eae62015-03-05 12:25:34 -070044{
Bin Meng14450422018-08-03 01:14:38 -070045 struct udevice *swap;
Simon Glass3a6eae62015-03-05 12:25:34 -070046 ulong io_addr, mem_addr;
47 char *ptr;
48
Bin Mengcbf071b2018-08-03 01:14:39 -070049 /* Check that asking for the device 0 automatically fires up PCI */
50 ut_assertok(dm_pci_bus_find_bdf(PCI_BDF(0, 0x00, 0), &swap));
51
52 /* First test I/O */
53 io_addr = dm_pci_read_bar32(swap, 0);
54 outb(2, io_addr);
55 ut_asserteq(2, inb(io_addr));
56
57 /*
58 * Now test memory mapping - note we must unmap and remap to cause
59 * the swapcase emulation to see our data and response.
60 */
61 mem_addr = dm_pci_read_bar32(swap, 1);
62 ptr = map_sysmem(mem_addr, 20);
63 strcpy(ptr, "This is a TesT");
64 unmap_sysmem(ptr);
65
66 ptr = map_sysmem(mem_addr, 20);
67 ut_asserteq_str("tHIS IS A tESt", ptr);
68 unmap_sysmem(ptr);
69
70 /* Check that asking for the device 1 automatically fires up PCI */
Simon Glass0120d462015-11-29 13:18:02 -070071 ut_assertok(dm_pci_bus_find_bdf(PCI_BDF(0, 0x1f, 0), &swap));
Simon Glass3a6eae62015-03-05 12:25:34 -070072
73 /* First test I/O */
Simon Glass0120d462015-11-29 13:18:02 -070074 io_addr = dm_pci_read_bar32(swap, 0);
Simon Glass3a6eae62015-03-05 12:25:34 -070075 outb(2, io_addr);
76 ut_asserteq(2, inb(io_addr));
77
78 /*
79 * Now test memory mapping - note we must unmap and remap to cause
80 * the swapcase emulation to see our data and response.
81 */
Simon Glass0120d462015-11-29 13:18:02 -070082 mem_addr = dm_pci_read_bar32(swap, 1);
Simon Glass3a6eae62015-03-05 12:25:34 -070083 ptr = map_sysmem(mem_addr, 20);
84 strcpy(ptr, "This is a TesT");
85 unmap_sysmem(ptr);
86
87 ptr = map_sysmem(mem_addr, 20);
88 ut_asserteq_str("tHIS IS A tESt", ptr);
89 unmap_sysmem(ptr);
90
91 return 0;
92}
93DM_TEST(dm_test_pci_swapcase, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);