drm/gf100-/gr: unhardcode bundle cb config
authorBen Skeggs <bskeggs@redhat.com>
Sat, 9 Aug 2014 18:10:29 +0000 (04:10 +1000)
committerBen Skeggs <bskeggs@redhat.com>
Sat, 9 Aug 2014 19:28:14 +0000 (05:28 +1000)
Should be the same values as before, except:

GF117 has smaller buffer allocated, as per register setup.
GK20A now uses values from Tegra driver, not GK104's.

Signed-off-by: Ben Skeggs <bskeggs@redhat.com>
13 files changed:
drivers/gpu/drm/nouveau/core/engine/graph/ctxgk110b.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxgk20a.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxgm107.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnv108.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc0.h
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc1.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc4.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvc8.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvd7.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvd9.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnve4.c
drivers/gpu/drm/nouveau/core/engine/graph/ctxnvf0.c

index 4ae70c11b6e667382dd7a246cefd86d46fbe90d9..b3f5ea66566e105eb6d28aa26792afa39540fdc0 100644 (file)
@@ -91,4 +91,8 @@ gk110b_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .ppc   = nvf0_grctx_pack_ppc,
        .icmd  = nvf0_grctx_pack_icmd,
        .mthd  = nvf0_grctx_pack_mthd,
+       .bundle = nve4_grctx_generate_bundle,
+       .bundle_size = 0x3000,
+       .bundle_min_gpm_fifo_depth = 0x180,
+       .bundle_token_limit = 0x600,
 }.base;
index 224ee0287ab79b03250f5155f00f93b73bfb6aa2..1ec78bdca4b17f6148bb352e37f72a41ff649a20 100644 (file)
@@ -50,4 +50,8 @@ gk20a_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .ppc   = nve4_grctx_pack_ppc,
        .icmd  = nve4_grctx_pack_icmd,
        .mthd  = gk20a_grctx_pack_mthd,
+       .bundle = nve4_grctx_generate_bundle,
+       .bundle_size = 0x1800,
+       .bundle_min_gpm_fifo_depth = 0x62,
+       .bundle_token_limit = 0x100,
 }.base;
