summaryrefslogtreecommitdiffstats
path: root/drivers
diff options
context:
space:
mode:
authorMahantesh Kumbar <mkumbar@nvidia.com>2017-02-14 02:22:20 -0500
committermobile promotions <svcmobile_promotions@nvidia.com>2017-02-15 22:33:28 -0500
commitd465504534b2ec7ab0be190fc98b24e1b77634e2 (patch)
tree3ee1a90cb49cb2a3df3b39c79b37bdbcddeffe97 /drivers
parent907adfd785e3a3582b2649c48bf4c32f41745e3f (diff)
gpu: nvgpu: Remove PMU gm204/gm206 support
-Created new methods for PMU gp106 whichever dependent on gm206. -Deleted pmu_gm206.c/h files & removed its involvement from dependent files. Change-Id: Ic578da53bff362efb3e142962275227787206233 Signed-off-by: Mahantesh Kumbar <mkumbar@nvidia.com> Reviewed-on: http://git-master/r/1304492 Reviewed-by: svccoveritychecker <svccoveritychecker@nvidia.com> GVS: Gerrit_Virtual_Submit Reviewed-by: Terje Bergstrom <tbergstrom@nvidia.com>
Diffstat (limited to 'drivers')
-rw-r--r--drivers/gpu/nvgpu/Makefile.nvgpu1
-rw-r--r--drivers/gpu/nvgpu/gm206/hal_gm206.c4
-rw-r--r--drivers/gpu/nvgpu/gm206/pmu_gm206.c174
-rw-r--r--drivers/gpu/nvgpu/gm206/pmu_gm206.h22
-rw-r--r--drivers/gpu/nvgpu/gp106/acr_gp106.c6
-rw-r--r--drivers/gpu/nvgpu/gp106/pmu_gp106.c110
-rw-r--r--drivers/gpu/nvgpu/gp106/sec2_gp106.c4
7 files changed, 110 insertions, 211 deletions
diff --git a/drivers/gpu/nvgpu/Makefile.nvgpu b/drivers/gpu/nvgpu/Makefile.nvgpu
index 5c2bbb79..a07289ce 100644
--- a/drivers/gpu/nvgpu/Makefile.nvgpu
+++ b/drivers/gpu/nvgpu/Makefile.nvgpu
@@ -88,7 +88,6 @@ nvgpu-y := \
88 gm206/gr_gm206.o \ 88 gm206/gr_gm206.o \
89 gm206/acr_gm206.o \ 89 gm206/acr_gm206.o \
90 gm206/mm_gm206.o \ 90 gm206/mm_gm206.o \
91 gm206/pmu_gm206.o \
92 gm206/ce_gm206.o \ 91 gm206/ce_gm206.o \
93 boardobj/boardobj.o \ 92 boardobj/boardobj.o \
94 boardobj/boardobjgrp.o \ 93 boardobj/boardobjgrp.o \
diff --git a/drivers/gpu/nvgpu/gm206/hal_gm206.c b/drivers/gpu/nvgpu/gm206/hal_gm206.c
index 6ecbbfed..d6c73b53 100644
--- a/drivers/gpu/nvgpu/gm206/hal_gm206.c
+++ b/drivers/gpu/nvgpu/gm206/hal_gm206.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. 2 * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved.
3 * 3 *
4 * This program is free software; you can redistribute it and/or modify it 4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License, 5 * under the terms and conditions of the GNU General Public License,
@@ -37,7 +37,6 @@
37#include "gm20b/clk_gm20b.h" 37#include "gm20b/clk_gm20b.h"
38#include "gm20b/debug_gm20b.h" 38#include "gm20b/debug_gm20b.h"
39#include "gm206/mm_gm206.h" 39#include "gm206/mm_gm206.h"
40#include "gm206/pmu_gm206.h"
41#include "gm206/acr_gm206.h" 40#include "gm206/acr_gm206.h"
42 41
43#include <nvgpu/hw/gm206/hw_proj_gm206.h> 42#include <nvgpu/hw/gm206/hw_proj_gm206.h>
@@ -190,7 +189,6 @@ int gm206_init_hal(struct gk20a *g)
190 gm206_init_ce(gops); 189 gm206_init_ce(gops);
191 gm20b_init_gr_ctx(gops); 190 gm20b_init_gr_ctx(gops);
192 gm206_init_mm(gops); 191 gm206_init_mm(gops);
193 gm206_init_pmu_ops(gops);
194 gm20b_init_clk_ops(gops); 192 gm20b_init_clk_ops(gops);
195 gm20b_init_regops(gops); 193 gm20b_init_regops(gops);
196 gm20b_init_debug_ops(gops); 194 gm20b_init_debug_ops(gops);
diff --git a/drivers/gpu/nvgpu/gm206/pmu_gm206.c b/drivers/gpu/nvgpu/gm206/pmu_gm206.c
deleted file mode 100644
index ffcf0bf1..00000000
--- a/drivers/gpu/nvgpu/gm206/pmu_gm206.c
+++ /dev/null
@@ -1,174 +0,0 @@
1/*
2 * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 */
13
14#include <linux/delay.h>
15
16#include "gk20a/gk20a.h"
17#include "gk20a/pmu_gk20a.h"
18#include "gk20a/pmu_gk20a.h"
19#include "gm20b/acr_gm20b.h"
20#include "gm206/acr_gm206.h"
21#include "gm20b/pmu_gm20b.h"
22#include "gm206/pmu_gm206.h"
23
24#include <nvgpu/hw/gm206/hw_gr_gm206.h>
25#include <nvgpu/hw/gm206/hw_pwr_gm206.h>
26
27#define gm206_dbg_pmu(fmt, arg...) \
28 gk20a_dbg(gpu_dbg_pmu, fmt, ##arg)
29
30bool gm206_is_lazy_bootstrap(u32 falcon_id)
31{
32 bool enable_status = false;
33
34 switch (falcon_id) {
35 case LSF_FALCON_ID_FECS:
36 enable_status = true;
37 break;
38 case LSF_FALCON_ID_GPCCS:
39 enable_status = true;
40 break;
41 default:
42 break;
43 }
44
45 return enable_status;
46}
47
48bool gm206_is_priv_load(u32 falcon_id)
49{
50 bool enable_status = false;
51
52 switch (falcon_id) {
53 case LSF_FALCON_ID_FECS:
54 enable_status = true;
55 break;
56 case LSF_FALCON_ID_GPCCS:
57 enable_status = true;
58 break;
59 default:
60 break;
61 }
62
63 return enable_status;
64}
65
66static void gm206_pmu_load_multiple_falcons(struct gk20a *g, u32 falconidmask,
67 u32 flags)
68{
69 struct pmu_gk20a *pmu = &g->pmu;
70 struct pmu_cmd cmd;
71 u32 seq;
72
73 gk20a_dbg_fn("");
74
75 gm206_dbg_pmu("wprinit status = %x\n", g->ops.pmu.lspmuwprinitdone);
76 if (g->ops.pmu.lspmuwprinitdone) {
77 /* send message to load FECS falcon */
78 memset(&cmd, 0, sizeof(struct pmu_cmd));
79 cmd.hdr.unit_id = PMU_UNIT_ACR;
80 cmd.hdr.size = PMU_CMD_HDR_SIZE +
81 sizeof(struct pmu_acr_cmd_bootstrap_multiple_falcons);
82 cmd.cmd.acr.boot_falcons.cmd_type =
83 PMU_ACR_CMD_ID_BOOTSTRAP_MULTIPLE_FALCONS;
84 cmd.cmd.acr.boot_falcons.flags = flags;
85 cmd.cmd.acr.boot_falcons.falconidmask =
86 falconidmask;
87 cmd.cmd.acr.boot_falcons.usevamask = 0;
88 cmd.cmd.acr.boot_falcons.wprvirtualbase.lo = 0;
89 cmd.cmd.acr.boot_falcons.wprvirtualbase.hi = 0;
90
91 gm206_dbg_pmu("PMU_ACR_CMD_ID_BOOTSTRAP_MULTIPLE_FALCONS:%x\n",
92 falconidmask);
93 gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_HPQ,
94 pmu_handle_fecs_boot_acr_msg, pmu, &seq, ~0);
95 }
96
97 gk20a_dbg_fn("done");
98}
99
100int gm206_load_falcon_ucode(struct gk20a *g, u32 falconidmask)
101{
102 u32 flags = PMU_ACR_CMD_BOOTSTRAP_FALCON_FLAGS_RESET_YES;
103
104 /* GM20B PMU supports loading FECS and GPCCS only */
105 if (falconidmask == 0)
106 return -EINVAL;
107 if (falconidmask & ~((1 << LSF_FALCON_ID_FECS) |
108 (1 << LSF_FALCON_ID_GPCCS)))
109 return -EINVAL;
110 g->ops.pmu.lsfloadedfalconid = 0;
111 /* check whether pmu is ready to bootstrap lsf if not wait for it */
112 if (!g->ops.pmu.lspmuwprinitdone) {
113 pmu_wait_message_cond(&g->pmu,
114 gk20a_get_gr_idle_timeout(g),
115 &g->ops.pmu.lspmuwprinitdone, 1);
116 /* check again if it still not ready indicate an error */
117 if (!g->ops.pmu.lspmuwprinitdone) {
118 gk20a_err(dev_from_gk20a(g),
119 "PMU not ready to load LSF");
120 return -ETIMEDOUT;
121 }
122 }
123 /* load falcon(s) */
124 gm206_pmu_load_multiple_falcons(g, falconidmask, flags);
125 pmu_wait_message_cond(&g->pmu,
126 gk20a_get_gr_idle_timeout(g),
127 &g->ops.pmu.lsfloadedfalconid, falconidmask);
128 if (g->ops.pmu.lsfloadedfalconid != falconidmask)
129 return -ETIMEDOUT;
130 return 0;
131}
132
133static bool gm206_is_pmu_supported(struct gk20a *g)
134{
135 return true;
136}
137
138
139void gm206_init_pmu_ops(struct gpu_ops *gops)
140{
141 gops->pmu.is_pmu_supported = gm206_is_pmu_supported;
142 if (gops->privsecurity) {
143 gm206_init_secure_pmu(gops);
144 gops->pmu.init_wpr_region = gm20b_pmu_init_acr;
145 gops->pmu.load_lsfalcon_ucode = gm206_load_falcon_ucode;
146 gops->pmu.is_lazy_bootstrap = gm206_is_lazy_bootstrap;
147 gops->pmu.is_priv_load = gm206_is_priv_load;
148 } else {
149 gk20a_init_pmu_ops(gops);
150 gops->pmu.pmu_setup_hw_and_bootstrap =
151 gm20b_init_nspmu_setup_hw1;
152 gops->pmu.load_lsfalcon_ucode = NULL;
153 gops->pmu.init_wpr_region = NULL;
154 }
155 gops->pmu.pmu_setup_elpg = NULL;
156 gops->pmu.pmu_get_queue_head = pwr_pmu_queue_head_r;
157 gops->pmu.pmu_get_queue_head_size = pwr_pmu_queue_head__size_1_v;
158 gops->pmu.pmu_get_queue_tail = pwr_pmu_queue_tail_r;
159 gops->pmu.pmu_get_queue_tail_size = pwr_pmu_queue_tail__size_1_v;
160 gops->pmu.lspmuwprinitdone = 0;
161 gops->pmu.fecsbootstrapdone = false;
162 gops->pmu.write_dmatrfbase = gm20b_write_dmatrfbase;
163 gops->pmu.pmu_elpg_statistics = NULL;
164 gops->pmu.pmu_pg_init_param = NULL;
165 gops->pmu.pmu_pg_supported_engines_list = NULL;
166 gops->pmu.pmu_pg_engines_feature_list = NULL;
167 gops->pmu.pmu_lpwr_enable_pg = NULL;
168 gops->pmu.pmu_is_lpwr_feature_supported = NULL;
169 gops->pmu.pmu_lpwr_disable_pg = NULL;
170 gops->pmu.pmu_pg_param_post_init = NULL;
171 gops->pmu.send_lrf_tex_ltc_dram_overide_en_dis_cmd = NULL;
172 gops->pmu.dump_secure_fuses = NULL;
173 gops->pmu.reset = gk20a_pmu_reset;
174}
diff --git a/drivers/gpu/nvgpu/gm206/pmu_gm206.h b/drivers/gpu/nvgpu/gm206/pmu_gm206.h
deleted file mode 100644
index 418f30ac..00000000
--- a/drivers/gpu/nvgpu/gm206/pmu_gm206.h
+++ /dev/null
@@ -1,22 +0,0 @@
1/*
2 * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved.
3 *
4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License,
6 * version 2, as published by the Free Software Foundation.
7 *
8 * This program is distributed in the hope it will be useful, but WITHOUT
9 * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
10 * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
11 * more details.
12 */
13
14#ifndef __PMU_GM206_H_
15#define __PMU_GM206_H_
16
17void gm206_init_pmu_ops(struct gpu_ops *gops);
18bool gm206_is_priv_load(u32 falcon_id);
19bool gm206_is_lazy_bootstrap(u32 falcon_id);
20int gm206_load_falcon_ucode(struct gk20a *g, u32 falconidmask);
21
22#endif /*__PMU_GM206_H_*/
diff --git a/drivers/gpu/nvgpu/gp106/acr_gp106.c b/drivers/gpu/nvgpu/gp106/acr_gp106.c
index f8d7ba70..f5a4053b 100644
--- a/drivers/gpu/nvgpu/gp106/acr_gp106.c
+++ b/drivers/gpu/nvgpu/gp106/acr_gp106.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2015-2017, NVIDIA CORPORATION. All rights reserved. 2 * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved.
3 * 3 *
4 * This program is free software; you can redistribute it and/or modify it 4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License, 5 * under the terms and conditions of the GNU General Public License,
@@ -24,7 +24,7 @@
24 24
25#include "gm206/acr_gm206.h" 25#include "gm206/acr_gm206.h"
26#include "gm20b/acr_gm20b.h" 26#include "gm20b/acr_gm20b.h"
27#include "gm206/pmu_gm206.h" 27#include "gp106/pmu_gp106.h"
28 28
29#include "sec2_gp106.h" 29#include "sec2_gp106.h"
30#include "nvgpu_gpuid_t18x.h" 30#include "nvgpu_gpuid_t18x.h"
@@ -122,8 +122,6 @@ void gp106_init_secure_pmu(struct gpu_ops *gops)
122{ 122{
123 gops->pmu.prepare_ucode = gp106_prepare_ucode_blob; 123 gops->pmu.prepare_ucode = gp106_prepare_ucode_blob;
124 gops->pmu.pmu_setup_hw_and_bootstrap = gp106_bootstrap_hs_flcn; 124 gops->pmu.pmu_setup_hw_and_bootstrap = gp106_bootstrap_hs_flcn;
125 gops->pmu.is_lazy_bootstrap = gm206_is_lazy_bootstrap;
126 gops->pmu.is_priv_load = gm206_is_priv_load;
127 gops->pmu.get_wpr = gp106_wpr_info; 125 gops->pmu.get_wpr = gp106_wpr_info;
128 gops->pmu.alloc_blob_space = gp106_alloc_blob_space; 126 gops->pmu.alloc_blob_space = gp106_alloc_blob_space;
129 gops->pmu.pmu_populate_loader_cfg = gp106_pmu_populate_loader_cfg; 127 gops->pmu.pmu_populate_loader_cfg = gp106_pmu_populate_loader_cfg;
diff --git a/drivers/gpu/nvgpu/gp106/pmu_gp106.c b/drivers/gpu/nvgpu/gp106/pmu_gp106.c
index 9aac5328..5a9d5ba6 100644
--- a/drivers/gpu/nvgpu/gp106/pmu_gp106.c
+++ b/drivers/gpu/nvgpu/gp106/pmu_gp106.c
@@ -17,7 +17,6 @@
17#include "gk20a/pmu_gk20a.h" 17#include "gk20a/pmu_gk20a.h"
18 18
19#include "gm20b/pmu_gm20b.h" 19#include "gm20b/pmu_gm20b.h"
20#include "gm206/pmu_gm206.h"
21#include "gp10b/pmu_gp10b.h" 20#include "gp10b/pmu_gp10b.h"
22#include "gp106/pmu_gp106.h" 21#include "gp106/pmu_gp106.h"
23#include "gp106/acr_gp106.h" 22#include "gp106/acr_gp106.h"
@@ -299,6 +298,109 @@ static bool gp106_pmu_is_lpwr_feature_supported(struct gk20a *g, u32 feature_id)
299 return is_feature_supported; 298 return is_feature_supported;
300} 299}
301 300
301static bool gp106_is_lazy_bootstrap(u32 falcon_id)
302{
303 bool enable_status = false;
304
305 switch (falcon_id) {
306 case LSF_FALCON_ID_FECS:
307 enable_status = true;
308 break;
309 case LSF_FALCON_ID_GPCCS:
310 enable_status = true;
311 break;
312 default:
313 break;
314 }
315
316 return enable_status;
317}
318
319static bool gp106_is_priv_load(u32 falcon_id)
320{
321 bool enable_status = false;
322
323 switch (falcon_id) {
324 case LSF_FALCON_ID_FECS:
325 enable_status = true;
326 break;
327 case LSF_FALCON_ID_GPCCS:
328 enable_status = true;
329 break;
330 default:
331 break;
332 }
333
334 return enable_status;
335}
336
337static void gp106_pmu_load_multiple_falcons(struct gk20a *g, u32 falconidmask,
338 u32 flags)
339{
340 struct pmu_gk20a *pmu = &g->pmu;
341 struct pmu_cmd cmd;
342 u32 seq;
343
344 gk20a_dbg_fn("");
345
346 gp106_dbg_pmu("wprinit status = %x\n", g->ops.pmu.lspmuwprinitdone);
347 if (g->ops.pmu.lspmuwprinitdone) {
348 /* send message to load FECS falcon */
349 memset(&cmd, 0, sizeof(struct pmu_cmd));
350 cmd.hdr.unit_id = PMU_UNIT_ACR;
351 cmd.hdr.size = PMU_CMD_HDR_SIZE +
352 sizeof(struct pmu_acr_cmd_bootstrap_multiple_falcons);
353 cmd.cmd.acr.boot_falcons.cmd_type =
354 PMU_ACR_CMD_ID_BOOTSTRAP_MULTIPLE_FALCONS;
355 cmd.cmd.acr.boot_falcons.flags = flags;
356 cmd.cmd.acr.boot_falcons.falconidmask =
357 falconidmask;
358 cmd.cmd.acr.boot_falcons.usevamask = 0;
359 cmd.cmd.acr.boot_falcons.wprvirtualbase.lo = 0;
360 cmd.cmd.acr.boot_falcons.wprvirtualbase.hi = 0;
361
362 gp106_dbg_pmu("PMU_ACR_CMD_ID_BOOTSTRAP_MULTIPLE_FALCONS:%x\n",
363 falconidmask);
364 gk20a_pmu_cmd_post(g, &cmd, NULL, NULL, PMU_COMMAND_QUEUE_HPQ,
365 pmu_handle_fecs_boot_acr_msg, pmu, &seq, ~0);
366 }
367
368 gk20a_dbg_fn("done");
369}
370
371static int gp106_load_falcon_ucode(struct gk20a *g, u32 falconidmask)
372{
373 u32 flags = PMU_ACR_CMD_BOOTSTRAP_FALCON_FLAGS_RESET_YES;
374
375 /* GM20B PMU supports loading FECS and GPCCS only */
376 if (falconidmask == 0)
377 return -EINVAL;
378 if (falconidmask & ~((1 << LSF_FALCON_ID_FECS) |
379 (1 << LSF_FALCON_ID_GPCCS)))
380 return -EINVAL;
381 g->ops.pmu.lsfloadedfalconid = 0;
382 /* check whether pmu is ready to bootstrap lsf if not wait for it */
383 if (!g->ops.pmu.lspmuwprinitdone) {
384 pmu_wait_message_cond(&g->pmu,
385 gk20a_get_gr_idle_timeout(g),
386 &g->ops.pmu.lspmuwprinitdone, 1);
387 /* check again if it still not ready indicate an error */
388 if (!g->ops.pmu.lspmuwprinitdone) {
389 gk20a_err(dev_from_gk20a(g),
390 "PMU not ready to load LSF");
391 return -ETIMEDOUT;
392 }
393 }
394 /* load falcon(s) */
395 gp106_pmu_load_multiple_falcons(g, falconidmask, flags);
396 pmu_wait_message_cond(&g->pmu,
397 gk20a_get_gr_idle_timeout(g),
398 &g->ops.pmu.lsfloadedfalconid, falconidmask);
399 if (g->ops.pmu.lsfloadedfalconid != falconidmask)
400 return -ETIMEDOUT;
401 return 0;
402}
403
302void gp106_init_pmu_ops(struct gpu_ops *gops) 404void gp106_init_pmu_ops(struct gpu_ops *gops)
303{ 405{
304 gk20a_dbg_fn(""); 406 gk20a_dbg_fn("");
@@ -306,9 +408,9 @@ void gp106_init_pmu_ops(struct gpu_ops *gops)
306 if (gops->privsecurity) { 408 if (gops->privsecurity) {
307 gp106_init_secure_pmu(gops); 409 gp106_init_secure_pmu(gops);
308 gops->pmu.init_wpr_region = gm20b_pmu_init_acr; 410 gops->pmu.init_wpr_region = gm20b_pmu_init_acr;
309 gops->pmu.load_lsfalcon_ucode = gm206_load_falcon_ucode; 411 gops->pmu.load_lsfalcon_ucode = gp106_load_falcon_ucode;
310 gops->pmu.is_lazy_bootstrap = gm206_is_lazy_bootstrap; 412 gops->pmu.is_lazy_bootstrap = gp106_is_lazy_bootstrap;
311 gops->pmu.is_priv_load = gm206_is_priv_load; 413 gops->pmu.is_priv_load = gp106_is_priv_load;
312 } else { 414 } else {
313 gk20a_init_pmu_ops(gops); 415 gk20a_init_pmu_ops(gops);
314 gops->pmu.pmu_setup_hw_and_bootstrap = 416 gops->pmu.pmu_setup_hw_and_bootstrap =
diff --git a/drivers/gpu/nvgpu/gp106/sec2_gp106.c b/drivers/gpu/nvgpu/gp106/sec2_gp106.c
index 738519cf..9af16886 100644
--- a/drivers/gpu/nvgpu/gp106/sec2_gp106.c
+++ b/drivers/gpu/nvgpu/gp106/sec2_gp106.c
@@ -1,5 +1,5 @@
1/* 1/*
2 * Copyright (c) 2016, NVIDIA CORPORATION. All rights reserved. 2 * Copyright (c) 2016-2017, NVIDIA CORPORATION. All rights reserved.
3 * 3 *
4 * This program is free software; you can redistribute it and/or modify it 4 * This program is free software; you can redistribute it and/or modify it
5 * under the terms and conditions of the GNU General Public License, 5 * under the terms and conditions of the GNU General Public License,
@@ -17,8 +17,6 @@
17#include "gk20a/gk20a.h" 17#include "gk20a/gk20a.h"
18#include "gk20a/pmu_gk20a.h" 18#include "gk20a/pmu_gk20a.h"
19 19
20#include "gm206/pmu_gm206.h"
21
22#include "gm20b/pmu_gm20b.h" 20#include "gm20b/pmu_gm20b.h"
23 21
24#include "gp10b/pmu_gp10b.h" 22#include "gp10b/pmu_gp10b.h"