diff options
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; |