gpu: nvgpu: Add ce halt function

This is adding CE halt fuction to reset CE properly
by setting stall req and waiting for stallack.

Bug 200641946

Change-Id: I501ccf68a4f6fe95911e73fa2eb65bde93a9f3e9
Signed-off-by: Dinesh T <dt@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvgpu/+/2678366
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
Dinesh T
2022-03-08 19:18:22 +00:00
committed by mobile promotions
parent 3bfab5df3f
commit e4cf52123f
8 changed files with 28 additions and 3 deletions

View File

@@ -527,6 +527,9 @@ void nvgpu_engine_reset(struct gk20a *g, u32 engine_id)
* Simple case first: reset a copy engine. * Simple case first: reset a copy engine.
*/ */
if (nvgpu_device_is_ce(g, dev)) { if (nvgpu_device_is_ce(g, dev)) {
if (g->ops.ce.halt_engine != NULL) {
g->ops.ce.halt_engine(g, dev);
}
err = nvgpu_mc_reset_dev(g, dev); err = nvgpu_mc_reset_dev(g, dev);
if (g->ops.ce.request_idle != NULL) { if (g->ops.ce.request_idle != NULL) {
/* /*

View File

@@ -2,7 +2,7 @@
* *
* Volta GPU series copy engine * Volta GPU series copy engine
* *
* Copyright (c) 2016-2019, NVIDIA CORPORATION. All rights reserved. * Copyright (c) 2016-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"),
@@ -26,10 +26,11 @@
#define NVGPU_CE_GV11B_H #define NVGPU_CE_GV11B_H
struct gk20a; struct gk20a;
struct nvgpu_device;
void gv11b_ce_mthd_buffer_fault_in_bar2_fault(struct gk20a *g); void gv11b_ce_mthd_buffer_fault_in_bar2_fault(struct gk20a *g);
u32 gv11b_ce_get_num_pce(struct gk20a *g); u32 gv11b_ce_get_num_pce(struct gk20a *g);
void gv11b_ce_stall_isr(struct gk20a *g, u32 inst_id, u32 pri_base); void gv11b_ce_stall_isr(struct gk20a *g, u32 inst_id, u32 pri_base);
void gv11b_ce_init_prod_values(struct gk20a *g); void gv11b_ce_init_prod_values(struct gk20a *g);
void gv11b_ce_halt_engine(struct gk20a *g, const struct nvgpu_device *dev);
#endif /* NVGPU_CE_GV11B_H */ #endif /* NVGPU_CE_GV11B_H */

View File

@@ -25,6 +25,7 @@
#include <nvgpu/io.h> #include <nvgpu/io.h>
#include <nvgpu/log.h> #include <nvgpu/log.h>
#include <nvgpu/bitops.h> #include <nvgpu/bitops.h>
#include <nvgpu/device.h>
#include <nvgpu/gk20a.h> #include <nvgpu/gk20a.h>
#include <nvgpu/nvgpu_err.h> #include <nvgpu/nvgpu_err.h>
@@ -118,3 +119,18 @@ void gv11b_ce_init_prod_values(struct gk20a *g)
nvgpu_writel(g, ce_lce_opt_r(lce), reg_val); nvgpu_writel(g, ce_lce_opt_r(lce), reg_val);
} }
} }
void gv11b_ce_halt_engine(struct gk20a *g, const struct nvgpu_device *dev)
{
u32 reg_val;
reg_val = nvgpu_readl(g, ce_lce_engctl_r(dev->inst_id));
reg_val |= ce_lce_engctl_stallreq_true_f();
nvgpu_writel(g, ce_lce_engctl_r(dev->inst_id), reg_val);
reg_val = nvgpu_readl(g, ce_lce_engctl_r(dev->inst_id));
if ((reg_val & ce_lce_engctl_stallack_true_f()) == 0U) {
nvgpu_err(g, "The CE engine %u is not idle"
"while reset", dev->inst_id);
}
}

View File

@@ -429,6 +429,7 @@ static const struct gops_ce ga100_ops_ce = {
.get_num_pce = gv11b_ce_get_num_pce, .get_num_pce = gv11b_ce_get_num_pce,
.mthd_buffer_fault_in_bar2_fault = gv11b_ce_mthd_buffer_fault_in_bar2_fault, .mthd_buffer_fault_in_bar2_fault = gv11b_ce_mthd_buffer_fault_in_bar2_fault,
.init_prod_values = gv11b_ce_init_prod_values, .init_prod_values = gv11b_ce_init_prod_values,
.halt_engine = gv11b_ce_halt_engine,
.request_idle = NULL, .request_idle = NULL,
}; };

View File

@@ -403,6 +403,7 @@ static const struct gops_ce ga10b_ops_ce = {
.get_num_pce = gv11b_ce_get_num_pce, .get_num_pce = gv11b_ce_get_num_pce,
.mthd_buffer_fault_in_bar2_fault = gv11b_ce_mthd_buffer_fault_in_bar2_fault, .mthd_buffer_fault_in_bar2_fault = gv11b_ce_mthd_buffer_fault_in_bar2_fault,
.init_prod_values = gv11b_ce_init_prod_values, .init_prod_values = gv11b_ce_init_prod_values,
.halt_engine = gv11b_ce_halt_engine,
.request_idle = ga10b_ce_request_idle, .request_idle = ga10b_ce_request_idle,
}; };

View File

@@ -316,6 +316,7 @@ static const struct gops_ce gv11b_ops_ce = {
.get_num_pce = gv11b_ce_get_num_pce, .get_num_pce = gv11b_ce_get_num_pce,
.mthd_buffer_fault_in_bar2_fault = gv11b_ce_mthd_buffer_fault_in_bar2_fault, .mthd_buffer_fault_in_bar2_fault = gv11b_ce_mthd_buffer_fault_in_bar2_fault,
.init_prod_values = gv11b_ce_init_prod_values, .init_prod_values = gv11b_ce_init_prod_values,
.halt_engine = gv11b_ce_halt_engine,
.request_idle = NULL, .request_idle = NULL,
}; };

View File

@@ -365,6 +365,7 @@ static const struct gops_ce tu104_ops_ce = {
.get_num_pce = gv11b_ce_get_num_pce, .get_num_pce = gv11b_ce_get_num_pce,
.mthd_buffer_fault_in_bar2_fault = gv11b_ce_mthd_buffer_fault_in_bar2_fault, .mthd_buffer_fault_in_bar2_fault = gv11b_ce_mthd_buffer_fault_in_bar2_fault,
.init_prod_values = gv11b_ce_init_prod_values, .init_prod_values = gv11b_ce_init_prod_values,
.halt_engine = gv11b_ce_halt_engine,
.request_idle = NULL, .request_idle = NULL,
}; };

View File

@@ -30,7 +30,7 @@
* CE HAL interface. * CE HAL interface.
*/ */
struct gk20a; struct gk20a;
struct nvgpu_device;
/** /**
* CE HAL operations. * CE HAL operations.
* *
@@ -132,6 +132,7 @@ struct gops_ce {
int (*ce_init_support)(struct gk20a *g); int (*ce_init_support)(struct gk20a *g);
void (*set_pce2lce_mapping)(struct gk20a *g); void (*set_pce2lce_mapping)(struct gk20a *g);
void (*init_prod_values)(struct gk20a *g); void (*init_prod_values)(struct gk20a *g);
void (*halt_engine)(struct gk20a *g, const struct nvgpu_device *dev);
void (*request_idle)(struct gk20a *g); void (*request_idle)(struct gk20a *g);
/* /*