gpu: nvgpu: remove non stall intr from top handler for safety

On safety nonstall interrupt is not used and should be compiled out to
rule out any chance of interference with safety code. Remove top handler
support of nonstall interrupt for safety which is currently not
applicable to linux.

Jira NVGPU-7066
Jira NVGPU-4078

Change-Id: I278efc8da6ddd0f22c128af6630cfd1b20ba4784
Signed-off-by: Shashank Singh <shashsingh@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2589006
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2671586
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
Shashank Singh
2021-09-03 13:02:52 +00:00
committed by mobile promotions
parent ca27a7d841
commit 5ec241a1d8
15 changed files with 65 additions and 13 deletions

View File

@@ -82,6 +82,7 @@ ccflags-y += -DCONFIG_NVGPU_FALCON_NON_FUSA
ccflags-y += -DCONFIG_NVGPU_IOCTL_NON_FUSA ccflags-y += -DCONFIG_NVGPU_IOCTL_NON_FUSA
ccflags-y += -DCONFIG_NVGPU_NON_FUSA ccflags-y += -DCONFIG_NVGPU_NON_FUSA
ccflags-y += -DCONFIG_NVGPU_INJECT_HWERR ccflags-y += -DCONFIG_NVGPU_INJECT_HWERR
ccflags-y += -DCONFIG_NVGPU_NONSTALL_INTR
ccflags-y += -DCONFIG_NVGPU_GR_FALCON_NON_SECURE_BOOT ccflags-y += -DCONFIG_NVGPU_GR_FALCON_NON_SECURE_BOOT
ccflags-y += -DCONFIG_NVGPU_SET_FALCON_ACCESS_MAP ccflags-y += -DCONFIG_NVGPU_SET_FALCON_ACCESS_MAP
ccflags-y += -DCONFIG_NVGPU_SW_SEMAPHORE ccflags-y += -DCONFIG_NVGPU_SW_SEMAPHORE

View File

@@ -316,6 +316,10 @@ ifeq ($(CONFIG_NVGPU_GSP_SCHEDULER),1)
CONFIG_NVGPU_GSP_STRESS_TEST := 1 CONFIG_NVGPU_GSP_STRESS_TEST := 1
NVGPU_COMMON_CFLAGS += -DCONFIG_NVGPU_GSP_STRESS_TEST NVGPU_COMMON_CFLAGS += -DCONFIG_NVGPU_GSP_STRESS_TEST
endif endif
# Enable Nonstall interrupt support for normal build
CONFIG_NVGPU_NONSTALL_INTR := 1
NVGPU_COMMON_CFLAGS += -DCONFIG_NVGPU_NONSTALL_INTR
endif endif
endif endif

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2018-2021, NVIDIA CORPORATION. All rights reserved. * Copyright (c) 2018-2022, NVIDIA CORPORATION. All rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -75,7 +75,9 @@ int nvgpu_ce_init_support(struct gk20a *g)
/** Enable interrupts at MC level */ /** Enable interrupts at MC level */
nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_CE, NVGPU_CIC_INTR_ENABLE); nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_CE, NVGPU_CIC_INTR_ENABLE);
#ifdef CONFIG_NVGPU_NONSTALL_INTR
nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_CE, NVGPU_CIC_INTR_ENABLE); nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_CE, NVGPU_CIC_INTR_ENABLE);
#endif
return 0; return 0;
} }

View File

