mirror of
git://nv-tegra.nvidia.com/linux-nvgpu.git
synced 2025-12-24 10:34:43 +03:00
Modification of the ARBITER clocks to be P-State aware Up to now the arbiter just considered the whole range of the GPC and MCLK domains, which could end up on illegal combinations of MCLK, GPC2CLK, and set the SYSCLK and XBARCLK domains below their minimum VCO The following has been implemented: (1) Modified VF tables to add which PState are supported on each point. (2) Return and store the current PState on the arbiter state. (3) Modified logic to prevent illegal combinations of MCLK and GPC2CLK. (4) Modified logic to prevent setting VF points for XBAR and SYS domains below VCO limits. (5) Modified voltage calculation to account for increased values of XBAR and SYS on some VF points. (6) Modified arbiter clock target logic to prevent an application that has not requested a particular VF point to set target to default targets. (7) Remove unnecesary mutexes from critical path JIRA DNVGPU-182 JIRA DNVGPU-183 Change-Id: I3d1c30903278f848681b8da833a867835acc99bb Signed-off-by: David Nieto <dmartineznie@nvidia.com> Reviewed-on: http://git-master/r/1247937 (cherry picked from commit b8bcc07eb3b5b70ec1ee19ace237df99d6170138) Reviewed-on: http://git-master/r/1268063 Tested-by: Thomas Fleury <tfleury@nvidia.com> Reviewed-by: Vijayakumar Subbu <vsubbu@nvidia.com> Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
119 lines
3.4 KiB
C
119 lines
3.4 KiB
C
/*
|
|
* general clock structures & definitions
|
|
*
|
|
* 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 _CLK_H_
|
|
#define _CLK_H_
|
|
|
|
#include "clk_vin.h"
|
|
#include "clk_fll.h"
|
|
#include "clk_domain.h"
|
|
#include "clk_prog.h"
|
|
#include "clk_vf_point.h"
|
|
#include "clk_mclk.h"
|
|
#include "gk20a/gk20a.h"
|
|
|
|
#define NV_PERF_DOMAIN_4X_CLOCK_DOMAIN_SKIP 0x10
|
|
#define NV_PERF_DOMAIN_4X_CLOCK_DOMAIN_MASK 0x1F
|
|
#define NV_PERF_DOMAIN_4X_CLOCK_DOMAIN_SHIFT 0
|
|
|
|
/* clock related defines for GPUs supporting clock control from pmu*/
|
|
struct clk_pmupstate {
|
|
struct avfsvinobjs avfs_vinobjs;
|
|
struct avfsfllobjs avfs_fllobjs;
|
|
struct clk_domains clk_domainobjs;
|
|
struct clk_progs clk_progobjs;
|
|
struct clk_vf_points clk_vf_pointobjs;
|
|
struct clk_mclk_state clk_mclk;
|
|
};
|
|
|
|
struct clockentry {
|
|
u8 vbios_clk_domain;
|
|
u8 clk_which;
|
|
u8 perf_index;
|
|
u32 api_clk_domain;
|
|
};
|
|
|
|
struct set_fll_clk {
|
|
u32 voltuv;
|
|
u16 gpc2clkmhz;
|
|
u32 current_regime_id_gpc;
|
|
u32 target_regime_id_gpc;
|
|
u16 sys2clkmhz;
|
|
u32 current_regime_id_sys;
|
|
u32 target_regime_id_sys;
|
|
u16 xbar2clkmhz;
|
|
u32 current_regime_id_xbar;
|
|
u32 target_regime_id_xbar;
|
|
};
|
|
|
|
#define NV_PERF_HEADER_4X_CLOCKS_DOMAINS_MAX_NUMCLKS 9
|
|
|
|
struct vbios_clock_domain {
|
|
u8 clock_type;
|
|
u8 num_domains;
|
|
struct clockentry clock_entry[NV_PERF_HEADER_4X_CLOCKS_DOMAINS_MAX_NUMCLKS];
|
|
};
|
|
|
|
struct vbios_clocks_table_1x_hal_clock_entry {
|
|
enum nv_pmu_clk_clkwhich domain;
|
|
bool b_noise_aware_capable;
|
|
};
|
|
|
|
#define NV_PERF_HEADER_4X_CLOCKS_DOMAINS_4_GPC2CLK 0
|
|
#define NV_PERF_HEADER_4X_CLOCKS_DOMAINS_4_XBAR2CLK 1
|
|
#define NV_PERF_HEADER_4X_CLOCKS_DOMAINS_4_DRAMCLK 2
|
|
#define NV_PERF_HEADER_4X_CLOCKS_DOMAINS_4_SYS2CLK 3
|
|
#define NV_PERF_HEADER_4X_CLOCKS_DOMAINS_4_HUB2CLK 4
|
|
#define NV_PERF_HEADER_4X_CLOCKS_DOMAINS_4_MSDCLK 5
|
|
#define NV_PERF_HEADER_4X_CLOCKS_DOMAINS_4_PWRCLK 6
|
|
#define NV_PERF_HEADER_4X_CLOCKS_DOMAINS_4_DISPCLK 7
|
|
#define NV_PERF_HEADER_4X_CLOCKS_DOMAINS_4_NUMCLKS 8
|
|
|
|
#define PERF_CLK_MCLK 0
|
|
#define PERF_CLK_DISPCLK 1
|
|
#define PERF_CLK_GPC2CLK 2
|
|
#define PERF_CLK_HOSTCLK 3
|
|
#define PERF_CLK_LTC2CLK 4
|
|
#define PERF_CLK_SYS2CLK 5
|
|
#define PERF_CLK_HUB2CLK 6
|
|
#define PERF_CLK_LEGCLK 7
|
|
#define PERF_CLK_MSDCLK 8
|
|
#define PERF_CLK_XCLK 9
|
|
#define PERF_CLK_PWRCLK 10
|
|
#define PERF_CLK_XBAR2CLK 11
|
|
#define PERF_CLK_PCIEGENCLK 12
|
|
#define PERF_CLK_NUM 13
|
|
|
|
#define BOOT_GPC2CLK_MHZ 2581
|
|
|
|
u32 clk_pmu_vin_load(struct gk20a *g);
|
|
u32 clk_domain_print_vf_table(struct gk20a *g, u32 clkapidomain);
|
|
u32 clk_domain_get_f_or_v(
|
|
struct gk20a *g,
|
|
u32 clkapidomain,
|
|
u16 *pclkmhz,
|
|
u32 *pvoltuv,
|
|
u8 railidx
|
|
);
|
|
u32 clk_domain_get_f_points(
|
|
struct gk20a *g,
|
|
u32 clkapidomain,
|
|
u32 *fpointscount,
|
|
u16 *freqpointsinmhz
|
|
);
|
|
int clk_get_fll_clks(struct gk20a *g, struct set_fll_clk *fllclk);
|
|
int clk_set_fll_clks(struct gk20a *g, struct set_fll_clk *fllclk);
|
|
|
|
#endif
|