index b0d0fb2f4d083813a799d1c02bb3d953646f2889..a4f008855966506dbcf43ad253390bb9a8c201bb 100644 (file)
@@ -858,10 +858,26 @@ gm107_grctx_pack_ppc[] = {
  * PGRAPH context implementation
  ******************************************************************************/
 
+static void
+gm107_grctx_generate_bundle(struct nvc0_grctx *info)
+{
+       const struct nvc0_grctx_oclass *impl = nvc0_grctx_impl(info->priv);
+       const u32 state_limit = min(impl->bundle_min_gpm_fifo_depth,
+                                   impl->bundle_size / 0x20);
+       const u32 token_limit = impl->bundle_token_limit;
+       const u32 access = NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS;
+       const int s = 8;
+       const int b = mmio_vram(info, impl->bundle_size, (1 << s), access);
+       mmio_refn(info, 0x408004, 0x00000000, s, b);
+       mmio_refn(info, 0x408008, 0x80000000 | (impl->bundle_size >> s), 0, b);
+       mmio_refn(info, 0x418e24, 0x00000000, s, b);
+       mmio_refn(info, 0x418e28, 0x80000000 | (impl->bundle_size >> s), 0, b);
+       mmio_wr32(info, 0x4064c8, (state_limit << 16) | token_limit);
+}
+
 static void
 gm107_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 {
-       mmio_data(0x003000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x200000, 0x1000, NV_MEM_ACCESS_RW);
 
@@ -872,13 +888,6 @@ gm107_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
        mmio_list(0x4064cc, 0x80000000,  0, 0);
        mmio_list(0x418e30, 0x80000000,  0, 0);
 
-       mmio_list(0x408004, 0x00000000,  8, 0);
-       mmio_list(0x408008, 0x80000030,  0, 0);
-       mmio_list(0x418e24, 0x00000000,  8, 0);
-       mmio_list(0x418e28, 0x80000030,  0, 0);
-
-       mmio_list(0x4064c8, 0x018002c0,  0, 0);
-
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
        mmio_list(0x419c2c, 0x10000000, 12, 2);
@@ -934,6 +943,7 @@ gm107_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 
        nv_wr32(priv, 0x404154, 0x00000000);
 
+       oclass->bundle(info);
        oclass->mods(priv, info);
        oclass->unkn(priv);
 
@@ -988,4 +998,8 @@ gm107_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .ppc   = gm107_grctx_pack_ppc,
        .icmd  = gm107_grctx_pack_icmd,
        .mthd  = gm107_grctx_pack_mthd,
+       .bundle = gm107_grctx_generate_bundle,
+       .bundle_size = 0x3000,
+       .bundle_min_gpm_fifo_depth = 0x180,
+       .bundle_token_limit = 0x2c0,
 }.base;
index 8de4a4291548897d85d84a2662f031b364bb3bc9..c9eb8ed46d127608837c30b6fffa14474d042693 100644 (file)
@@ -538,7 +538,6 @@ nv108_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
        u32 offset;
        int gpc;
 
-       mmio_data(0x003000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
        mmio_list(0x40800c, 0x00000000,  8, 1);
@@ -546,11 +545,6 @@ nv108_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
        mmio_list(0x419004, 0x00000000,  8, 1);
        mmio_list(0x419008, 0x00000000,  0, 0);
        mmio_list(0x4064cc, 0x80000000,  0, 0);
-       mmio_list(0x408004, 0x00000000,  8, 0);
-       mmio_list(0x408008, 0x80000030,  0, 0);
-       mmio_list(0x418808, 0x00000000,  8, 0);
-       mmio_list(0x41880c, 0x80000030,  0, 0);
-       mmio_list(0x4064c8, 0x00c20200,  0, 0);
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
 
@@ -596,4 +590,8 @@ nv108_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .ppc   = nv108_grctx_pack_ppc,
        .icmd  = nv108_grctx_pack_icmd,
        .mthd  = nvf0_grctx_pack_mthd,
+       .bundle = nve4_grctx_generate_bundle,
+       .bundle_size = 0x3000,
+       .bundle_min_gpm_fifo_depth = 0xc2,
+       .bundle_token_limit = 0x200,
 }.base;
index a0514d3de61536313f32a11f15c78e0798dec213..4186a0a2baa523e990eaef7f6d2f9070fc992b7f 100644 (file)
@@ -1020,26 +1020,34 @@ nvc0_grctx_mmio_item(struct nvc0_grctx *info, u32 addr, u32 data,
        nv_wr32(info->priv, addr, data);
 }
 
+void
+nvc0_grctx_generate_bundle(struct nvc0_grctx *info)
+{
+       const struct nvc0_grctx_oclass *impl = nvc0_grctx_impl(info->priv);
+       const u32 access = NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS;
+       const int s = 8;
+       const int b = mmio_vram(info, impl->bundle_size, (1 << s), access);
+       mmio_refn(info, 0x408004, 0x00000000, s, b);
+       mmio_refn(info, 0x408008, 0x80000000 | (impl->bundle_size >> s), 0, b);
+       mmio_refn(info, 0x418808, 0x00000000, s, b);
+       mmio_refn(info, 0x41880c, 0x80000000 | (impl->bundle_size >> s), 0, b);
+}
+
 void
 nvc0_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 {
        int gpc, tpc;
        u32 offset;
 
-       mmio_data(0x002000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
 
-       mmio_list(0x408004, 0x00000000,  8, 0);
-       mmio_list(0x408008, 0x80000018,  0, 0);
        mmio_list(0x40800c, 0x00000000,  8, 1);
        mmio_list(0x408010, 0x80000000,  0, 0);
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
        mmio_list(0x419004, 0x00000000,  8, 1);
        mmio_list(0x419008, 0x00000000,  0, 0);
-       mmio_list(0x418808, 0x00000000,  8, 0);
-       mmio_list(0x41880c, 0x80000018,  0, 0);
 
        mmio_list(0x405830, 0x02180000, 0, 0);
 
@@ -1218,6 +1226,7 @@ nvc0_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 
        nv_wr32(priv, 0x404154, 0x00000000);
 
+       oclass->bundle(info);
        oclass->mods(priv, info);
        oclass->unkn(priv);
 
@@ -1354,4 +1363,6 @@ nvc0_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .tpc   = nvc0_grctx_pack_tpc,
        .icmd  = nvc0_grctx_pack_icmd,
        .mthd  = nvc0_grctx_pack_mthd,
+       .bundle = nvc0_grctx_generate_bundle,
+       .bundle_size = 0x1800,
 }.base;
index 0579542cde3a2a8e4577b4654ac038221c7c236d..26744ac89fb720638710665df87ea183d2132b10 100644 (file)
@@ -39,11 +39,23 @@ struct nvc0_grctx_oclass {
        /* indirect context data, generated with icmds/mthds */
        const struct nvc0_graph_pack *icmd;
        const struct nvc0_graph_pack *mthd;
+       /* bundle circular buffer */
+       void (*bundle)(struct nvc0_grctx *);
+       u32 bundle_size;
+       u32 bundle_min_gpm_fifo_depth;
+       u32 bundle_token_limit;
 };
 
+static inline const struct nvc0_grctx_oclass *
+nvc0_grctx_impl(struct nvc0_graph_priv *priv)
+{
+       return (void *)nv_engine(priv)->cclass;
+}
+
 extern struct nouveau_oclass *nvc0_grctx_oclass;
 int  nvc0_grctx_generate(struct nvc0_graph_priv *);
 void nvc0_grctx_generate_main(struct nvc0_graph_priv *, struct nvc0_grctx *);
+void nvc0_grctx_generate_bundle(struct nvc0_grctx *);
 void nvc0_grctx_generate_mods(struct nvc0_graph_priv *, struct nvc0_grctx *);
 void nvc0_grctx_generate_unkn(struct nvc0_graph_priv *);
 void nvc0_grctx_generate_tpcid(struct nvc0_graph_priv *);
@@ -64,6 +76,7 @@ extern struct nouveau_oclass *nvd9_grctx_oclass;
 extern struct nouveau_oclass *nve4_grctx_oclass;
 extern struct nouveau_oclass *gk20a_grctx_oclass;
 void nve4_grctx_generate_main(struct nvc0_graph_priv *, struct nvc0_grctx *);
+void nve4_grctx_generate_bundle(struct nvc0_grctx *);
 void nve4_grctx_generate_mods(struct nvc0_graph_priv *, struct nvc0_grctx *);
 void nve4_grctx_generate_unkn(struct nvc0_graph_priv *);
 void nve4_grctx_generate_r418bb8(struct nvc0_graph_priv *);
index 24a92c569c0a2b971870da21f9ff97e992e8bffc..9043965c27a4bcc68ab29a56fb95a8f712893e94 100644 (file)
@@ -732,19 +732,14 @@ nvc1_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
        int gpc, tpc;
        u32 offset;
 
-       mmio_data(0x002000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
-       mmio_list(0x408004, 0x00000000,  8, 0);
-       mmio_list(0x408008, 0x80000018,  0, 0);
        mmio_list(0x40800c, 0x00000000,  8, 1);
        mmio_list(0x408010, 0x80000000,  0, 0);
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
        mmio_list(0x419004, 0x00000000,  8, 1);
        mmio_list(0x419008, 0x00000000,  0, 0);
-       mmio_list(0x418808, 0x00000000,  8, 0);
-       mmio_list(0x41880c, 0x80000018,  0, 0);
 
        mmio_list(0x405830, 0x02180218, 0, 0);
        mmio_list(0x4064c4, 0x0086ffff, 0, 0);
@@ -794,4 +789,6 @@ nvc1_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .tpc   = nvc1_grctx_pack_tpc,
        .icmd  = nvc1_grctx_pack_icmd,
        .mthd  = nvc1_grctx_pack_mthd,
+       .bundle = nvc0_grctx_generate_bundle,
+       .bundle_size = 0x1800,
 }.base;
index e11ed5538193047797f424b549c4896675a80593..e96606a5743254320d71859747b638a57e515322 100644 (file)
@@ -100,4 +100,6 @@ nvc4_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .tpc   = nvc4_grctx_pack_tpc,
        .icmd  = nvc0_grctx_pack_icmd,
        .mthd  = nvc0_grctx_pack_mthd,
+       .bundle = nvc0_grctx_generate_bundle,
+       .bundle_size = 0x1800,
 }.base;
index feebd58dfe8d005679860f5d57ee8df80a8fb442..cc4646e514fc4c5f28d24efcfd124e3f19c1b8fc 100644 (file)
@@ -351,4 +351,6 @@ nvc8_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .tpc   = nvc0_grctx_pack_tpc,
        .icmd  = nvc8_grctx_pack_icmd,
        .mthd  = nvc8_grctx_pack_mthd,
+       .bundle = nvc0_grctx_generate_bundle,
+       .bundle_size = 0x1800,
 }.base;