@@ -49,6 +49,7 @@ void nvgpu_cic_mon_intr_stall_unit_config(struct gk20a *g, u32 unit, bool enable
nvgpu_spinunlock_irqrestore(&g->mc.intr_lock, flags); nvgpu_spinunlock_irqrestore(&g->mc.intr_lock, flags);
} }
#ifdef CONFIG_NVGPU_NONSTALL_INTR
void nvgpu_cic_mon_intr_nonstall_unit_config(struct gk20a *g, u32 unit, bool enable) void nvgpu_cic_mon_intr_nonstall_unit_config(struct gk20a *g, u32 unit, bool enable)
{ {
unsigned long flags = 0; unsigned long flags = 0;
@@ -57,6 +58,7 @@ void nvgpu_cic_mon_intr_nonstall_unit_config(struct gk20a *g, u32 unit, bool ena
g->ops.mc.intr_nonstall_unit_config(g, unit, enable); g->ops.mc.intr_nonstall_unit_config(g, unit, enable);
nvgpu_spinunlock_irqrestore(&g->mc.intr_lock, flags); nvgpu_spinunlock_irqrestore(&g->mc.intr_lock, flags);
} }
#endif
void nvgpu_cic_mon_intr_stall_pause(struct gk20a *g) void nvgpu_cic_mon_intr_stall_pause(struct gk20a *g)
{ {
@@ -76,6 +78,7 @@ void nvgpu_cic_mon_intr_stall_resume(struct gk20a *g)
nvgpu_spinunlock_irqrestore(&g->mc.intr_lock, flags); nvgpu_spinunlock_irqrestore(&g->mc.intr_lock, flags);
} }
#ifdef CONFIG_NVGPU_NONSTALL_INTR
void nvgpu_cic_mon_intr_nonstall_pause(struct gk20a *g) void nvgpu_cic_mon_intr_nonstall_pause(struct gk20a *g)
{ {
unsigned long flags = 0; unsigned long flags = 0;
@@ -149,6 +152,7 @@ void nvgpu_cic_mon_intr_nonstall_handle(struct gk20a *g)
(void)nvgpu_cic_rm_broadcast_last_irq_nonstall(g); (void)nvgpu_cic_rm_broadcast_last_irq_nonstall(g);
} }
#endif
u32 nvgpu_cic_mon_intr_stall_isr(struct gk20a *g) u32 nvgpu_cic_mon_intr_stall_isr(struct gk20a *g)
{ {

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. * Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -44,6 +44,7 @@ struct nvgpu_cic_rm {
*/ */
nvgpu_atomic_t sw_irq_stall_pending; nvgpu_atomic_t sw_irq_stall_pending;
#ifdef CONFIG_NVGPU_NONSTALL_INTR
/** /**
* One of the condition variables needed to keep track of deferred * One of the condition variables needed to keep track of deferred
* interrupts. * interrupts.
@@ -59,6 +60,7 @@ struct nvgpu_cic_rm {
* non-stalling interrupt handler and reset to 0 on exit. * non-stalling interrupt handler and reset to 0 on exit.
*/ */
nvgpu_atomic_t sw_irq_nonstall_pending; nvgpu_atomic_t sw_irq_nonstall_pending;
#endif
}; };
#endif /* CIC_RM_PRIV_H */ #endif /* CIC_RM_PRIV_H */

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2021, NVIDIA CORPORATION. All rights reserved. * Copyright (c) 2021-2022, NVIDIA CORPORATION. All rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -66,16 +66,20 @@ int nvgpu_cic_rm_init_vars(struct gk20a *g)
goto cleanup; goto cleanup;
} }
#ifdef CONFIG_NVGPU_NONSTALL_INTR
err = nvgpu_cond_init(&cic_rm->sw_irq_nonstall_last_handled_cond); err = nvgpu_cond_init(&cic_rm->sw_irq_nonstall_last_handled_cond);
if (err != 0) { if (err != 0) {
nvgpu_err(g, "sw irq nonstall cond init failed\n"); nvgpu_err(g, "sw irq nonstall cond init failed\n");
goto cleanup_cond; goto cleanup_cond;
} }
#endif
return 0; return 0;
#ifdef CONFIG_NVGPU_NONSTALL_INTR
cleanup_cond: cleanup_cond:
nvgpu_cond_destroy(&cic_rm->sw_irq_stall_last_handled_cond); nvgpu_cond_destroy(&cic_rm->sw_irq_stall_last_handled_cond);
#endif
cleanup: cleanup:
return err; return err;
} }
@@ -92,7 +96,9 @@ int nvgpu_cic_rm_deinit_vars(struct gk20a *g)
} }
nvgpu_cond_destroy(&cic_rm->sw_irq_stall_last_handled_cond); nvgpu_cond_destroy(&cic_rm->sw_irq_stall_last_handled_cond);
#ifdef CONFIG_NVGPU_NONSTALL_INTR
nvgpu_cond_destroy(&cic_rm->sw_irq_nonstall_last_handled_cond); nvgpu_cond_destroy(&cic_rm->sw_irq_nonstall_last_handled_cond);
#endif
return 0; return 0;
} }

