diff options
author | Vijayakumar <vsubbu@nvidia.com> | 2016-11-04 07:17:51 -0400 |
---|---|---|
committer | Deepak Nibade <dnibade@nvidia.com> | 2016-12-27 04:56:52 -0500 |
commit | 8cc67f60644a117eec868fc1b11da9a60d2915d7 (patch) | |
tree | 5b32619b84feed4d9925c519ffe1dac5fd7b3775 /drivers/gpu/nvgpu/clk/clk.c | |
parent | 30bf630bded30376a929345247b134b60db1c9f5 (diff) |
gpu: nvgpu: add clock freq controller support
JIRA DNVGPU-170
1) Add clock frequency controller VBIOS structure definitions
2) Parse VBIOS tables and build boardobj structures for clock frequency
controller.
3) send clock frequency controller data structures to PMU
4) implement public function to send load/unload command to pmu
to enable/disable clock frequency controller support
Change-Id: I2f37f6a94f342b6fcc71bb802e6e440a0a454486
Signed-off-by: Vijayakumar <vsubbu@nvidia.com>
Reviewed-on: http://git-master/r/1248209
Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Tested-by: Terje Bergstrom <tbergstrom@nvidia.com>
(cherry picked from commit ed3e27933f21e10b3d7a5257f1b751526945bd07)
Reviewed-on: http://git-master/r/1270897
GVS: Gerrit_Virtual_Submit
Diffstat (limited to 'drivers/gpu/nvgpu/clk/clk.c')
-rw-r--r-- | drivers/gpu/nvgpu/clk/clk.c | 72 |
1 files changed, 72 insertions, 0 deletions
diff --git a/drivers/gpu/nvgpu/clk/clk.c b/drivers/gpu/nvgpu/clk/clk.c index 07c80e22..dffbefec 100644 --- a/drivers/gpu/nvgpu/clk/clk.c +++ b/drivers/gpu/nvgpu/clk/clk.c | |||
@@ -47,6 +47,78 @@ static void clkrpc_pmucmdhandler(struct gk20a *g, struct pmu_msg *msg, | |||
47 | phandlerparams->success = 1; | 47 | phandlerparams->success = 1; |
48 | } | 48 | } |
49 | 49 | ||
50 | int clk_pmu_freq_controller_load(struct gk20a *g, bool bload) | ||
51 | { | ||
52 | struct pmu_cmd cmd; | ||
53 | struct pmu_msg msg; | ||
54 | struct pmu_payload payload = { {0} }; | ||
55 | u32 status; | ||
56 | u32 seqdesc; | ||
57 | struct nv_pmu_clk_rpc rpccall = {0}; | ||
58 | struct clkrpc_pmucmdhandler_params handler = {0}; | ||
59 | struct nv_pmu_clk_load *clkload; | ||
60 | struct clk_freq_controllers *pclk_freq_controllers; | ||
61 | struct ctrl_boardobjgrp_mask_e32 *load_mask; | ||
62 | |||
63 | pclk_freq_controllers = &g->clk_pmu.clk_freq_controllers; | ||
64 | rpccall.function = NV_PMU_CLK_RPC_ID_LOAD; | ||
65 | clkload = &rpccall.params.clk_load; | ||
66 | clkload->feature = NV_NV_PMU_CLK_LOAD_FEATURE_FREQ_CONTROLLER; | ||
67 | clkload->action_mask = bload ? | ||
68 | NV_NV_PMU_CLK_LOAD_ACTION_MASK_FREQ_CONTROLLER_CALLBACK_YES : | ||
69 | NV_NV_PMU_CLK_LOAD_ACTION_MASK_FREQ_CONTROLLER_CALLBACK_NO; | ||
70 | |||
71 | load_mask = &rpccall.params.clk_load.payload.freq_controllers.load_mask; | ||
72 | |||
73 | status = boardobjgrpmask_export( | ||
74 | &pclk_freq_controllers->freq_ctrl_load_mask.super, | ||
75 | pclk_freq_controllers->freq_ctrl_load_mask.super.bitcount, | ||
76 | &load_mask->super); | ||
77 | |||
78 | cmd.hdr.unit_id = PMU_UNIT_CLK; | ||
79 | cmd.hdr.size = (u32)sizeof(struct nv_pmu_clk_cmd) + | ||
80 | (u32)sizeof(struct pmu_hdr); | ||
81 | |||
82 | cmd.cmd.clk.cmd_type = NV_PMU_CLK_CMD_ID_RPC; | ||
83 | msg.hdr.size = sizeof(struct pmu_msg); | ||
84 | |||
85 | payload.in.buf = (u8 *)&rpccall; | ||
86 | payload.in.size = (u32)sizeof(struct nv_pmu_clk_rpc); | ||
87 | payload.in.fb_size = PMU_CMD_SUBMIT_PAYLOAD_PARAMS_FB_SIZE_UNUSED; | ||
88 | payload.in.offset = NV_PMU_CLK_CMD_RPC_ALLOC_OFFSET; | ||
89 | |||
90 | payload.out.buf = (u8 *)&rpccall; | ||
91 | payload.out.size = (u32)sizeof(struct nv_pmu_clk_rpc); | ||
92 | payload.out.fb_size = PMU_CMD_SUBMIT_PAYLOAD_PARAMS_FB_SIZE_UNUSED; | ||
93 | payload.out.offset = NV_PMU_CLK_MSG_RPC_ALLOC_OFFSET; | ||
94 | |||
95 | handler.prpccall = &rpccall; | ||
96 | handler.success = 0; | ||
97 | status = gk20a_pmu_cmd_post(g, &cmd, NULL, &payload, | ||
98 | PMU_COMMAND_QUEUE_LPQ, | ||
99 | clkrpc_pmucmdhandler, (void *)&handler, | ||
100 | &seqdesc, ~0); | ||
101 | |||
102 | if (status) { | ||
103 | gk20a_err(dev_from_gk20a(g), | ||
104 | "unable to post clk RPC cmd %x", | ||
105 | cmd.cmd.clk.cmd_type); | ||
106 | goto done; | ||
107 | } | ||
108 | |||
109 | pmu_wait_message_cond(&g->pmu, | ||
110 | gk20a_get_gr_idle_timeout(g), | ||
111 | &handler.success, 1); | ||
112 | |||
113 | if (handler.success == 0) { | ||
114 | gk20a_err(dev_from_gk20a(g), "rpc call to load freq cntlr cal failed"); | ||
115 | status = -EINVAL; | ||
116 | } | ||
117 | |||
118 | done: | ||
119 | return status; | ||
120 | } | ||
121 | |||
50 | u32 clk_pmu_vin_load(struct gk20a *g) | 122 | u32 clk_pmu_vin_load(struct gk20a *g) |
51 | { | 123 | { |
52 | struct pmu_cmd cmd; | 124 | struct pmu_cmd cmd; |