From d3f96dfa96a8aafe6f5035e2ed24425141e4202e Mon Sep 17 00:00:00 2001 From: Mahantesh Kumbar Date: Wed, 14 Feb 2018 14:31:01 +0530 Subject: gpu: nvgpu: gv10x volt rail boardobj changes - Created volt ops under pmu_ver to support volt_set_voltage, volt_get_voltage & volt_send_load_cmd_to_pmu. - Renamed volt load, set_voltage & get_voltage gp10x method names. - Added new volt load, set_voltage & get_voltage methods for gv10x using RPC & added code to handle ack in pmu_rpc_handler() along with struct rail_list changes. - Updated volt ops of gp106 & gv100 to point to respective methods. - Added member volt_dev_idx_ipc_vmin & volt_scale_exp_pwr_equ_idx to "struct nv_pmu_volt_volt_rail_boardobj_set" & "struct voltage_rail" made changes to update members as needed. - Added member volt_scale_exp_pwr_equ_idx to "struct vbios_voltage_rail_table_1x_entry" to read value from VBIOS table & update rail boardobj set interface. - Defines for volt RPC "NV_PMU_RPC_ID_VOLT_*" - Define struct's volt load, set_voltage & get_voltage to execute volt RPC. Change-Id: I4a41adcf7536468beaa8a73f551b1d608aabd161 Signed-off-by: Mahantesh Kumbar Reviewed-on: https://git-master.nvidia.com/r/1659728 Reviewed-by: Automatic_Commit_Validation_User GVS: Gerrit_Virtual_Submit Reviewed-by: Vijayakumar Subbu Reviewed-by: mobile promotions Tested-by: mobile promotions --- drivers/gpu/nvgpu/volt/volt_pmu.c | 110 +++++++++++++++++++++++++++++++++++--- 1 file changed, 104 insertions(+), 6 deletions(-) (limited to 'drivers/gpu/nvgpu/volt/volt_pmu.c') diff --git a/drivers/gpu/nvgpu/volt/volt_pmu.c b/drivers/gpu/nvgpu/volt/volt_pmu.c index 915db9a7..4608918c 100644 --- a/drivers/gpu/nvgpu/volt/volt_pmu.c +++ b/drivers/gpu/nvgpu/volt/volt_pmu.c @@ -1,5 +1,5 @@ /* - * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved. + * Copyright (c) 2016-2018, 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"), @@ -115,7 +115,7 @@ volt_pmu_rpc_execute: return status; } -u32 volt_pmu_send_load_cmd_to_pmu(struct gk20a *g) +u32 nvgpu_volt_send_load_cmd_to_pmu_gp10x(struct gk20a *g) { struct nv_pmu_volt_rpc rpc_call = { 0 }; u32 status = 0; @@ -131,7 +131,23 @@ u32 volt_pmu_send_load_cmd_to_pmu(struct gk20a *g) return status; } -static u32 volt_rail_get_voltage(struct gk20a *g, +u32 nvgpu_volt_send_load_cmd_to_pmu_gv10x(struct gk20a *g) +{ + struct nvgpu_pmu *pmu = &g->pmu; + struct nv_pmu_rpc_struct_volt_load rpc; + u32 status = 0; + + memset(&rpc, 0, sizeof(struct nv_pmu_rpc_struct_volt_load)); + PMU_RPC_EXECUTE(status, pmu, VOLT, LOAD, &rpc, 0); + if (status) { + nvgpu_err(g, "Failed to execute RPC status=0x%x", + status); + } + + return status; +} + +u32 nvgpu_volt_rail_get_voltage_gp10x(struct gk20a *g, u8 volt_domain, u32 *pvoltage_uv) { struct nv_pmu_volt_rpc rpc_call = { 0 }; @@ -165,6 +181,37 @@ static u32 volt_rail_get_voltage(struct gk20a *g, return status; } +u32 nvgpu_volt_rail_get_voltage_gv10x(struct gk20a *g, + u8 volt_domain, u32 *pvoltage_uv) +{ + struct nvgpu_pmu *pmu = &g->pmu; + struct nv_pmu_rpc_struct_volt_volt_rail_get_voltage rpc; + u32 status = 0; + u8 rail_idx; + + rail_idx = volt_rail_volt_domain_convert_to_idx(g, volt_domain); + if ((rail_idx == CTRL_VOLT_RAIL_INDEX_INVALID) || + (!VOLT_RAIL_INDEX_IS_VALID(&g->perf_pmu.volt, rail_idx))) { + nvgpu_err(g, + "failed: volt_domain = %d, voltage rail table = %d.", + volt_domain, rail_idx); + return -EINVAL; + } + + memset(&rpc, 0, + sizeof(struct nv_pmu_rpc_struct_volt_volt_rail_get_voltage)); + rpc.rail_idx = rail_idx; + + PMU_RPC_EXECUTE_CPB(status, pmu, VOLT, VOLT_SET_VOLTAGE, &rpc, 0); + if (status) { + nvgpu_err(g, "Failed to execute RPC status=0x%x", + status); + } + + *pvoltage_uv = rpc.voltage_uv; + + return status; +} static u32 volt_policy_set_voltage(struct gk20a *g, u8 client_id, struct ctrl_perf_volt_rail_list *prail_list) @@ -217,9 +264,54 @@ exit: return status; } -u32 volt_set_voltage(struct gk20a *g, u32 logic_voltage_uv, u32 sram_voltage_uv) +static u32 volt_set_voltage_gv10x_rpc(struct gk20a *g, u8 client_id, + struct ctrl_volt_volt_rail_list_v1 *prail_list) { - u32 status = 0; + struct nvgpu_pmu *pmu = &g->pmu; + struct nv_pmu_rpc_struct_volt_volt_set_voltage rpc; + int status = 0; + + memset(&rpc, 0, sizeof(struct nv_pmu_rpc_struct_volt_volt_set_voltage)); + rpc.client_id = 0x1; + rpc.rail_list = *prail_list; + + PMU_RPC_EXECUTE(status, pmu, VOLT, VOLT_SET_VOLTAGE, &rpc, 0); + if (status) { + nvgpu_err(g, "Failed to execute RPC status=0x%x", + status); + } + + return status; +} + +u32 nvgpu_volt_set_voltage_gv10x(struct gk20a *g, u32 logic_voltage_uv, + u32 sram_voltage_uv) +{ + int status = 0; + struct ctrl_volt_volt_rail_list_v1 rail_list = { 0 }; + + rail_list.num_rails = RAIL_COUNT; + rail_list.rails[0].rail_idx = + volt_rail_volt_domain_convert_to_idx(g, + CTRL_VOLT_DOMAIN_LOGIC); + rail_list.rails[0].voltage_uv = logic_voltage_uv; + rail_list.rails[0].voltage_min_noise_unaware_uv = logic_voltage_uv; + rail_list.rails[1].rail_idx = + volt_rail_volt_domain_convert_to_idx(g, + CTRL_VOLT_DOMAIN_SRAM); + rail_list.rails[1].voltage_uv = sram_voltage_uv; + rail_list.rails[1].voltage_min_noise_unaware_uv = sram_voltage_uv; + + status = volt_set_voltage_gv10x_rpc(g, + CTRL_VOLT_POLICY_CLIENT_PERF_CORE_VF_SEQ, &rail_list); + + return status; +} + +u32 nvgpu_volt_set_voltage_gp10x(struct gk20a *g, u32 logic_voltage_uv, + u32 sram_voltage_uv) +{ + int status = 0; struct ctrl_perf_volt_rail_list rail_list = { 0 }; rail_list.num_rails = RAIL_COUNT; @@ -234,12 +326,18 @@ u32 volt_set_voltage(struct gk20a *g, u32 logic_voltage_uv, u32 sram_voltage_uv) CTRL_VOLT_POLICY_CLIENT_PERF_CORE_VF_SEQ, &rail_list); return status; +} +u32 volt_set_voltage(struct gk20a *g, u32 logic_voltage_uv, u32 sram_voltage_uv) +{ + return g->ops.pmu_ver.volt.volt_set_voltage(g, + logic_voltage_uv, sram_voltage_uv); } u32 volt_get_voltage(struct gk20a *g, u32 volt_domain, u32 *voltage_uv) { - return volt_rail_get_voltage(g, volt_domain, voltage_uv); + return g->ops.pmu_ver.volt.volt_get_voltage(g, + volt_domain, voltage_uv); } static int volt_policy_set_noiseaware_vmin(struct gk20a *g, -- cgit v1.2.2