View File

@@ -30,10 +30,12 @@ void nvgpu_cic_rm_set_irq_stall(struct gk20a *g, u32 value)
nvgpu_atomic_set(&g->cic_rm->sw_irq_stall_pending, (int)value); nvgpu_atomic_set(&g->cic_rm->sw_irq_stall_pending, (int)value);
} }
#ifdef CONFIG_NVGPU_NONSTALL_INTR
void nvgpu_cic_rm_set_irq_nonstall(struct gk20a *g, u32 value) void nvgpu_cic_rm_set_irq_nonstall(struct gk20a *g, u32 value)
{ {
nvgpu_atomic_set(&g->cic_rm->sw_irq_nonstall_pending, (int)value); nvgpu_atomic_set(&g->cic_rm->sw_irq_nonstall_pending, (int)value);
} }
#endif
int nvgpu_cic_rm_broadcast_last_irq_stall(struct gk20a *g) int nvgpu_cic_rm_broadcast_last_irq_stall(struct gk20a *g)
{ {
@@ -50,6 +52,7 @@ int nvgpu_cic_rm_broadcast_last_irq_stall(struct gk20a *g)
return err; return err;
} }
#ifdef CONFIG_NVGPU_NONSTALL_INTR
int nvgpu_cic_rm_broadcast_last_irq_nonstall(struct gk20a *g) int nvgpu_cic_rm_broadcast_last_irq_nonstall(struct gk20a *g)
{ {
int err = 0; int err = 0;
@@ -64,6 +67,7 @@ int nvgpu_cic_rm_broadcast_last_irq_nonstall(struct gk20a *g)
return err; return err;
} }
#endif
int nvgpu_cic_rm_wait_for_stall_interrupts(struct gk20a *g, u32 timeout) int nvgpu_cic_rm_wait_for_stall_interrupts(struct gk20a *g, u32 timeout)
{ {
@@ -73,6 +77,7 @@ int nvgpu_cic_rm_wait_for_stall_interrupts(struct gk20a *g, u32 timeout)
timeout); timeout);
} }
#ifdef CONFIG_NVGPU_NONSTALL_INTR
int nvgpu_cic_rm_wait_for_nonstall_interrupts(struct gk20a *g, u32 timeout) int nvgpu_cic_rm_wait_for_nonstall_interrupts(struct gk20a *g, u32 timeout)
{ {
/* wait until all non-stalling irqs are handled */ /* wait until all non-stalling irqs are handled */
@@ -80,6 +85,7 @@ int nvgpu_cic_rm_wait_for_nonstall_interrupts(struct gk20a *g, u32 timeout)
nvgpu_atomic_read(&g->cic_rm->sw_irq_nonstall_pending) == 0, nvgpu_atomic_read(&g->cic_rm->sw_irq_nonstall_pending) == 0,
timeout); timeout);
} }
#endif
void nvgpu_cic_rm_wait_for_deferred_interrupts(struct gk20a *g) void nvgpu_cic_rm_wait_for_deferred_interrupts(struct gk20a *g)
{ {
@@ -90,10 +96,12 @@ void nvgpu_cic_rm_wait_for_deferred_interrupts(struct gk20a *g)
nvgpu_err(g, "wait for stall interrupts failed %d", ret); nvgpu_err(g, "wait for stall interrupts failed %d", ret);
} }
#ifdef CONFIG_NVGPU_NONSTALL_INTR
ret = nvgpu_cic_rm_wait_for_nonstall_interrupts(g, 0U); ret = nvgpu_cic_rm_wait_for_nonstall_interrupts(g, 0U);
if (ret != 0) { if (ret != 0) {
nvgpu_err(g, "wait for nonstall interrupts failed %d", ret); nvgpu_err(g, "wait for nonstall interrupts failed %d", ret);
} }
#endif
} }
#ifdef CONFIG_NVGPU_NON_FUSA #ifdef CONFIG_NVGPU_NON_FUSA

View File

