mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-24 10:34:43 +03:00
gpu: nvgpu: PMU sequences init update
Allocate space at runtime for PMU sequences, this helps to reduce the size of nvgpu_pmu struct when LS_PMU support is not required. Allocation happens at pmu early init stage & will deinit at remove_support stage. And also removed some unused seq functions as part of CL JIRA NVGPU-1972 Change-Id: Ib1ba983b476ddf937b08ef96e130ece2645b314c Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com> Reviewed-on: https://git-master.nvidia.com/r/2110104 GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com> Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com> Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
This commit is contained in:
committed by
mobile promotions
parent
44f6c10947
commit
fa9050d28b
@@ -600,7 +600,7 @@ int nvgpu_pmu_cmd_post(struct gk20a *g, struct pmu_cmd *cmd,
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
err = nvgpu_pmu_seq_acquire(g, &pmu->sequences, &seq, callback,
|
||||
err = nvgpu_pmu_seq_acquire(g, pmu->sequences, &seq, callback,
|
||||
cb_param);
|
||||
if (err != 0) {
|
||||
return err;
|
||||
@@ -624,7 +624,7 @@ int nvgpu_pmu_cmd_post(struct gk20a *g, struct pmu_cmd *cmd,
|
||||
err = pmu_fbq_cmd_setup(g, cmd, fb_queue, payload, seq);
|
||||
if (err != 0) {
|
||||
nvgpu_err(g, "FBQ cmd setup failed");
|
||||
nvgpu_pmu_seq_release(g, &pmu->sequences, seq);
|
||||
nvgpu_pmu_seq_release(g, pmu->sequences, seq);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
@@ -651,7 +651,7 @@ int nvgpu_pmu_cmd_post(struct gk20a *g, struct pmu_cmd *cmd,
|
||||
pmu->fw.ops.allocation_set_dmem_size(pmu,
|
||||
pmu->fw.ops.get_seq_out_alloc_ptr(seq), 0);
|
||||
|
||||
nvgpu_pmu_seq_release(g, &pmu->sequences, seq);
|
||||
nvgpu_pmu_seq_release(g, pmu->sequences, seq);
|
||||
goto exit;
|
||||
}
|
||||
|
||||
|
||||
@@ -161,7 +161,7 @@ static int pmu_response_handle(struct nvgpu_pmu *pmu,
|
||||
|
||||
nvgpu_log_fn(g, " ");
|
||||
|
||||
seq = nvgpu_pmu_sequences_get_seq(&pmu->sequences, msg->hdr.seq_id);
|
||||
seq = nvgpu_pmu_sequences_get_seq(pmu->sequences, msg->hdr.seq_id);
|
||||
state = nvgpu_pmu_seq_get_state(seq);
|
||||
id = nvgpu_pmu_seq_get_id(seq);
|
||||
|
||||
@@ -190,7 +190,7 @@ exit:
|
||||
|
||||
nvgpu_pmu_seq_callback(g, seq, msg, err);
|
||||
|
||||
nvgpu_pmu_seq_release(g, &pmu->sequences, seq);
|
||||
nvgpu_pmu_seq_release(g, pmu->sequences, seq);
|
||||
|
||||
/* TBD: notify client waiting for available dmem */
|
||||
|
||||
|
||||
@@ -25,60 +25,17 @@
|
||||
#include <nvgpu/errno.h>
|
||||
#include <nvgpu/kmem.h>
|
||||
#include <nvgpu/bug.h>
|
||||
#include <nvgpu/pmu.h>
|
||||
|
||||
void *nvgpu_get_pmu_sequence_in_alloc_ptr_v3(struct pmu_sequence *seq)
|
||||
{
|
||||
return (void *)(&seq->in_v3);
|
||||
}
|
||||
struct nvgpu_pmu;
|
||||
|
||||
void *nvgpu_get_pmu_sequence_in_alloc_ptr_v1(struct pmu_sequence *seq)
|
||||
{
|
||||
return (void *)(&seq->in_v1);
|
||||
}
|
||||
|
||||
void *nvgpu_get_pmu_sequence_out_alloc_ptr_v3(struct pmu_sequence *seq)
|
||||
{
|
||||
return (void *)(&seq->out_v3);
|
||||
}
|
||||
|
||||
void *nvgpu_get_pmu_sequence_out_alloc_ptr_v1(struct pmu_sequence *seq)
|
||||
{
|
||||
return (void *)(&seq->out_v1);
|
||||
}
|
||||
|
||||
int nvgpu_pmu_sequences_alloc(struct gk20a *g,
|
||||
struct pmu_sequences *sequences)
|
||||
{
|
||||
int err;
|
||||
|
||||
sequences->seq = nvgpu_kzalloc(g, PMU_MAX_NUM_SEQUENCES *
|
||||
sizeof(struct pmu_sequence));
|
||||
if (sequences->seq == NULL) {
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
err = nvgpu_mutex_init(&sequences->pmu_seq_lock);
|
||||
if (err != 0) {
|
||||
nvgpu_kfree(g, sequences->seq);
|
||||
return err;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void nvgpu_pmu_sequences_free(struct gk20a *g,
|
||||
struct pmu_sequences *sequences)
|
||||
{
|
||||
nvgpu_mutex_destroy(&sequences->pmu_seq_lock);
|
||||
if (sequences->seq != NULL) {
|
||||
nvgpu_kfree(g, sequences->seq);
|
||||
}
|
||||
}
|
||||
|
||||
void nvgpu_pmu_sequences_init(struct pmu_sequences *sequences)
|
||||
void nvgpu_pmu_sequences_sw_setup(struct gk20a *g, struct nvgpu_pmu *pmu,
|
||||
struct pmu_sequences *sequences)
|
||||
{
|
||||
u32 i;
|
||||
|
||||
nvgpu_log_fn(g, " ");
|
||||
|
||||
(void) memset(sequences->seq, 0,
|
||||
sizeof(struct pmu_sequence) * PMU_MAX_NUM_SEQUENCES);
|
||||
(void) memset(sequences->pmu_seq_tbl, 0,
|
||||
@@ -89,6 +46,63 @@ void nvgpu_pmu_sequences_init(struct pmu_sequences *sequences)
|
||||
}
|
||||
}
|
||||
|
||||
int nvgpu_pmu_sequences_init(struct gk20a *g, struct nvgpu_pmu *pmu,
|
||||
struct pmu_sequences **sequences_p)
|
||||
{
|
||||
int err = 0;
|
||||
struct pmu_sequences *sequences;
|
||||
|
||||
nvgpu_log_fn(g, " ");
|
||||
|
||||
if (*sequences_p != NULL) {
|
||||
/* skip alloc/reinit for unrailgate sequence */
|
||||
nvgpu_pmu_dbg(g, "skip sequences init for unrailgate sequence");
|
||||
goto exit;
|
||||
}
|
||||
|
||||
sequences = (struct pmu_sequences *)
|
||||
nvgpu_kzalloc(g, sizeof(struct pmu_sequences));
|
||||
if (sequences == NULL) {
|
||||
err = -ENOMEM;
|
||||
goto exit;
|
||||
}
|
||||
|
||||
sequences->seq = (struct pmu_sequence *)
|
||||
nvgpu_kzalloc(g, PMU_MAX_NUM_SEQUENCES *
|
||||
sizeof(struct pmu_sequence));
|
||||
if (sequences->seq == NULL) {
|
||||
nvgpu_kfree(g, sequences);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
err = nvgpu_mutex_init(&sequences->pmu_seq_lock);
|
||||
if (err != 0) {
|
||||
nvgpu_kfree(g, sequences->seq);
|
||||
nvgpu_kfree(g, sequences);
|
||||
return err;
|
||||
}
|
||||
|
||||
*sequences_p = sequences;
|
||||
exit:
|
||||
return err;
|
||||
}
|
||||
|
||||
void nvgpu_pmu_sequences_deinit(struct gk20a *g, struct nvgpu_pmu *pmu,
|
||||
struct pmu_sequences *sequences)
|
||||
{
|
||||
nvgpu_log_fn(g, " ");
|
||||
|
||||
if (sequences == NULL) {
|
||||
return;
|
||||
}
|
||||
|
||||
nvgpu_mutex_destroy(&sequences->pmu_seq_lock);
|
||||
if (sequences->seq != NULL) {
|
||||
nvgpu_kfree(g, sequences->seq);
|
||||
}
|
||||
nvgpu_kfree(g, sequences);
|
||||
}
|
||||
|
||||
void nvgpu_pmu_seq_payload_free(struct gk20a *g, struct pmu_sequence *seq)
|
||||
{
|
||||
nvgpu_log_fn(g, " ");
|
||||
|
||||
@@ -161,9 +161,11 @@ static int nvgpu_init_pmu_setup_sw(struct gk20a *g)
|
||||
}
|
||||
}
|
||||
|
||||
/* set default value to sequences */
|
||||
nvgpu_pmu_sequences_sw_setup(g, pmu, pmu->sequences);
|
||||
|
||||
if (pmu->sw_ready) {
|
||||
nvgpu_pmu_mutexes_init(&pmu->mutexes);
|
||||
nvgpu_pmu_sequences_init(&pmu->sequences);
|
||||
|
||||
nvgpu_log_fn(g, "skip init");
|
||||
goto skip_init;
|
||||
@@ -176,23 +178,11 @@ static int nvgpu_init_pmu_setup_sw(struct gk20a *g)
|
||||
|
||||
nvgpu_pmu_mutexes_init(&pmu->mutexes);
|
||||
|
||||
err = nvgpu_pmu_sequences_alloc(g, &pmu->sequences);
|
||||
if (err != 0) {
|
||||
goto err_free_mutex;
|
||||
}
|
||||
|
||||
nvgpu_pmu_sequences_init(&pmu->sequences);
|
||||
|
||||
if (err != 0) {
|
||||
nvgpu_err(g, "failed to allocate memory");
|
||||
goto err_free_seq;
|
||||
}
|
||||
|
||||
if (nvgpu_is_enabled(g, NVGPU_SUPPORT_PMU_SUPER_SURFACE)) {
|
||||
err = nvgpu_pmu_super_surface_buf_alloc(g,
|
||||
pmu, pmu->super_surface);
|
||||
if (err != 0) {
|
||||
goto err_free_seq;
|
||||
goto err_free_mutex;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -213,8 +203,7 @@ skip_init:
|
||||
nvgpu_dma_unmap_free(vm, nvgpu_pmu_super_surface_mem(g,
|
||||
pmu, pmu->super_surface));
|
||||
}
|
||||
err_free_seq:
|
||||
nvgpu_pmu_sequences_free(g, &pmu->sequences);
|
||||
|
||||
err_free_mutex:
|
||||
nvgpu_pmu_mutexes_free(g, &pmu->mutexes);
|
||||
err:
|
||||
@@ -360,7 +349,7 @@ static void nvgpu_remove_pmu_support(struct nvgpu_pmu *pmu)
|
||||
nvgpu_pmu_pg_deinit(g, pmu, pmu->pg);
|
||||
|
||||
nvgpu_mutex_destroy(&pmu->isr_mutex);
|
||||
nvgpu_pmu_sequences_free(g, &pmu->sequences);
|
||||
nvgpu_pmu_sequences_deinit(g, pmu, pmu->sequences);
|
||||
nvgpu_pmu_mutexes_free(g, &pmu->mutexes);
|
||||
}
|
||||
|
||||
@@ -402,6 +391,12 @@ int nvgpu_early_init_pmu_sw(struct gk20a *g, struct nvgpu_pmu *pmu)
|
||||
if (err != 0) {
|
||||
goto init_failed;
|
||||
}
|
||||
|
||||
err = nvgpu_pmu_sequences_init(g, pmu, &pmu->sequences);
|
||||
if (err != 0) {
|
||||
goto init_failed;
|
||||
}
|
||||
|
||||
if (g->can_elpg) {
|
||||
err = nvgpu_pmu_pg_init(g, pmu, &pmu->pg);
|
||||
if (err != 0) {
|
||||
|
||||
@@ -155,7 +155,7 @@ struct nvgpu_pmu {
|
||||
struct pmu_sha1_gid gid_info;
|
||||
|
||||
struct pmu_queues queues;
|
||||
struct pmu_sequences sequences;
|
||||
struct pmu_sequences *sequences;
|
||||
|
||||
struct pmu_mutexes mutexes;
|
||||
|
||||
|
||||
@@ -30,6 +30,7 @@ struct nvgpu_engine_fb_queue;
|
||||
struct nvgpu_mem;
|
||||
struct pmu_msg;
|
||||
struct gk20a;
|
||||
struct nvgpu_pmu;;
|
||||
|
||||
#define PMU_MAX_NUM_SEQUENCES (256U)
|
||||
#define PMU_SEQ_BIT_SHIFT (5U)
|
||||
@@ -91,16 +92,13 @@ struct pmu_sequences {
|
||||
unsigned long pmu_seq_tbl[PMU_SEQ_TBL_SIZE];
|
||||
};
|
||||
|
||||
void *nvgpu_get_pmu_sequence_in_alloc_ptr_v3(struct pmu_sequence *seq);
|
||||
void *nvgpu_get_pmu_sequence_in_alloc_ptr_v1(struct pmu_sequence *seq);
|
||||
void *nvgpu_get_pmu_sequence_out_alloc_ptr_v3(struct pmu_sequence *seq);
|
||||
void *nvgpu_get_pmu_sequence_out_alloc_ptr_v1(struct pmu_sequence *seq);
|
||||
void nvgpu_pmu_sequences_sw_setup(struct gk20a *g, struct nvgpu_pmu *pmu,
|
||||
struct pmu_sequences *sequences);
|
||||
int nvgpu_pmu_sequences_init(struct gk20a *g, struct nvgpu_pmu *pmu,
|
||||
struct pmu_sequences **sequences_p);
|
||||
void nvgpu_pmu_sequences_deinit(struct gk20a *g, struct nvgpu_pmu *pmu,
|
||||
struct pmu_sequences *sequences);
|
||||
|
||||
int nvgpu_pmu_sequences_alloc(struct gk20a *g,
|
||||
struct pmu_sequences *sequences);
|
||||
void nvgpu_pmu_sequences_free(struct gk20a *g,
|
||||
struct pmu_sequences *sequences);
|
||||
void nvgpu_pmu_sequences_init(struct pmu_sequences *sequences);
|
||||
void nvgpu_pmu_seq_payload_free(struct gk20a *g, struct pmu_sequence *seq);
|
||||
int nvgpu_pmu_seq_acquire(struct gk20a *g,
|
||||
struct pmu_sequences *sequences,
|
||||
|
||||
Reference in New Issue
Block a user