183d290c5STom Rini // SPDX-License-Identifier: GPL-2.0+
211636258SStephen Warren /*
311636258SStephen Warren * Copyright (C) 2015 Google, Inc
411636258SStephen Warren */
511636258SStephen Warren
611636258SStephen Warren #include <common.h>
711636258SStephen Warren #include <dm.h>
811636258SStephen Warren #include <sysreset.h>
911636258SStephen Warren #include <asm/state.h>
1011636258SStephen Warren #include <asm/test.h>
1111636258SStephen Warren #include <dm/test.h>
1211636258SStephen Warren #include <test/ut.h>
1311636258SStephen Warren
1411636258SStephen Warren /* Test that we can use particular sysreset devices */
dm_test_sysreset_base(struct unit_test_state * uts)1511636258SStephen Warren static int dm_test_sysreset_base(struct unit_test_state *uts)
1611636258SStephen Warren {
1711636258SStephen Warren struct sandbox_state *state = state_get_current();
1811636258SStephen Warren struct udevice *dev;
1911636258SStephen Warren
2011636258SStephen Warren /* Device 0 is the platform data device - it should never respond */
2111636258SStephen Warren ut_assertok(uclass_get_device(UCLASS_SYSRESET, 0, &dev));
2211636258SStephen Warren ut_asserteq(-ENODEV, sysreset_request(dev, SYSRESET_WARM));
2311636258SStephen Warren ut_asserteq(-ENODEV, sysreset_request(dev, SYSRESET_COLD));
2411636258SStephen Warren ut_asserteq(-ENODEV, sysreset_request(dev, SYSRESET_POWER));
2511636258SStephen Warren
2611636258SStephen Warren /* Device 1 is the warm sysreset device */
2711636258SStephen Warren ut_assertok(uclass_get_device(UCLASS_SYSRESET, 1, &dev));
2811636258SStephen Warren ut_asserteq(-EACCES, sysreset_request(dev, SYSRESET_WARM));
2911636258SStephen Warren ut_asserteq(-ENOSYS, sysreset_request(dev, SYSRESET_COLD));
3011636258SStephen Warren ut_asserteq(-ENOSYS, sysreset_request(dev, SYSRESET_POWER));
3111636258SStephen Warren
3211636258SStephen Warren state->sysreset_allowed[SYSRESET_WARM] = true;
3311636258SStephen Warren ut_asserteq(-EINPROGRESS, sysreset_request(dev, SYSRESET_WARM));
3411636258SStephen Warren state->sysreset_allowed[SYSRESET_WARM] = false;
3511636258SStephen Warren
3611636258SStephen Warren /* Device 2 is the cold sysreset device */
3711636258SStephen Warren ut_assertok(uclass_get_device(UCLASS_SYSRESET, 2, &dev));
3811636258SStephen Warren ut_asserteq(-ENOSYS, sysreset_request(dev, SYSRESET_WARM));
3911636258SStephen Warren ut_asserteq(-EACCES, sysreset_request(dev, SYSRESET_COLD));
4011636258SStephen Warren state->sysreset_allowed[SYSRESET_POWER] = false;
4111636258SStephen Warren ut_asserteq(-EACCES, sysreset_request(dev, SYSRESET_POWER));
4211636258SStephen Warren state->sysreset_allowed[SYSRESET_POWER] = true;
4311636258SStephen Warren
4411636258SStephen Warren return 0;
4511636258SStephen Warren }
4611636258SStephen Warren DM_TEST(dm_test_sysreset_base, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
4711636258SStephen Warren
dm_test_sysreset_get_status(struct unit_test_state * uts)48cda4688cSMario Six static int dm_test_sysreset_get_status(struct unit_test_state *uts)
49cda4688cSMario Six {
50cda4688cSMario Six struct udevice *dev;
51cda4688cSMario Six char msg[64];
52cda4688cSMario Six
53cda4688cSMario Six /* Device 1 is the warm sysreset device */
54cda4688cSMario Six ut_assertok(uclass_get_device(UCLASS_SYSRESET, 1, &dev));
55cda4688cSMario Six ut_assertok(sysreset_get_status(dev, msg, sizeof(msg)));
56cda4688cSMario Six ut_asserteq_str("Reset Status: WARM", msg);
57cda4688cSMario Six
58cda4688cSMario Six /* Device 2 is the cold sysreset device */
59cda4688cSMario Six ut_assertok(uclass_get_device(UCLASS_SYSRESET, 2, &dev));
60cda4688cSMario Six ut_assertok(sysreset_get_status(dev, msg, sizeof(msg)));
61cda4688cSMario Six ut_asserteq_str("Reset Status: COLD", msg);
62cda4688cSMario Six
63cda4688cSMario Six return 0;
64cda4688cSMario Six }
65cda4688cSMario Six DM_TEST(dm_test_sysreset_get_status, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
66cda4688cSMario Six
6711636258SStephen Warren /* Test that we can walk through the sysreset devices */
dm_test_sysreset_walk(struct unit_test_state * uts)6811636258SStephen Warren static int dm_test_sysreset_walk(struct unit_test_state *uts)
6911636258SStephen Warren {
7011636258SStephen Warren struct sandbox_state *state = state_get_current();
7111636258SStephen Warren
7211636258SStephen Warren /* If we generate a power sysreset, we will exit sandbox! */
7311636258SStephen Warren state->sysreset_allowed[SYSRESET_POWER] = false;
74751fed42SSimon Glass state->sysreset_allowed[SYSRESET_POWER_OFF] = false;
7511636258SStephen Warren ut_asserteq(-EACCES, sysreset_walk(SYSRESET_WARM));
7611636258SStephen Warren ut_asserteq(-EACCES, sysreset_walk(SYSRESET_COLD));
7711636258SStephen Warren ut_asserteq(-EACCES, sysreset_walk(SYSRESET_POWER));
7811636258SStephen Warren
7911636258SStephen Warren /*
8011636258SStephen Warren * Enable cold system reset - this should make cold system reset work,
8111636258SStephen Warren * plus a warm system reset should be promoted to cold, since this is
8211636258SStephen Warren * the next step along.
8311636258SStephen Warren */
8411636258SStephen Warren state->sysreset_allowed[SYSRESET_COLD] = true;
8511636258SStephen Warren ut_asserteq(-EINPROGRESS, sysreset_walk(SYSRESET_WARM));
8611636258SStephen Warren ut_asserteq(-EINPROGRESS, sysreset_walk(SYSRESET_COLD));
8711636258SStephen Warren ut_asserteq(-EACCES, sysreset_walk(SYSRESET_POWER));
8811636258SStephen Warren state->sysreset_allowed[SYSRESET_COLD] = false;
8911636258SStephen Warren state->sysreset_allowed[SYSRESET_POWER] = true;
9011636258SStephen Warren
9111636258SStephen Warren return 0;
9211636258SStephen Warren }
9311636258SStephen Warren DM_TEST(dm_test_sysreset_walk, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
94751fed42SSimon Glass
dm_test_sysreset_get_last(struct unit_test_state * uts)95751fed42SSimon Glass static int dm_test_sysreset_get_last(struct unit_test_state *uts)
96751fed42SSimon Glass {
97751fed42SSimon Glass struct udevice *dev;
98751fed42SSimon Glass
99751fed42SSimon Glass /* Device 1 is the warm sysreset device */
100751fed42SSimon Glass ut_assertok(uclass_get_device(UCLASS_SYSRESET, 1, &dev));
101751fed42SSimon Glass ut_asserteq(SYSRESET_WARM, sysreset_get_last(dev));
102751fed42SSimon Glass
103751fed42SSimon Glass /* Device 2 is the cold sysreset device */
104751fed42SSimon Glass ut_assertok(uclass_get_device(UCLASS_SYSRESET, 2, &dev));
105*2a072690SSimon Glass ut_asserteq(SYSRESET_POWER, sysreset_get_last(dev));
106751fed42SSimon Glass
107751fed42SSimon Glass /* This is device 0, the non-DT one */
108*2a072690SSimon Glass ut_asserteq(SYSRESET_POWER, sysreset_get_last_walk());
109751fed42SSimon Glass
110751fed42SSimon Glass return 0;
111751fed42SSimon Glass }
112751fed42SSimon Glass DM_TEST(dm_test_sysreset_get_last, DM_TESTF_SCAN_PDATA | DM_TESTF_SCAN_FDT);
113