@@ -1,7 +1,7 @@
/* /*
* FIFO * FIFO
* *
* Copyright (c) 2011-2021, NVIDIA CORPORATION. All rights reserved. * Copyright (c) 2011-2022, NVIDIA CORPORATION. All rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -283,8 +283,10 @@ static void disable_fifo_interrupts(struct gk20a *g)
if (g->ops.fifo.intr_top_enable == NULL) { if (g->ops.fifo.intr_top_enable == NULL) {
nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_FIFO, nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_FIFO,
NVGPU_CIC_INTR_DISABLE); NVGPU_CIC_INTR_DISABLE);
#ifdef CONFIG_NVGPU_NONSTALL_INTR
nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_FIFO, nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_FIFO,
NVGPU_CIC_INTR_DISABLE); NVGPU_CIC_INTR_DISABLE);
#endif
} else { } else {
g->ops.fifo.intr_top_enable(g, NVGPU_CIC_INTR_DISABLE); g->ops.fifo.intr_top_enable(g, NVGPU_CIC_INTR_DISABLE);
} }

View File

@@ -190,8 +190,10 @@ static void disable_gr_interrupts(struct gk20a *g)
/** Disable interrupts at MC level */ /** Disable interrupts at MC level */
nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_GR, nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_GR,
NVGPU_CIC_INTR_DISABLE); NVGPU_CIC_INTR_DISABLE);
#ifdef CONFIG_NVGPU_NONSTALL_INTR
nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_GR, nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_GR,
NVGPU_CIC_INTR_DISABLE); NVGPU_CIC_INTR_DISABLE);
#endif
} }
int nvgpu_gr_suspend(struct gk20a *g) int nvgpu_gr_suspend(struct gk20a *g)
@@ -599,7 +601,9 @@ static int gr_init_prepare_hw(struct gk20a *g)
/** Enable interrupts at MC level */ /** Enable interrupts at MC level */
nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_GR, NVGPU_CIC_INTR_ENABLE); nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_GR, NVGPU_CIC_INTR_ENABLE);
#ifdef CONFIG_NVGPU_NONSTALL_INTR
nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_GR, NVGPU_CIC_INTR_ENABLE); nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_GR, NVGPU_CIC_INTR_ENABLE);
#endif
return nvgpu_gr_exec_with_ret_for_each_instance(g, return nvgpu_gr_exec_with_ret_for_each_instance(g,
gr_init_prepare_hw_impl(g)); gr_init_prepare_hw_impl(g));
@@ -713,7 +717,9 @@ static int nvgpu_gr_enable_hw_for_instance(struct gk20a *g)
/** Enable interrupts at MC level */ /** Enable interrupts at MC level */
nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_GR, NVGPU_CIC_INTR_ENABLE); nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_GR, NVGPU_CIC_INTR_ENABLE);
#ifdef CONFIG_NVGPU_NONSTALL_INTR
nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_GR, NVGPU_CIC_INTR_ENABLE); nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_GR, NVGPU_CIC_INTR_ENABLE);
#endif
err = gr_init_prepare_hw_impl(g); err = gr_init_prepare_hw_impl(g);
if (err != 0) { if (err != 0) {

View File

@@ -39,7 +39,9 @@ int gk20a_bus_init_hw(struct gk20a *g)
{ {
u32 intr_en_mask = 0U; u32 intr_en_mask = 0U;
#ifdef CONFIG_NVGPU_NONSTALL_INTR
nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_BUS, NVGPU_CIC_INTR_ENABLE); nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_BUS, NVGPU_CIC_INTR_ENABLE);
#endif
/* /*
* Note: bus_intr_en_0 is for routing intr to stall tree (mc_intr_0) * Note: bus_intr_en_0 is for routing intr to stall tree (mc_intr_0)

View File

@@ -1,7 +1,7 @@
/* /*
* GV11B fifo * GV11B fifo
* *
* Copyright (c) 2015-2021, NVIDIA CORPORATION. All rights reserved. * Copyright (c) 2015-2022, NVIDIA CORPORATION. All rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -40,8 +40,10 @@ static void enable_fifo_interrupts(struct gk20a *g)
{ {
nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_FIFO, nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_FIFO,
NVGPU_CIC_INTR_ENABLE); NVGPU_CIC_INTR_ENABLE);
#ifdef CONFIG_NVGPU_NONSTALL_INTR
nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_FIFO, nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_FIFO,
NVGPU_CIC_INTR_ENABLE); NVGPU_CIC_INTR_ENABLE);
#endif
g->ops.fifo.intr_0_enable(g, true); g->ops.fifo.intr_0_enable(g, true);
g->ops.fifo.intr_1_enable(g, true); g->ops.fifo.intr_1_enable(g, true);

View File

@@ -426,6 +426,7 @@ u32 nvgpu_cic_mon_intr_stall_isr(struct gk20a *g);
*/ */
void nvgpu_cic_mon_intr_stall_handle(struct gk20a *g); void nvgpu_cic_mon_intr_stall_handle(struct gk20a *g);
#ifdef CONFIG_NVGPU_NONSTALL_INTR
/** /**
* @brief Top half of nonstall interrupt ISR. * @brief Top half of nonstall interrupt ISR.
* *
@@ -452,6 +453,7 @@ u32 nvgpu_cic_mon_intr_nonstall_isr(struct gk20a *g);
* nonstall operations. * nonstall operations.
*/ */
void nvgpu_cic_mon_intr_nonstall_handle(struct gk20a *g); void nvgpu_cic_mon_intr_nonstall_handle(struct gk20a *g);
#endif
/** /**
* @brief Clear the GPU device interrupts at master level. * @brief Clear the GPU device interrupts at master level.
@@ -516,6 +518,7 @@ void nvgpu_cic_mon_intr_mask(struct gk20a *g);
*/ */
void nvgpu_cic_mon_intr_stall_unit_config(struct gk20a *g, u32 unit, bool enable); void nvgpu_cic_mon_intr_stall_unit_config(struct gk20a *g, u32 unit, bool enable);
#ifdef CONFIG_NVGPU_NONSTALL_INTR
/** /**
* @brief Enable/Disable the non-stalling interrupts for given GPU unit at the * @brief Enable/Disable the non-stalling interrupts for given GPU unit at the
* master level. * master level.
@@ -557,6 +560,7 @@ void nvgpu_cic_mon_intr_stall_unit_config(struct gk20a *g, u32 unit, bool enable
* - Release the spinlock g->mc.intr_lock. * - Release the spinlock g->mc.intr_lock.
*/ */
void nvgpu_cic_mon_intr_nonstall_unit_config(struct gk20a *g, u32 unit, bool enable); void nvgpu_cic_mon_intr_nonstall_unit_config(struct gk20a *g, u32 unit, bool enable);
#endif
/** /**
* @brief Disable/Pause the stalling interrupts. * @brief Disable/Pause the stalling interrupts.
@@ -591,6 +595,7 @@ void nvgpu_cic_mon_intr_stall_pause(struct gk20a *g);
*/ */
void nvgpu_cic_mon_intr_stall_resume(struct gk20a *g); void nvgpu_cic_mon_intr_stall_resume(struct gk20a *g);
#ifdef CONFIG_NVGPU_NONSTALL_INTR
/** /**
* @brief Disable/Pause the non-stalling interrupts. * @brief Disable/Pause the non-stalling interrupts.
* *
@@ -625,6 +630,7 @@ void nvgpu_cic_mon_intr_nonstall_pause(struct gk20a *g);
* - Release the spinlock g->mc.intr_lock. * - Release the spinlock g->mc.intr_lock.
*/ */
void nvgpu_cic_mon_intr_nonstall_resume(struct gk20a *g); void nvgpu_cic_mon_intr_nonstall_resume(struct gk20a *g);
#endif
void nvgpu_cic_mon_intr_enable(struct gk20a *g); void nvgpu_cic_mon_intr_enable(struct gk20a *g);

View File

@@ -530,9 +530,6 @@ nvgpu_ltc_remove_support
nvgpu_local_golden_image_get_fault_injection nvgpu_local_golden_image_get_fault_injection
nvgpu_log_msg_impl nvgpu_log_msg_impl
nvgpu_cic_mon_intr_mask nvgpu_cic_mon_intr_mask
nvgpu_cic_mon_intr_nonstall_pause
nvgpu_cic_mon_intr_nonstall_resume
nvgpu_cic_mon_intr_nonstall_unit_config
nvgpu_cic_mon_intr_stall_pause nvgpu_cic_mon_intr_stall_pause
nvgpu_cic_mon_intr_stall_resume nvgpu_cic_mon_intr_stall_resume
nvgpu_cic_mon_intr_stall_unit_config nvgpu_cic_mon_intr_stall_unit_config

View File

@@ -547,9 +547,6 @@ nvgpu_ltc_remove_support
nvgpu_local_golden_image_get_fault_injection nvgpu_local_golden_image_get_fault_injection
nvgpu_log_msg_impl nvgpu_log_msg_impl
nvgpu_cic_mon_intr_mask nvgpu_cic_mon_intr_mask
nvgpu_cic_mon_intr_nonstall_pause
nvgpu_cic_mon_intr_nonstall_resume
nvgpu_cic_mon_intr_nonstall_unit_config
nvgpu_cic_mon_intr_stall_pause nvgpu_cic_mon_intr_stall_pause
nvgpu_cic_mon_intr_stall_resume nvgpu_cic_mon_intr_stall_resume
nvgpu_cic_mon_intr_stall_unit_config nvgpu_cic_mon_intr_stall_unit_config

View File

@@ -1,5 +1,5 @@
/* /*
* Copyright (c) 2019-2021, NVIDIA CORPORATION. All rights reserved. * Copyright (c) 2019-2022, NVIDIA CORPORATION. All rights reserved.
* *
* Permission is hereby granted, free of charge, to any person obtaining a * Permission is hereby granted, free of charge, to any person obtaining a
* copy of this software and associated documentation files (the "Software"), * copy of this software and associated documentation files (the "Software"),
@@ -329,7 +329,7 @@ int test_unit_config(struct unit_module *m, struct gk20a *g, void *args)
unit_return_fail(m, "failed to disable stall intr for unit %u val=0x%08x\n", unit_return_fail(m, "failed to disable stall intr for unit %u val=0x%08x\n",
unit, val); unit, val);
} }
#ifdef CONFIG_NVGPU_NONSTALL_INTR
/* enable nonstall intr */ /* enable nonstall intr */
nvgpu_cic_mon_intr_nonstall_unit_config(g, unit, true); nvgpu_cic_mon_intr_nonstall_unit_config(g, unit, true);
val = nvgpu_posix_io_readl_reg_space(g, NONSTALL_EN_REG); val = nvgpu_posix_io_readl_reg_space(g, NONSTALL_EN_REG);
@@ -345,6 +345,7 @@ int test_unit_config(struct unit_module *m, struct gk20a *g, void *args)
unit_return_fail(m, "failed to disable nonstall intr for unit %u val=0x%08x\n", unit_return_fail(m, "failed to disable nonstall intr for unit %u val=0x%08x\n",
unit, val); unit, val);
} }
#endif
} }
for (i = 0; i < ARRAY_SIZE(invalid_units); i++) { for (i = 0; i < ARRAY_SIZE(invalid_units); i++) {
@@ -366,6 +367,7 @@ int test_unit_config(struct unit_module *m, struct gk20a *g, void *args)
val); val);
} }
#ifdef CONFIG_NVGPU_NONSTALL_INTR
/* negative testing - invalid unit enable set - nonstall */ /* negative testing - invalid unit enable set - nonstall */
nvgpu_posix_io_writel_reg_space(g, NONSTALL_EN_REG, 0x0); /* clear en reg */ nvgpu_posix_io_writel_reg_space(g, NONSTALL_EN_REG, 0x0); /* clear en reg */
nvgpu_cic_mon_intr_nonstall_unit_config(g, invalid_units[i], true); nvgpu_cic_mon_intr_nonstall_unit_config(g, invalid_units[i], true);
@@ -383,6 +385,7 @@ int test_unit_config(struct unit_module *m, struct gk20a *g, void *args)
unit_return_fail(m, "Incorrectly enabled non-stall interrupt for invalid unit, val=0x%08x\n", unit_return_fail(m, "Incorrectly enabled non-stall interrupt for invalid unit, val=0x%08x\n",
val); val);
} }
#endif
} }
return UNIT_SUCCESS; return UNIT_SUCCESS;
@@ -392,7 +395,9 @@ int test_pause_resume_mask(struct unit_module *m, struct gk20a *g, void *args)
{ {
u32 val; u32 val;
u32 expected_stall_val = mc_intr_priv_ring_pending_f(); u32 expected_stall_val = mc_intr_priv_ring_pending_f();
#ifdef CONFIG_NVGPU_NONSTALL_INTR
u32 expected_nonstall_val = mc_intr_pbus_pending_f(); u32 expected_nonstall_val = mc_intr_pbus_pending_f();
#endif
void (*save_func)(struct gk20a *g); void (*save_func)(struct gk20a *g);
/* clear regs */ /* clear regs */
@@ -410,7 +415,9 @@ int test_pause_resume_mask(struct unit_module *m, struct gk20a *g, void *args)
/* enable something to pause and resume */ /* enable something to pause and resume */
nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_PRIV_RING, true); nvgpu_cic_mon_intr_stall_unit_config(g, NVGPU_CIC_INTR_UNIT_PRIV_RING, true);
#ifdef CONFIG_NVGPU_NONSTALL_INTR
nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_BUS, true); nvgpu_cic_mon_intr_nonstall_unit_config(g, NVGPU_CIC_INTR_UNIT_BUS, true);
#endif
/* pause stall */ /* pause stall */
nvgpu_cic_mon_intr_stall_pause(g); nvgpu_cic_mon_intr_stall_pause(g);
@@ -419,12 +426,14 @@ int test_pause_resume_mask(struct unit_module *m, struct gk20a *g, void *args)
unit_return_fail(m, "failed to pause stall intr\n"); unit_return_fail(m, "failed to pause stall intr\n");
} }
#ifdef CONFIG_NVGPU_NONSTALL_INTR
/* pause nonstall */ /* pause nonstall */
nvgpu_cic_mon_intr_nonstall_pause(g); nvgpu_cic_mon_intr_nonstall_pause(g);
val = nvgpu_posix_io_readl_reg_space(g, NONSTALL_EN_REG); val = nvgpu_posix_io_readl_reg_space(g, NONSTALL_EN_REG);
if (val != 0) { if (val != 0) {
unit_return_fail(m, "failed to pause nonstall intr\n"); unit_return_fail(m, "failed to pause nonstall intr\n");
} }
#endif
/* resume stall */ /* resume stall */
nvgpu_posix_io_writel_reg_space(g, STALL_EN_SET_REG, 0x0); nvgpu_posix_io_writel_reg_space(g, STALL_EN_SET_REG, 0x0);
@@ -434,6 +443,7 @@ int test_pause_resume_mask(struct unit_module *m, struct gk20a *g, void *args)
unit_return_fail(m, "failed to resume stall intr\n"); unit_return_fail(m, "failed to resume stall intr\n");
} }
#ifdef CONFIG_NVGPU_NONSTALL_INTR
/* resume nonstall */ /* resume nonstall */
nvgpu_posix_io_writel_reg_space(g, NONSTALL_EN_SET_REG, 0x0); nvgpu_posix_io_writel_reg_space(g, NONSTALL_EN_SET_REG, 0x0);
nvgpu_cic_mon_intr_nonstall_resume(g); nvgpu_cic_mon_intr_nonstall_resume(g);
@@ -441,10 +451,13 @@ int test_pause_resume_mask(struct unit_module *m, struct gk20a *g, void *args)
if (val != expected_nonstall_val) { if (val != expected_nonstall_val) {
unit_return_fail(m, "failed to resume nonstall intr\n"); unit_return_fail(m, "failed to resume nonstall intr\n");
} }
#endif
/* clear regs */ /* clear regs */
nvgpu_posix_io_writel_reg_space(g, STALL_EN_CLEAR_REG, 0x0); nvgpu_posix_io_writel_reg_space(g, STALL_EN_CLEAR_REG, 0x0);
#ifdef CONFIG_NVGPU_NONSTALL_INTR
nvgpu_posix_io_writel_reg_space(g, NONSTALL_EN_CLEAR_REG, 0x0); nvgpu_posix_io_writel_reg_space(g, NONSTALL_EN_CLEAR_REG, 0x0);
#endif
/* mask all */ /* mask all */
nvgpu_cic_mon_intr_mask(g); nvgpu_cic_mon_intr_mask(g);