mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-22 09:12:24 +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.
|
* 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) {
|
||||||
/*
|
/*
|
||||||
|
|||||||
@@ -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 */
|
||||||
|
|||||||
@@ -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);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -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);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|||||||
Reference in New Issue
Block a user