mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 09:12:24 +03:00
407 lines
15 KiB
C
407 lines
15 KiB
C
/*
|
|
* Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
* Permission is hereby granted, free of charge, to any person obtaining a
|
|
* copy of this software and associated documentation files (the "Software"),
|
|
* to deal in the Software without restriction, including without limitation
|
|
* the rights to use, copy, modify, merge, publish, distribute, sublicense,
|
|
* and/or sell copies of the Software, and to permit persons to whom the
|
|
* Software is furnished to do so, subject to the following conditions:
|
|
*
|
|
* The above copyright notice and this permission notice shall be included in
|
|
* all copies or substantial portions of the Software.
|
|
*
|
|
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
|
|
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
|
|
* FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
|
|
* DEALINGS IN THE SOFTWARE.
|
|
*/
|
|
|
|
#ifndef UNIT_NVGPU_FB_H
|
|
#define UNIT_NVGPU_FB_H
|
|
|
|
struct gk20a;
|
|
struct unit_module;
|
|
|
|
/** @addtogroup SWUTS-fb
|
|
* @{
|
|
*
|
|
* Software Unit Test Specification for nvgpu.hal.fb
|
|
*/
|
|
|
|
/**
|
|
* Test specification for: fb_gv11b_init_test
|
|
*
|
|
* Description: Tests the init HALs for GV11B.
|
|
*
|
|
* Targets: nvgpu_ecc_init_support, gv11b_fb_init_hw, gv11b_fb_init_fs_state,
|
|
* gv11b_fb_ecc_init, gv11b_fb_ecc_free, gops_fb.fb_ecc_free,
|
|
* gops_fb.fb_ecc_init, gops_ecc.ecc_init_support, gops_fb.init_hw,
|
|
* gops_fb.init_fs_state, gm20b_fb_init_hw
|
|
*
|
|
* Test Type: Feature, Other (setup), Error injection
|
|
*
|
|
* Input: None
|
|
*
|
|
* Steps:
|
|
* - Set up the ops function pointer for all the HALs under test.
|
|
* - Initialize the g->mm structure with arbitrary addresses.
|
|
* - Call the ecc_init_support HAL to initialize ECC support.
|
|
* - Call the init_hw HAL and ensure the FB_NISO mask was set.
|
|
* - Call the init_fs_state HAL and ensure atomic mode was set in the MMU
|
|
* control register.
|
|
* - Perform dynamic memory error injection on the fb_ecc_init HAL to ensure
|
|
* it fails as expected.
|
|
* - Call the fb_ecc_init HAL and ensure it succeeds.
|
|
* - Call the fb_ecc_free HAL to free dynamic memory.
|
|
*
|
|
* Output: Returns PASS if the steps above were executed successfully. FAIL
|
|
* otherwise.
|
|
*/
|
|
int fb_gv11b_init_test(struct unit_module *m, struct gk20a *g, void *args);
|
|
|
|
/**
|
|
* Test specification for: fb_gm20b_tlb_invalidate_test
|
|
*
|
|
* Description: .
|
|
*
|
|
* Targets: gm20b_fb_tlb_invalidate, gops_fb.tlb_invalidate
|
|
*
|
|
* Test Type: Feature, Error injection
|
|
*
|
|
* Input: None
|
|
*
|
|
* Steps:
|
|
* - Initialize ops.fb.tlb_invalidate pointer to gm20b_fb_tlb_invalidate HAL.
|
|
* - Create a test nvgpu_mem PDB with SYSMEM aperture.
|
|
* - While the NVGPU is powered off, call gm20b_fb_tlb_invalidate and ensure
|
|
* it returned success.
|
|
* - The power on state of NVGPU.
|
|
* - Enable timer error injection (1st occurnce), call gm20b_fb_tlb_invalidate
|
|
* and ensure it failed.
|
|
* - Call gm20b_fb_tlb_invalidate again and check that it still failed (because
|
|
* the fb_mmu_ctrl_r register is not set properly)
|
|
* - Set the fb_mmu_ctrl_pri_fifo_space_v bit in fb_mmu_ctrl_r register.
|
|
* - Enable timer error injection (2nd occurnce), call gm20b_fb_tlb_invalidate
|
|
* and ensure it failed.
|
|
* - Using an helper during register writes, intercept writes to fb_mmu_ctrl_r
|
|
* to cause a timeout after the MMU invalidate. Ensure that
|
|
* gm20b_fb_tlb_invalidate returns a failure.
|
|
* - Set the fb_mmu_ctrl_pri_fifo_space_v bit again, and set the intercept
|
|
* helper to write the fb_mmu_ctrl_pri_fifo_empty_v bit upon a write to
|
|
* fb_mmu_ctrl_r. Ensure that gm20b_fb_tlb_invalidate succeeds.
|
|
*
|
|
* Output: Returns PASS if the steps above were executed successfully. FAIL
|
|
* otherwise.
|
|
*/
|
|
int fb_gm20b_tlb_invalidate_test(struct unit_module *m, struct gk20a *g,
|
|
void *args);
|
|
|
|
/**
|
|
* Test specification for: fb_gm20b_mmu_ctrl_test
|
|
*
|
|
* Description: Test GM20B HALs targeting MMU features.
|
|
*
|
|
* Targets: gm20b_fb_mmu_ctrl, gm20b_fb_mmu_debug_ctrl, gm20b_fb_mmu_debug_wr,
|
|
* gm20b_fb_mmu_debug_rd, gm20b_fb_vpr_info_fetch, gm20b_fb_dump_vpr_info,
|
|
* gm20b_fb_dump_wpr_info, gm20b_fb_read_wpr_info, gops_fb.mmu_ctrl,
|
|
* gops_fb.mmu_debug_wr, gops_fb.mmu_debug_ctrl, gops_fb.mmu_debug_rd,
|
|
* gops_fb.vpr_info_fetch, gops_fb.dump_wpr_info, gops_fb.dump_vpr_info,
|
|
* gops_fb.read_wpr_info
|
|
*
|
|
* Test Type: Feature, Error injection
|
|
*
|
|
* Input: None
|
|
*
|
|
* Steps:
|
|
* - Set up the ops function pointer for all the HALs under test.
|
|
* - Program an arbitrary value in the fb_mmu_ctrl_r register and ensure the
|
|
* gm20b_fb_mmu_ctrl HAL returns the same value.
|
|
* - Program an arbitrary value in the fb_mmu_debug_ctrl_r register and ensure
|
|
* the gm20b_fb_mmu_debug_ctrl HAL returns the same value.
|
|
* - Program an arbitrary value in the fb_mmu_debug_wr_r register and ensure the
|
|
* gm20b_fb_mmu_debug_wr HAL returns the same value.
|
|
* - Program an arbitrary value in the fb_mmu_debug_rd_r register and ensure the
|
|
* gm20b_fb_mmu_debug_rd HAL returns the same value.
|
|
* - Call the VPR/WPR dump operations for code coverage. Ensure that none of
|
|
* those operations cause a crash.
|
|
* - Enable timer error injection (1st occurnce), call gm20b_fb_vpr_info_fetch
|
|
* and ensure it failed.
|
|
* - Write in the fb_mmu_vpr_info register so that calling
|
|
* gm20b_fb_vpr_info_fetch triggers timeout in the
|
|
* gm20b_fb_vpr_info_fetch_wait function. Ensure the return values reflects
|
|
* a timeout.
|
|
*
|
|
* Output: Returns PASS if the steps above were executed successfully. FAIL
|
|
* otherwise.
|
|
*/
|
|
int fb_gm20b_mmu_ctrl_test(struct unit_module *m, struct gk20a *g, void *args);
|
|
|
|
/**
|
|
* Test specification for: fb_mmu_fault_gv11b_init_test
|
|
*
|
|
* Description: Init test to setup HAL pointers for FB_MMU fault testing.
|
|
*
|
|
* Targets: gv11b_fb_read_mmu_fault_buffer_size,
|
|
* gv11b_fb_read_mmu_fault_buffer_put, gv11b_fb_write_mmu_fault_status,
|
|
* gv11b_fb_read_mmu_fault_buffer_get
|
|
*
|
|
* Test Type: Init
|
|
*
|
|
* Input: None
|
|
*
|
|
* Steps:
|
|
* - Set up the ops function pointer for all the HALs under test.
|
|
*
|
|
* Output: Returns PASS if the steps above were executed successfully. FAIL
|
|
* otherwise.
|
|
*/
|
|
int fb_mmu_fault_gv11b_init_test(struct unit_module *m, struct gk20a *g,
|
|
void *args);
|
|
|
|
/**
|
|
* Test specification for: fb_mmu_fault_gv11b_buffer_test
|
|
*
|
|
* Description: Ensure all HAL functions work without causing an ABORT.
|
|
*
|
|
* Targets: gv11b_fb_is_fault_buf_enabled, gv11b_fb_fault_buffer_get_ptr_update,
|
|
* gv11b_fb_write_mmu_fault_buffer_size, gv11b_fb_fault_buf_set_state_hw,
|
|
* gv11b_fb_read_mmu_fault_status, gv11b_fb_fault_buf_configure_hw,
|
|
* gv11b_fb_is_fault_buffer_empty, gv11b_fb_read_mmu_fault_addr_lo_hi,
|
|
* gops_fb.fault_buf_configure_hw, gops_fb.fault_buf_set_state_hw,
|
|
* gv11b_fb_fault_buffer_size_val, gv11b_fb_read_mmu_fault_inst_lo_hi,
|
|
* gv11b_fb_read_mmu_fault_info
|
|
*
|
|
* Test Type: Feature, Error injection
|
|
*
|
|
* Input: fb_mmu_fault_gv11b_init_test
|
|
*
|
|
* Steps:
|
|
* - Call gv11b_fb_fault_buffer_get_ptr_update.
|
|
* - Set the overflow bit in the fb_mmu_fault_buffer_get_r(0) register, and call
|
|
* gv11b_fb_fault_buffer_get_ptr_update.
|
|
* - Call gv11b_fb_fault_buffer_size_val and check that the fault buffer is
|
|
* empty.
|
|
* - Call the gv11b_fb_fault_buf_configure_hw HAL and enable fault buffer.
|
|
* - Enable fault buffer again which shouldn't cause any crash.
|
|
* - While trying to disable the fault buffer, trigger a failure of
|
|
* nvgpu_timeout_init.
|
|
* - Disable the fault buffer.
|
|
* - Enable fault buffer, set the busy bit in fb_mmu_fault_status_r register,
|
|
* disable the fault buffer which should cause an internal timeout. Ensure
|
|
* that the fault buffer is disabled anyway.
|
|
* - Write test values in the fb_mmu_fault_addr_lo_r / fb_mmu_fault_addr_hi_r
|
|
* registers, call gv11b_fb_read_mmu_fault_addr_lo_hi and ensure the
|
|
* returned values match the test values.
|
|
* - Write test values in the fb_mmu_fault_inst_lo_r / fb_mmu_fault_inst_hi_r
|
|
* registers, call gv11b_fb_read_mmu_fault_inst_lo_hi and ensure the
|
|
* returned values match the test values.
|
|
* - Call the gv11b_fb_read_mmu_fault_info HAL and ensure it returns the same
|
|
* value as in the fb_mmu_fault_info_r register.
|
|
* - Call the gv11b_fb_write_mmu_fault_status HAL to write a test value, then
|
|
* read the fb_mmu_fault_status_r register to ensure it is the same value.
|
|
*
|
|
* Output: Returns PASS if the steps above were executed successfully. FAIL
|
|
* otherwise.
|
|
*/
|
|
int fb_mmu_fault_gv11b_buffer_test(struct unit_module *m, struct gk20a *g,
|
|
void *args);
|
|
|
|
/**
|
|
* Test specification for: fb_mmu_fault_gv11b_snap_reg
|
|
*
|
|
* Description: Test that gv11b_mm_copy_from_fault_snap_reg behaves correctly
|
|
* if the reported fault is valid/invalid.
|
|
*
|
|
* Targets: gv11b_mm_copy_from_fault_snap_reg
|
|
*
|
|
* Test Type: Feature
|
|
*
|
|
* Input: fb_mmu_fault_gv11b_init_test
|
|
*
|
|
* Steps:
|
|
* - Create a test mmu_fault_info instance.
|
|
* - Call gv11b_mm_copy_from_fault_snap_reg with an invalid fault bit and
|
|
* ensure the chid of the mmu_fault_info was just set to a default value of 0.
|
|
* - Call gv11b_mm_copy_from_fault_snap_reg again with a valid fault bit and
|
|
* ensure the chid of the mmu_fault_info is now set to
|
|
* NVGPU_INVALID_CHANNEL_ID.
|
|
*
|
|
* Output: Returns PASS if the steps above were executed successfully. FAIL
|
|
* otherwise.
|
|
*/
|
|
int fb_mmu_fault_gv11b_snap_reg(struct unit_module *m, struct gk20a *g,
|
|
void *args);
|
|
|
|
/**
|
|
* Test specification for: fb_mmu_fault_gv11b_handle_fault
|
|
*
|
|
* Description: Test the gv11b_fb_handle_mmu_fault HAL for all supported
|
|
* interrupt statuses.
|
|
*
|
|
* Targets: gv11b_fb_handle_mmu_fault, gv11b_fb_fault_buf_set_state_hw
|
|
*
|
|
* Test Type: Feature
|
|
*
|
|
* Input: fb_mmu_fault_gv11b_init_test
|
|
*
|
|
* Steps:
|
|
* - Call gv11b_fb_handle_mmu_fault with an interrupt source set to "other"
|
|
* and ensure it was handled by checking the "valid_clear" bit of the
|
|
* fb_mmu_fault_status_r register.
|
|
* - Enable the fault buffer.
|
|
* - Set interrupt source as dropped and ensure it is handled by
|
|
* gv11b_fb_handle_mmu_fault.
|
|
* - Repeat with a source as non-replayable.
|
|
* - Repeat with a source as non-replayable and overflow.
|
|
* - Repeat with a source as overflow and corrupted getptr.
|
|
* - Disable the fault buffer.
|
|
*
|
|
* Output: Returns PASS if the steps above were executed successfully. FAIL
|
|
* otherwise.
|
|
*/
|
|
int fb_mmu_fault_gv11b_handle_fault(struct unit_module *m, struct gk20a *g,
|
|
void *args);
|
|
|
|
/**
|
|
* Test specification for: fb_mmu_fault_gv11b_handle_bar2_fault
|
|
*
|
|
* Description: Test the gv11b_fb_handle_bar2_fault HAL for all supported
|
|
* interrupt statuses.
|
|
*
|
|
* Targets: gv11b_fb_handle_bar2_fault, gv11b_fb_mmu_fault_info_dump,
|
|
* gv11b_fb_fault_buf_set_state_hw
|
|
*
|
|
* Test Type: Feature, Error injection
|
|
*
|
|
* Input: fb_mmu_fault_gv11b_init_test
|
|
*
|
|
* Steps:
|
|
* - Create zero'ed test instances of mmu_fault_info and nvgpu_channel.
|
|
* - Call gv11b_fb_handle_bar2_fault with a fault_status of 0.
|
|
* - Ensure the gv11b_fb_mmu_fault_info_dump HAL does not cause a crash when
|
|
* called with a NULL pointer or a zero'ed out mmu_fault_info structure.
|
|
* - Set the minimum set of properties in the mmu_fault_info structure (valid
|
|
* and a pointer to the channel)
|
|
* - Call the gv11b_fb_mmu_fault_info_dump and ensure it doesn't cause a crash.
|
|
* - Set the fault_status to non-replayable and call gv11b_fb_handle_bar2_fault.
|
|
* - Set the g->ops.bus.bar2_bind HAL to report a failure and call
|
|
* gv11b_fb_handle_bar2_fault again.
|
|
* - Repeat with the fault buffer disabled.
|
|
*
|
|
* Output: Returns PASS if the steps above were executed successfully. FAIL
|
|
* otherwise.
|
|
*/
|
|
int fb_mmu_fault_gv11b_handle_bar2_fault(struct unit_module *m, struct gk20a *g,
|
|
void *args);
|
|
|
|
/**
|
|
* Test specification for: fb_intr_gv11b_init_test
|
|
*
|
|
* Description: Init test to setup HAL pointers for FB_INTR testing.
|
|
*
|
|
* Targets: None
|
|
*
|
|
* Test Type: Init
|
|
*
|
|
* Input: None
|
|
*
|
|
* Steps:
|
|
* - Set up the ops function pointer for all the HALs under test.
|
|
*
|
|
* Output: Returns PASS if the steps above were executed successfully. FAIL
|
|
* otherwise.
|
|
*/
|
|
int fb_intr_gv11b_init_test(struct unit_module *m, struct gk20a *g, void *args);
|
|
|
|
/**
|
|
* Test specification for: fb_intr_gv11b_isr_test
|
|
*
|
|
* Description: Test ISR handling with all supported types of interrupts.
|
|
*
|
|
* Targets: gv11b_fb_intr_enable, gv11b_fb_intr_disable, gv11b_fb_intr_isr,
|
|
* gv11b_fb_intr_is_mmu_fault_pending, gops_fb_intr.is_mmu_fault_pending,
|
|
* gops_fb_intr.enable, gops_fb_intr.disable, gops_fb_intr.isr
|
|
*
|
|
* Test Type: Feature
|
|
*
|
|
* Input: fb_intr_gv11b_init_test
|
|
*
|
|
* Steps:
|
|
* - Mask all interrupts in the fb_niso_intr_en_set_r register.
|
|
* - Call the gv11b_fb_intr_enable HAL and ensure several interrupts are
|
|
* unmasked.
|
|
* - Set the fb_niso_intr_r register to 0 (no interrupt), and ensure that
|
|
* gv11b_fb_intr_is_mmu_fault_pending indicates that no fault is pending.
|
|
* - Call the gv11b_fb_intr_isr HAL.
|
|
* - Set interrupt source as "access counter notify/error" and call the
|
|
* gv11b_fb_intr_isr HAL (this will only cause a nvgpu_info call)
|
|
* - Set interrupt source as "MMU fault" and ensure that
|
|
* gv11b_fb_intr_is_mmu_fault_pending indicates that a fault is pending.
|
|
* - Set interrupt source as "ECC fault" and call the gv11b_fb_intr_isr HAL
|
|
* (further ECC testing is done in other tests).
|
|
* - Use the gv11b_fb_intr_disable HAL to disable interrupts.
|
|
* - Ensure that what was written in the clear register matches the interrupts
|
|
* that were enabled at the beginning of this test.
|
|
*
|
|
* Output: Returns PASS if the steps above were executed successfully. FAIL
|
|
* otherwise.
|
|
*/
|
|
int fb_intr_gv11b_isr_test(struct unit_module *m, struct gk20a *g, void *args);
|
|
|
|
/**
|
|
* Test specification for: fb_intr_gv11b_ecc_test
|
|
*
|
|
* Description: Tests handling of ECC errors.
|
|
*
|
|
* Targets: gv11b_fb_ecc_init, gv11b_fb_intr_isr, gv11b_fb_intr_handle_ecc,
|
|
* gv11b_fb_ecc_free
|
|
*
|
|
* Test Type: Feature
|
|
*
|
|
* Input: fb_intr_gv11b_init_test, args as a subcase with one of these values:
|
|
* - TEST_ECC_L2TLB
|
|
* - TEST_ECC_HUBTLB
|
|
* - TEST_ECC_FILLUNIT
|
|
*
|
|
* Steps:
|
|
* - Based on the subcase passed as an argument to this test, select the
|
|
* appropriate values for each HW unit:
|
|
* - Address of the status register
|
|
* - Address of the corrected error count register
|
|
* - Address of the uncorrected error count register
|
|
* - Expected status mask for corrected errors
|
|
* - Expected status mask for uncorrected errors
|
|
* - Expected status mask for corrected errors overflow
|
|
* - Expected status mask for uncorrected errors overflow
|
|
* - Call the gv11b_fb_ecc_init HAL.
|
|
* - Test the hanlding of ISRs in the following cases:
|
|
* - Corrected error
|
|
* - Uncorrected error
|
|
* - Corrected error and overflow (with >0 number of errors)
|
|
* - Uncorrected error and overflow (with >0 number of errors)
|
|
* - Corrected and uncorrected with overflow and 0 errors.
|
|
* - In the case of FILLUNIT, also test the case of corrected and uncorrected
|
|
* PDE0 errors.
|
|
* - Clear the interrupt status register.
|
|
* - Call the gv11b_fb_ecc_free HAL.
|
|
*
|
|
* Output: Returns PASS if the steps above were executed successfully. FAIL
|
|
* otherwise.
|
|
*/
|
|
int fb_intr_gv11b_ecc_test(struct unit_module *m, struct gk20a *g, void *args);
|
|
|
|
/* Values below are used by the fb_intr_gv11b_ecc_test test. */
|
|
#define TEST_ECC_L2TLB 1U
|
|
#define TEST_ECC_HUBTLB 2U
|
|
#define TEST_ECC_FILLUNIT 3U
|
|
|
|
/* Helper function to intercept writes to the MMU status register. */
|
|
void helper_intercept_mmu_write(u32 val);
|
|
|
|
/** @} */
|
|
#endif /* UNIT_NVGPU_FB_H */
|