index 944d90bef9599b3da3f118469519e59f52e1f862..930a205111b26fae2a305c4abe15a581219148ce 100644 (file)
@@ -184,17 +184,12 @@ nvd7_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
        u32 offset;
        int gpc;
 
-       mmio_data(0x003000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
        mmio_list(0x40800c, 0x00000000,  8, 1);
        mmio_list(0x408010, 0x80000000,  0, 0);
        mmio_list(0x419004, 0x00000000,  8, 1);
        mmio_list(0x419008, 0x00000000,  0, 0);
-       mmio_list(0x408004, 0x00000000,  8, 0);
-       mmio_list(0x408008, 0x80000018,  0, 0);
-       mmio_list(0x418808, 0x00000000,  8, 0);
-       mmio_list(0x41880c, 0x80000018,  0, 0);
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
 
@@ -233,6 +228,7 @@ nvd7_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 
        nv_wr32(priv, 0x404154, 0x00000000);
 
+       oclass->bundle(info);
        oclass->mods(priv, info);
        oclass->unkn(priv);
 
@@ -272,4 +268,6 @@ nvd7_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .ppc   = nvd7_grctx_pack_ppc,
        .icmd  = nvd9_grctx_pack_icmd,
        .mthd  = nvd9_grctx_pack_mthd,
+       .bundle = nvc0_grctx_generate_bundle,
+       .bundle_size = 0x1800,
 }.base;
