mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 17:36:20 +03:00
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:
committed by
mobile promotions
parent
3bfab5df3f
commit
e4cf52123f
@@ -527,6 +527,9 @@ void nvgpu_engine_reset(struct gk20a *g, u32 engine_id)
|
||||
* Simple case first: reset a copy engine.
|
||||
*/
|
||||
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);
|
||||
if (g->ops.ce.request_idle != NULL) {
|
||||
/*
|
||||
|
||||
@@ -2,7 +2,7 @@
|
||||
*
|
||||
* 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
|
||||
* copy of this software and associated documentation files (the "Software"),
|
||||
@@ -26,10 +26,11 @@
|
||||
#define NVGPU_CE_GV11B_H
|
||||
|
||||
struct gk20a;
|
||||
struct nvgpu_device;
|
||||
|
||||
void gv11b_ce_mthd_buffer_fault_in_bar2_fault(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_init_prod_values(struct gk20a *g);
|
||||
|
||||
void gv11b_ce_halt_engine(struct gk20a *g, const struct nvgpu_device *dev);
|
||||
#endif /* NVGPU_CE_GV11B_H */
|
||||
|
||||
@@ -25,6 +25,7 @@
|
||||
#include <nvgpu/io.h>
|
||||
#include <nvgpu/log.h>
|
||||
#include <nvgpu/bitops.h>
|
||||
#include <nvgpu/device.h>
|
||||
#include <nvgpu/gk20a.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);
|
||||
}
|
||||
}
|
||||
|
||||
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);
|
||||
}
|
||||
}
|
||||
|
||||
@@ -429,6 +429,7 @@ static const struct gops_ce ga100_ops_ce = {
|
||||
.get_num_pce = gv11b_ce_get_num_pce,
|
||||
.mthd_buffer_fault_in_bar2_fault = gv11b_ce_mthd_buffer_fault_in_bar2_fault,
|
||||
.init_prod_values = gv11b_ce_init_prod_values,
|
||||
.halt_engine = gv11b_ce_halt_engine,
|
||||
.request_idle = NULL,
|
||||
};
|
||||
|
||||
|
||||
@@ -403,6 +403,7 @@ static const struct gops_ce ga10b_ops_ce = {
|
||||
.get_num_pce = gv11b_ce_get_num_pce,
|
||||
.mthd_buffer_fault_in_bar2_fault = gv11b_ce_mthd_buffer_fault_in_bar2_fault,
|
||||
.init_prod_values = gv11b_ce_init_prod_values,
|
||||
.halt_engine = gv11b_ce_halt_engine,
|
||||
.request_idle = ga10b_ce_request_idle,
|
||||
};
|
||||
|
||||
|
||||
@@ -316,6 +316,7 @@ static const struct gops_ce gv11b_ops_ce = {
|
||||
.get_num_pce = gv11b_ce_get_num_pce,
|
||||
.mthd_buffer_fault_in_bar2_fault = gv11b_ce_mthd_buffer_fault_in_bar2_fault,
|
||||
.init_prod_values = gv11b_ce_init_prod_values,
|
||||
.halt_engine = gv11b_ce_halt_engine,
|
||||
.request_idle = NULL,
|
||||
};
|
||||
|
||||
|
||||
@@ -365,6 +365,7 @@ static const struct gops_ce tu104_ops_ce = {
|
||||
.get_num_pce = gv11b_ce_get_num_pce,
|
||||
.mthd_buffer_fault_in_bar2_fault = gv11b_ce_mthd_buffer_fault_in_bar2_fault,
|
||||
.init_prod_values = gv11b_ce_init_prod_values,
|
||||
.halt_engine = gv11b_ce_halt_engine,
|
||||
.request_idle = NULL,
|
||||
};
|
||||
|
||||
|
||||
@@ -30,7 +30,7 @@
|
||||
* CE HAL interface.
|
||||
*/
|
||||
struct gk20a;
|
||||
|
||||
struct nvgpu_device;
|
||||
/**
|
||||
* CE HAL operations.
|
||||
*
|
||||
@@ -132,6 +132,7 @@ struct gops_ce {
|
||||
int (*ce_init_support)(struct gk20a *g);
|
||||
void (*set_pce2lce_mapping)(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);
|
||||
|
||||
/*
|
||||
|
||||
Reference in New Issue
Block a user