Files
linux-nvgpu/userspace/units/fb/fb_fusa.h
2025-12-19 15:25:44 -08:00

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 */