mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-23 01:50:07 +03:00
Added SW_THRESHOLD policy support for over power protection. JIRA DNVGPU-70 Change-Id: I021f47f234d42be15ddbfd02a22e9299fd486636 Signed-off-by: Lakshmanan M <lm@nvidia.com> Reviewed-on: http://git-master/r/1233051 (cherry picked from commit 301e0ac123a7a65a7f83e5615f3a89e55253a0bd) Reviewed-on: http://git-master/r/1241958 Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com> GVS: Gerrit_Virtual_Submit
437 lines
12 KiB
C
437 lines
12 KiB
C
/*
|
|
* Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
|
|
*
|
|
* This program is free software; you can redistribute it and/or modify it
|
|
* under the terms and conditions of the GNU General Public License,
|
|
* version 2, as published by the Free Software Foundation.
|
|
*
|
|
* This program is distributed in the hope it will be useful, but WITHOUT
|
|
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
|
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
|
* more details.
|
|
*/
|
|
|
|
#ifndef _GPMUIFPMGR_H_
|
|
#define _GPMUIFPMGR_H_
|
|
|
|
#include "gk20a/gk20a.h"
|
|
#include "gk20a/pmu_gk20a.h"
|
|
#include "ctrl/ctrlpmgr.h"
|
|
#include "pmuif/gpmuifboardobj.h"
|
|
#include "gk20a/pmu_common.h"
|
|
|
|
struct nv_pmu_pmgr_i2c_device_desc {
|
|
struct nv_pmu_boardobj super;
|
|
u8 dcb_index;
|
|
u16 i2c_address;
|
|
u32 i2c_flags;
|
|
u8 i2c_port;
|
|
};
|
|
|
|
#define NV_PMU_PMGR_I2C_DEVICE_DESC_TABLE_MAX_DEVICES (32)
|
|
|
|
struct nv_pmu_pmgr_i2c_device_desc_table {
|
|
u32 dev_mask;
|
|
struct nv_pmu_pmgr_i2c_device_desc
|
|
devices[NV_PMU_PMGR_I2C_DEVICE_DESC_TABLE_MAX_DEVICES];
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_device_desc {
|
|
struct nv_pmu_boardobj super;
|
|
u32 power_corr_factor;
|
|
};
|
|
|
|
#define NV_PMU_PMGR_PWR_DEVICE_INA3221_CH_NUM 0x03
|
|
|
|
struct nv_pmu_pmgr_pwr_device_desc_ina3221 {
|
|
struct nv_pmu_pmgr_pwr_device_desc super;
|
|
u8 i2c_dev_idx;
|
|
struct ctrl_pmgr_pwr_device_info_rshunt
|
|
r_shuntm_ohm[NV_PMU_PMGR_PWR_DEVICE_INA3221_CH_NUM];
|
|
u16 configuration;
|
|
u16 mask_enable;
|
|
u32 event_mask;
|
|
u16 curr_correct_m;
|
|
s16 curr_correct_b;
|
|
};
|
|
|
|
union nv_pmu_pmgr_pwr_device_desc_union {
|
|
struct nv_pmu_boardobj board_obj;
|
|
struct nv_pmu_pmgr_pwr_device_desc pwr_dev;
|
|
struct nv_pmu_pmgr_pwr_device_desc_ina3221 ina3221;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_device_ba_info {
|
|
bool b_initialized_and_used;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_device_desc_table_header {
|
|
struct nv_pmu_boardobjgrp_e32 super;
|
|
struct nv_pmu_pmgr_pwr_device_ba_info ba_info;
|
|
};
|
|
|
|
NV_PMU_MAKE_ALIGNED_STRUCT(nv_pmu_pmgr_pwr_device_desc_table_header,
|
|
sizeof(struct nv_pmu_pmgr_pwr_device_desc_table_header));
|
|
NV_PMU_MAKE_ALIGNED_UNION(nv_pmu_pmgr_pwr_device_desc_union,
|
|
sizeof(union nv_pmu_pmgr_pwr_device_desc_union));
|
|
|
|
struct nv_pmu_pmgr_pwr_device_desc_table {
|
|
union nv_pmu_pmgr_pwr_device_desc_table_header_aligned hdr;
|
|
union nv_pmu_pmgr_pwr_device_desc_union_aligned
|
|
devices[CTRL_PMGR_PWR_DEVICES_MAX_DEVICES];
|
|
};
|
|
|
|
union nv_pmu_pmgr_pwr_device_dmem_size {
|
|
union nv_pmu_pmgr_pwr_device_desc_table_header_aligned pwr_device_hdr;
|
|
union nv_pmu_pmgr_pwr_device_desc_union_aligned pwr_device;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_channel {
|
|
struct nv_pmu_boardobj super;
|
|
u8 pwr_rail;
|
|
u8 ch_idx;
|
|
u32 volt_fixedu_v;
|
|
u32 pwr_corr_slope;
|
|
s32 pwr_corr_offsetm_w;
|
|
u32 curr_corr_slope;
|
|
s32 curr_corr_offsetm_a;
|
|
u32 dependent_ch_mask;
|
|
};
|
|
|
|
#define NV_PMU_PMGR_PWR_CHANNEL_MAX_CHANNELS 16
|
|
|
|
#define NV_PMU_PMGR_PWR_CHANNEL_MAX_CHRELATIONSHIPS 16
|
|
|
|
struct nv_pmu_pmgr_pwr_channel_sensor {
|
|
struct nv_pmu_pmgr_pwr_channel super;
|
|
u8 pwr_dev_idx;
|
|
u8 pwr_dev_prov_idx;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_channel_pmu_compactible {
|
|
u8 pmu_compactible_data[56];
|
|
};
|
|
|
|
union nv_pmu_pmgr_pwr_channel_union {
|
|
struct nv_pmu_boardobj board_obj;
|
|
struct nv_pmu_pmgr_pwr_channel pwr_channel;
|
|
struct nv_pmu_pmgr_pwr_channel_sensor sensor;
|
|
struct nv_pmu_pmgr_pwr_channel_pmu_compactible pmu_pwr_channel;
|
|
};
|
|
|
|
#define NV_PMU_PMGR_PWR_MONITOR_TYPE_NO_POLLING 0x02
|
|
|
|
struct nv_pmu_pmgr_pwr_monitor_pstate {
|
|
u32 hw_channel_mask;
|
|
};
|
|
|
|
union nv_pmu_pmgr_pwr_monitor_type_specific {
|
|
struct nv_pmu_pmgr_pwr_monitor_pstate pstate;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_chrelationship_pmu_compactible {
|
|
u8 pmu_compactible_data[28];
|
|
};
|
|
|
|
union nv_pmu_pmgr_pwr_chrelationship_union {
|
|
struct nv_pmu_boardobj board_obj;
|
|
struct nv_pmu_pmgr_pwr_chrelationship_pmu_compactible pmu_pwr_chrelationship;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_channel_header {
|
|
struct nv_pmu_boardobjgrp_e32 super;
|
|
u8 type;
|
|
union nv_pmu_pmgr_pwr_monitor_type_specific type_specific;
|
|
u8 sample_count;
|
|
u16 sampling_periodms;
|
|
u16 sampling_period_low_powerms;
|
|
u32 total_gpu_power_channel_mask;
|
|
u32 physical_channel_mask;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_chrelationship_header {
|
|
struct nv_pmu_boardobjgrp_e32 super;
|
|
};
|
|
|
|
NV_PMU_MAKE_ALIGNED_STRUCT(nv_pmu_pmgr_pwr_channel_header,
|
|
sizeof(struct nv_pmu_pmgr_pwr_channel_header));
|
|
NV_PMU_MAKE_ALIGNED_STRUCT(nv_pmu_pmgr_pwr_chrelationship_header,
|
|
sizeof(struct nv_pmu_pmgr_pwr_chrelationship_header));
|
|
NV_PMU_MAKE_ALIGNED_UNION(nv_pmu_pmgr_pwr_chrelationship_union,
|
|
sizeof(union nv_pmu_pmgr_pwr_chrelationship_union));
|
|
NV_PMU_MAKE_ALIGNED_UNION(nv_pmu_pmgr_pwr_channel_union,
|
|
sizeof(union nv_pmu_pmgr_pwr_channel_union));
|
|
|
|
struct nv_pmu_pmgr_pwr_channel_desc {
|
|
union nv_pmu_pmgr_pwr_channel_header_aligned hdr;
|
|
union nv_pmu_pmgr_pwr_channel_union_aligned
|
|
channels[NV_PMU_PMGR_PWR_CHANNEL_MAX_CHANNELS];
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_chrelationship_desc {
|
|
union nv_pmu_pmgr_pwr_chrelationship_header_aligned hdr;
|
|
union nv_pmu_pmgr_pwr_chrelationship_union_aligned
|
|
ch_rels[NV_PMU_PMGR_PWR_CHANNEL_MAX_CHRELATIONSHIPS];
|
|
};
|
|
|
|
union nv_pmu_pmgr_pwr_monitor_dmem_size {
|
|
union nv_pmu_pmgr_pwr_channel_header_aligned channel_hdr;
|
|
union nv_pmu_pmgr_pwr_channel_union_aligned channel;
|
|
union nv_pmu_pmgr_pwr_chrelationship_header_aligned ch_rels_hdr;
|
|
union nv_pmu_pmgr_pwr_chrelationship_union_aligned ch_rels;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_monitor_pack {
|
|
struct nv_pmu_pmgr_pwr_channel_desc channels;
|
|
struct nv_pmu_pmgr_pwr_chrelationship_desc ch_rels;
|
|
};
|
|
|
|
#define NV_PMU_PMGR_PWR_POLICY_MAX_POLICIES 32
|
|
|
|
#define NV_PMU_PMGR_PWR_POLICY_MAX_POLICY_RELATIONSHIPS 32
|
|
|
|
struct nv_pmu_pmgr_pwr_policy {
|
|
struct nv_pmu_boardobj super;
|
|
u8 ch_idx;
|
|
u8 num_limit_inputs;
|
|
u8 limit_unit;
|
|
u8 sample_mult;
|
|
u32 limit_curr;
|
|
u32 limit_min;
|
|
u32 limit_max;
|
|
struct ctrl_pmgr_pwr_policy_info_integral integral;
|
|
enum ctrl_pmgr_pwr_policy_filter_type filter_type;
|
|
union ctrl_pmgr_pwr_policy_filter_param filter_param;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_policy_hw_threshold {
|
|
struct nv_pmu_pmgr_pwr_policy super;
|
|
u8 threshold_idx;
|
|
u8 low_threshold_idx;
|
|
bool b_use_low_threshold;
|
|
u16 low_threshold_value;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_policy_sw_threshold {
|
|
struct nv_pmu_pmgr_pwr_policy super;
|
|
u8 threshold_idx;
|
|
u8 low_threshold_idx;
|
|
bool b_use_low_threshold;
|
|
u16 low_threshold_value;
|
|
u8 event_id;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_policy_pmu_compactible {
|
|
u8 pmu_compactible_data[68];
|
|
};
|
|
|
|
union nv_pmu_pmgr_pwr_policy_union {
|
|
struct nv_pmu_boardobj board_obj;
|
|
struct nv_pmu_pmgr_pwr_policy pwr_policy;
|
|
struct nv_pmu_pmgr_pwr_policy_hw_threshold hw_threshold;
|
|
struct nv_pmu_pmgr_pwr_policy_sw_threshold sw_threshold;
|
|
struct nv_pmu_pmgr_pwr_policy_pmu_compactible pmu_pwr_policy;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_policy_relationship_pmu_compactible {
|
|
u8 pmu_compactible_data[24];
|
|
};
|
|
|
|
union nv_pmu_pmgr_pwr_policy_relationship_union {
|
|
struct nv_pmu_boardobj board_obj;
|
|
struct nv_pmu_pmgr_pwr_policy_relationship_pmu_compactible pmu_pwr_relationship;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_violation_pmu_compactible {
|
|
u8 pmu_compactible_data[16];
|
|
};
|
|
|
|
union nv_pmu_pmgr_pwr_violation_union {
|
|
struct nv_pmu_boardobj board_obj;
|
|
struct nv_pmu_pmgr_pwr_violation_pmu_compactible violation;
|
|
};
|
|
|
|
#define NV_PMU_PMGR_PWR_POLICY_DESC_TABLE_VERSION_3X 0x30
|
|
|
|
NV_PMU_MAKE_ALIGNED_UNION(nv_pmu_pmgr_pwr_policy_union,
|
|
sizeof(union nv_pmu_pmgr_pwr_policy_union));
|
|
NV_PMU_MAKE_ALIGNED_UNION(nv_pmu_pmgr_pwr_policy_relationship_union,
|
|
sizeof(union nv_pmu_pmgr_pwr_policy_relationship_union));
|
|
|
|
#define NV_PMU_PERF_DOMAIN_GROUP_MAX_GROUPS 2
|
|
|
|
struct nv_pmu_perf_domain_group_limits
|
|
{
|
|
u32 values[NV_PMU_PERF_DOMAIN_GROUP_MAX_GROUPS];
|
|
} ;
|
|
|
|
#define NV_PMU_PMGR_RESERVED_PWR_POLICY_MASK_COUNT 0x6
|
|
|
|
struct nv_pmu_pmgr_pwr_policy_desc_header {
|
|
struct nv_pmu_boardobjgrp_e32 super;
|
|
u8 version;
|
|
bool b_enabled;
|
|
u8 low_sampling_mult;
|
|
u8 semantic_policy_tbl[CTRL_PMGR_PWR_POLICY_IDX_NUM_INDEXES];
|
|
u16 base_sample_period;
|
|
u16 min_client_sample_period;
|
|
u32 reserved_pmu_policy_mask[NV_PMU_PMGR_RESERVED_PWR_POLICY_MASK_COUNT];
|
|
struct nv_pmu_perf_domain_group_limits global_ceiling;
|
|
};
|
|
|
|
NV_PMU_MAKE_ALIGNED_STRUCT(nv_pmu_pmgr_pwr_policy_desc_header ,
|
|
sizeof(struct nv_pmu_pmgr_pwr_policy_desc_header ));
|
|
|
|
struct nv_pmu_pmgr_pwr_policyrel_desc_header {
|
|
struct nv_pmu_boardobjgrp_e32 super;
|
|
};
|
|
|
|
NV_PMU_MAKE_ALIGNED_STRUCT(nv_pmu_pmgr_pwr_policyrel_desc_header,
|
|
sizeof(struct nv_pmu_pmgr_pwr_policyrel_desc_header));
|
|
|
|
struct nv_pmu_pmgr_pwr_violation_desc_header {
|
|
struct nv_pmu_boardobjgrp_e32 super;
|
|
};
|
|
|
|
NV_PMU_MAKE_ALIGNED_STRUCT(nv_pmu_pmgr_pwr_violation_desc_header,
|
|
sizeof(struct nv_pmu_pmgr_pwr_violation_desc_header));
|
|
NV_PMU_MAKE_ALIGNED_UNION(nv_pmu_pmgr_pwr_violation_union,
|
|
sizeof(union nv_pmu_pmgr_pwr_violation_union));
|
|
|
|
struct nv_pmu_pmgr_pwr_policy_desc {
|
|
union nv_pmu_pmgr_pwr_policy_desc_header_aligned hdr;
|
|
union nv_pmu_pmgr_pwr_policy_union_aligned
|
|
policies[NV_PMU_PMGR_PWR_POLICY_MAX_POLICIES];
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_policyrel_desc {
|
|
union nv_pmu_pmgr_pwr_policyrel_desc_header_aligned hdr;
|
|
union nv_pmu_pmgr_pwr_policy_relationship_union_aligned
|
|
policy_rels[NV_PMU_PMGR_PWR_POLICY_MAX_POLICY_RELATIONSHIPS];
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_violation_desc {
|
|
union nv_pmu_pmgr_pwr_violation_desc_header_aligned hdr;
|
|
union nv_pmu_pmgr_pwr_violation_union_aligned
|
|
violations[CTRL_PMGR_PWR_VIOLATION_MAX];
|
|
};
|
|
|
|
union nv_pmu_pmgr_pwr_policy_dmem_size {
|
|
union nv_pmu_pmgr_pwr_policy_desc_header_aligned policy_hdr;
|
|
union nv_pmu_pmgr_pwr_policy_union_aligned policy;
|
|
union nv_pmu_pmgr_pwr_policyrel_desc_header_aligned policy_rels_hdr;
|
|
union nv_pmu_pmgr_pwr_policy_relationship_union_aligned policy_rels;
|
|
union nv_pmu_pmgr_pwr_violation_desc_header_aligned violation_hdr;
|
|
union nv_pmu_pmgr_pwr_violation_union_aligned violation;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_pwr_policy_pack {
|
|
struct nv_pmu_pmgr_pwr_policy_desc policies;
|
|
struct nv_pmu_pmgr_pwr_policyrel_desc policy_rels;
|
|
struct nv_pmu_pmgr_pwr_violation_desc violations;
|
|
};
|
|
|
|
#define NV_PMU_PMGR_CMD_ID_SET_OBJECT (0x00000000)
|
|
|
|
#define NV_PMU_PMGR_MSG_ID_QUERY (0x00000002)
|
|
|
|
#define NV_PMU_PMGR_CMD_ID_PWR_DEVICES_QUERY (0x00000001)
|
|
|
|
#define NV_PMU_PMGR_CMD_ID_LOAD (0x00000006)
|
|
|
|
#define NV_PMU_PMGR_CMD_ID_UNLOAD (0x00000007)
|
|
|
|
struct nv_pmu_pmgr_cmd_set_object {
|
|
u8 cmd_type;
|
|
u8 pad[2];
|
|
u8 object_type;
|
|
struct nv_pmu_allocation object;
|
|
};
|
|
|
|
#define NV_PMU_PMGR_SET_OBJECT_ALLOC_OFFSET (0x04)
|
|
|
|
#define NV_PMU_PMGR_OBJECT_I2C_DEVICE_DESC_TABLE (0x00000000)
|
|
|
|
#define NV_PMU_PMGR_OBJECT_PWR_DEVICE_DESC_TABLE (0x00000001)
|
|
|
|
#define NV_PMU_PMGR_OBJECT_PWR_MONITOR (0x00000002)
|
|
|
|
#define NV_PMU_PMGR_OBJECT_PWR_POLICY (0x00000005)
|
|
|
|
struct nv_pmu_pmgr_pwr_devices_query_payload {
|
|
struct {
|
|
u32 powerm_w;
|
|
u32 voltageu_v;
|
|
u32 currentm_a;
|
|
} devices[CTRL_PMGR_PWR_DEVICES_MAX_DEVICES];
|
|
};
|
|
|
|
struct nv_pmu_pmgr_cmd_pwr_devices_query {
|
|
u8 cmd_type;
|
|
u8 pad[3];
|
|
u32 dev_mask;
|
|
struct nv_pmu_allocation payload;
|
|
};
|
|
|
|
#define NV_PMU_PMGR_PWR_DEVICES_QUERY_ALLOC_OFFSET (0x08)
|
|
|
|
struct nv_pmu_pmgr_cmd_load {
|
|
u8 cmd_type;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_cmd_unload {
|
|
u8 cmd_type;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_cmd {
|
|
union {
|
|
u8 cmd_type;
|
|
struct nv_pmu_pmgr_cmd_set_object set_object;
|
|
struct nv_pmu_pmgr_cmd_pwr_devices_query pwr_dev_query;
|
|
struct nv_pmu_pmgr_cmd_load load;
|
|
struct nv_pmu_pmgr_cmd_unload unload;
|
|
};
|
|
};
|
|
|
|
#define NV_PMU_PMGR_MSG_ID_SET_OBJECT (0x00000000)
|
|
|
|
#define NV_PMU_PMGR_MSG_ID_LOAD (0x00000004)
|
|
|
|
#define NV_PMU_PMGR_MSG_ID_UNLOAD (0x00000005)
|
|
|
|
struct nv_pmu_pmgr_msg_set_object {
|
|
u8 msg_type;
|
|
bool b_success;
|
|
flcn_status flcnstatus;
|
|
u8 object_type;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_msg_query {
|
|
u8 msg_type;
|
|
bool b_success;
|
|
flcn_status flcnstatus;
|
|
u8 cmd_type;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_msg_load {
|
|
u8 msg_type;
|
|
bool b_success;
|
|
flcn_status flcnstatus;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_msg_unload {
|
|
u8 msg_type;
|
|
};
|
|
|
|
struct nv_pmu_pmgr_msg {
|
|
union {
|
|
u8 msg_type;
|
|
struct nv_pmu_pmgr_msg_set_object set_object;
|
|
struct nv_pmu_pmgr_msg_query query;
|
|
struct nv_pmu_pmgr_msg_load load;
|
|
struct nv_pmu_pmgr_msg_unload unload;
|
|
};
|
|
};
|
|
|
|
#endif
|