index c665fb7e4660a0560889258ab756c8a04f68277e..8aa5e69aecc6131956d03692dd807805849a3d42 100644 (file)
@@ -519,4 +519,6 @@ nvd9_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .tpc   = nvd9_grctx_pack_tpc,
        .icmd  = nvd9_grctx_pack_icmd,
        .mthd  = nvd9_grctx_pack_mthd,
+       .bundle = nvc0_grctx_generate_bundle,
+       .bundle_size = 0x1800,
 }.base;
index cd036322d2d8cfd4ce32a7ca4a38afbafa298663..678708e15718568b8ead4a700575271f9c46047a 100644 (file)
@@ -838,6 +838,23 @@ nve4_grctx_pack_ppc[] = {
  * PGRAPH context implementation
  ******************************************************************************/
 
+void
+nve4_grctx_generate_bundle(struct nvc0_grctx *info)
+{
+       const struct nvc0_grctx_oclass *impl = nvc0_grctx_impl(info->priv);
+       const u32 state_limit = min(impl->bundle_min_gpm_fifo_depth,
+                                   impl->bundle_size / 0x20);
+       const u32 token_limit = impl->bundle_token_limit;
+       const u32 access = NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS;
+       const int s = 8;
+       const int b = mmio_vram(info, impl->bundle_size, (1 << s), access);
+       mmio_refn(info, 0x408004, 0x00000000, s, b);
+       mmio_refn(info, 0x408008, 0x80000000 | (impl->bundle_size >> s), 0, b);
+       mmio_refn(info, 0x418808, 0x00000000, s, b);
+       mmio_refn(info, 0x41880c, 0x80000000 | (impl->bundle_size >> s), 0, b);
+       mmio_wr32(info, 0x4064c8, (state_limit << 16) | token_limit);
+}
+
 void
 nve4_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 {
@@ -845,7 +862,6 @@ nve4_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
        u32 offset;
        int gpc;
 
-       mmio_data(0x003000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
        mmio_list(0x40800c, 0x00000000,  8, 1);
@@ -853,11 +869,6 @@ nve4_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
        mmio_list(0x419004, 0x00000000,  8, 1);
        mmio_list(0x419008, 0x00000000,  0, 0);
        mmio_list(0x4064cc, 0x80000000,  0, 0);
-       mmio_list(0x408004, 0x00000000,  8, 0);
-       mmio_list(0x408008, 0x80000030,  0, 0);
-       mmio_list(0x418808, 0x00000000,  8, 0);
-       mmio_list(0x41880c, 0x80000030,  0, 0);
-       mmio_list(0x4064c8, 0x01800600,  0, 0);
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
 
@@ -967,6 +978,7 @@ nve4_grctx_generate_main(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
 
        nv_wr32(priv, 0x404154, 0x00000000);
 
+       oclass->bundle(info);
        oclass->mods(priv, info);
        oclass->unkn(priv);
 
@@ -1018,4 +1030,8 @@ nve4_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .ppc   = nve4_grctx_pack_ppc,
        .icmd  = nve4_grctx_pack_icmd,
        .mthd  = nve4_grctx_pack_mthd,
+       .bundle = nve4_grctx_generate_bundle,
+       .bundle_size = 0x3000,
+       .bundle_min_gpm_fifo_depth = 0x180,
+       .bundle_token_limit = 0x600,
 }.base;
index 3e6ac2703d72d0d7d00691b79c6bc35c6a002691..89a77a2788ba0267a50ab98c28f16be3fba91408 100644 (file)
@@ -816,7 +816,6 @@ nvf0_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
        u32 offset;
        int gpc;
 
-       mmio_data(0x003000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x008000, 0x0100, NV_MEM_ACCESS_RW | NV_MEM_ACCESS_SYS);
        mmio_data(0x060000, 0x1000, NV_MEM_ACCESS_RW);
        mmio_list(0x40800c, 0x00000000,  8, 1);
@@ -824,11 +823,6 @@ nvf0_grctx_generate_mods(struct nvc0_graph_priv *priv, struct nvc0_grctx *info)
        mmio_list(0x419004, 0x00000000,  8, 1);
        mmio_list(0x419008, 0x00000000,  0, 0);
        mmio_list(0x4064cc, 0x80000000,  0, 0);
-       mmio_list(0x408004, 0x00000000,  8, 0);
-       mmio_list(0x408008, 0x80000030,  0, 0);
-       mmio_list(0x418808, 0x00000000,  8, 0);
-       mmio_list(0x41880c, 0x80000030,  0, 0);
-       mmio_list(0x4064c8, 0x01800600,  0, 0);
        mmio_list(0x418810, 0x80000000, 12, 2);
        mmio_list(0x419848, 0x10000000, 12, 2);
 
@@ -882,4 +876,8 @@ nvf0_grctx_oclass = &(struct nvc0_grctx_oclass) {
        .ppc   = nvf0_grctx_pack_ppc,
        .icmd  = nvf0_grctx_pack_icmd,
        .mthd  = nvf0_grctx_pack_mthd,
+       .bundle = nve4_grctx_generate_bundle,
+       .bundle_size = 0x3000,
+       .bundle_min_gpm_fifo_depth = 0x180,
+       .bundle_token_limit = 0x7c0,
 }.base;