|  | /* | 
|  | * Copyright 2023 Google LLC | 
|  | * Copyright lowRISC contributors | 
|  | * | 
|  | * Licensed under the Apache License, Version 2.0 (the "License"); | 
|  | * you may not use this file except in compliance with the License. | 
|  | * You may obtain a copy of the License at | 
|  | * | 
|  | *      http://www.apache.org/licenses/LICENSE-2.0 | 
|  | * | 
|  | * Unless required by applicable law or agreed to in writing, software | 
|  | * distributed under the License is distributed on an "AS IS" BASIS, | 
|  | * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. | 
|  | * See the License for the specific language governing permissions and | 
|  | * limitations under the License. | 
|  | */ | 
|  |  | 
|  |  | 
|  | #include "hw/top_matcha/sw/autogen/top_matcha.h" | 
|  | #include "sw/device/lib/base/abs_mmio.h" | 
|  | #include "sw/device/lib/base/memory.h" | 
|  | #include "sw/device/lib/dif/dif_aon_timer.h" | 
|  | #include "sw/device/lib/dif/dif_base.h" | 
|  | #include "sw/device/lib/dif/dif_clkmgr.h" | 
|  | #include "sw/device/lib/runtime/log.h" | 
|  | #include "sw/device/lib/testing/aon_timer_testutils.h" | 
|  | #include "sw/device/lib/testing/test_framework/check.h" | 
|  | #include "sw/device/lib/testing/test_framework/ottf_main.h" | 
|  |  | 
|  | OTTF_DEFINE_TEST_CONFIG(); | 
|  |  | 
|  | static dif_aon_timer_t aon_timer; | 
|  |  | 
|  | /** | 
|  | * Turn off the clock for 400us, then turn on | 
|  | * Check the result in chip_sw_clkmgr_off_peri_vseq | 
|  | */ | 
|  | static void test_gateable_clocks_off_without_reset( | 
|  | const dif_clkmgr_t *clkmgr, dif_clkmgr_gateable_clock_t clock) { | 
|  | // Make sure the clock for the unit is on. | 
|  | CHECK_DIF_OK( | 
|  | dif_clkmgr_gateable_clock_set_enabled(clkmgr, clock, kDifToggleEnabled)); | 
|  |  | 
|  | LOG_INFO("Testing gateable clock ..."); | 
|  |  | 
|  | // Disable the peripheral's clock. | 
|  | CHECK_DIF_OK( | 
|  | dif_clkmgr_gateable_clock_set_enabled(clkmgr, clock, kDifToggleDisabled)); | 
|  | // Wait for the clock to really turn off. | 
|  | busy_spin_micros(400); | 
|  | // Enalbe the clock | 
|  | CHECK_DIF_OK( | 
|  | dif_clkmgr_gateable_clock_set_enabled(clkmgr, clock, kDifToggleEnabled)); | 
|  | } | 
|  |  | 
|  | bool test_main(void) { | 
|  | dif_clkmgr_t clkmgr; | 
|  |  | 
|  | CHECK_DIF_OK(dif_clkmgr_init( | 
|  | mmio_region_from_addr(TOP_MATCHA_CLKMGR_AON_BASE_ADDR), &clkmgr)); | 
|  |  | 
|  | // Initialize aon timer. | 
|  | CHECK_DIF_OK(dif_aon_timer_init( | 
|  | mmio_region_from_addr(TOP_MATCHA_AON_TIMER_AON_BASE_ADDR), &aon_timer)); | 
|  |  | 
|  | test_gateable_clocks_off_without_reset(&clkmgr, | 
|  | kTopMatchaGateableClocksSmcPeri); | 
|  | return true; | 
|  | } |