drivers: video: host: check tegra revision at runtime
Jin Qian [Wed, 22 Aug 2012 23:36:50 +0000 (16:36 -0700)]
replace compile time check for gk20a sim/qt

Change-Id: I5f22077aa2be016af9ef2b04be18ec3fd935fc9e
Signed-off-by: Jin Qian <jqian@nvidia.com>
Reviewed-on: http://git-master/r/125356
Reviewed-by: Automatic_Commit_Validation_User
Reviewed-by: Mark Stadler <mastadler@nvidia.com>

drivers/video/tegra/Kconfig
drivers/video/tegra/host/gk20a/Makefile
drivers/video/tegra/host/gk20a/gr_ctx_gk20a.c
drivers/video/tegra/host/gk20a/gr_ctx_gk20a.h
drivers/video/tegra/host/gk20a/gr_ctx_gk20a_sim.c
drivers/video/tegra/host/gk20a/gr_gk20a.c
drivers/video/tegra/host/gk20a/priv_ring_gk20a.c

index 75ea62f..1fa0084 100644 (file)
@@ -255,13 +255,6 @@ config TEGRA_HDMI_74MHZ_LIMIT
          Say Y here to make kernel report only low bandwidth modes.
          Useful only for boards which can't deliver 148.50 MHz.
 
-config TEGRA_GK20A_NETLIST_FIRMWARE
-       bool "Support loading GK20A netlist"
-       default n
-       help
-         Say Y here to load GK20A netlist from /system/etc/firmware.
-
-
 config TEGRA_GK20A_PMU
        bool "Support GK20A PMU"
        depends on TEGRA_GK20A
index 4acfa66..186b7fc 100644 (file)
@@ -15,12 +15,8 @@ nvhost-gk20a-objs  = \
        pmu_gk20a.o \
        priv_ring_gk20a.o \
        clk_gk20a.o \
-       therm_gk20a.o
-
-ifneq ($(CONFIG_TEGRA_GK20A_NETLIST_FIRMWARE),y)
-nvhost-gk20a-objs += gr_ctx_gk20a_sim.o
-else
-nvhost-gk20a-objs += gr_ctx_gk20a.o
-endif
+       therm_gk20a.o \
+       gr_ctx_gk20a_sim.o \
+       gr_ctx_gk20a.o
 
 obj-$(CONFIG_TEGRA_GRHOST) += nvhost-gk20a.o
index 4bd04d8..3126523 100644 (file)
@@ -21,6 +21,8 @@
 
 #include <linux/firmware.h>
 
+#include "mach/hardware.h"
+
 #include "dev.h"
 #include "bus_client.h"
 
@@ -97,7 +99,7 @@ static int gr_gk20a_get_netlist_name(int index, char *name)
        return -1;
 }
 
-int gr_gk20a_init_ctx_vars(struct gk20a *g, struct gr_gk20a *gr)
+static int gr_gk20a_init_ctx_vars_fw(struct gk20a *g, struct gr_gk20a *gr)
 {
        struct device *d = dev_from_gk20a(g);
        const struct firmware *netlist_fw;
@@ -325,3 +327,10 @@ done:
        }
 }
 
+int gr_gk20a_init_ctx_vars(struct gk20a *g, struct gr_gk20a *gr)
+{
+       if (tegra_revision == TEGRA_REVISION_SIM)
+               return gr_gk20a_init_ctx_vars_sim(g, gr);
+       else
+               return gr_gk20a_init_ctx_vars_fw(g, gr);
+}
index 7c60ed4..3fe8008 100644 (file)
@@ -146,5 +146,6 @@ struct gr_ucode_gk20a {
 
 /* main entry for grctx loading */
 int gr_gk20a_init_ctx_vars(struct gk20a *g, struct gr_gk20a *gr);
+int gr_gk20a_init_ctx_vars_sim(struct gk20a *g, struct gr_gk20a *gr);
 
 #endif /*__GR_CTX_GK20A_H__*/
index 005642c..1496d8c 100644 (file)
@@ -24,7 +24,7 @@
 #include "gk20a.h"
 #include "gr_ctx_gk20a.h"
 
-int gr_gk20a_init_ctx_vars(struct gk20a *g, struct gr_gk20a *gr)
+int gr_gk20a_init_ctx_vars_sim(struct gk20a *g, struct gr_gk20a *gr)
 {
        int err = 0;
        u32 i, temp;
index 9040919..fcee8ec 100644 (file)
@@ -23,6 +23,8 @@
 #include <linux/mm.h>          /* for totalram_pages */
 #include <linux/nvmap.h>
 
+#include "mach/hardware.h"
+
 #include "../dev.h"
 
 #include "gk20a.h"
@@ -1306,7 +1308,7 @@ static int gr_gk20a_load_golden_ctx_image(struct gk20a *g,
        /* gr_gk20a_ctx_zcull_setup(g, c, false); */
        gr_gk20a_ctx_pm_setup(g, c, false);
 
-       if (CONFIG_GK20A_SIM /*|| IS_RTLSIM()*/) {
+       if (tegra_revision == TEGRA_REVISION_SIM) {
                u32 inst_base_ptr =
                        u64_lo32(c->inst_block.cpu_pa) >> ram_in_base_shift_v();
 
@@ -1347,7 +1349,7 @@ static int gr_gk20a_load_ctxsw_ucode(struct gk20a *g, struct gr_gk20a *gr)
 
        nvhost_dbg_fn("");
 
-       if (CONFIG_GK20A_SIM) { /* fmodel */
+       if (tegra_revision == TEGRA_REVISION_SIM) {
                gk20a_writel(g, gr_fecs_ctxsw_mailbox_r(7),
                        gr_fecs_ctxsw_mailbox_value_f(0xc0de7777));
                gk20a_writel(g, gr_gpccs_ctxsw_mailbox_r(7),
@@ -1410,7 +1412,7 @@ static int gr_gk20a_create_ctx_header(struct gk20a *g, u32 *header)
 
        nvhost_dbg_fn("");
 
-       if (CONFIG_GK20A_SIM) { /* fmodel */
+       if (tegra_revision == TEGRA_REVISION_SIM) {
                num_gpcs = g->gr.gpc_count;
        } else {
                num_gpcs = gk20a_readl(g, gr_fecs_fs_r());
@@ -1436,7 +1438,7 @@ static int gr_gk20a_create_ctx_header(struct gk20a *g, u32 *header)
        header_curr[ctxsw_prog_local_magic_value_v() >> 2] =
                ctxsw_prog_local_magic_value_v_value_f();
 
-       if (!CONFIG_GK20A_SIM) {
+       if (tegra_revision != TEGRA_REVISION_SIM) {
                rc_offset = 0;
                rc_size = 0;
 
@@ -1513,7 +1515,7 @@ static int gr_gk20a_create_ctx_header(struct gk20a *g, u32 *header)
                header_curr[ctxsw_prog_local_magic_value_v() >> 2] =
                        ctxsw_prog_local_magic_value_v_value_f();
 
-               if (!CONFIG_GK20A_SIM) {
+               if (tegra_revision != TEGRA_REVISION_SIM) {
                        rc_offset = 0;
                        rc_size = 0;
 
@@ -3259,11 +3261,11 @@ static void gr_gk20a_init_elcg_mode(struct gk20a *g, u32 mode, u32 engine)
                        "invalid elcg mode %d", mode);
        }
 
-#ifdef CONFIG_GK20A_SIM
-       gate_ctrl = set_field(gate_ctrl,
+       if (tegra_revision == TEGRA_REVISION_SIM) {
+               gate_ctrl = set_field(gate_ctrl,
                        therm_gate_ctrl_eng_delay_after_m(),
                        therm_gate_ctrl_eng_delay_after_f(4));
-#endif
+       }
 
        /* 2 * (1 << 5) = 64 clks */
        gate_ctrl = set_field(gate_ctrl,
index 48d500a..ff49cbb 100644 (file)
@@ -21,6 +21,8 @@
 
 #include <linux/delay.h>       /* for mdelay */
 
+#include <mach/hardware.h>
+
 #include "../dev.h"
 
 #include "gk20a.h"
 #include "hw_pri_ringmaster_gk20a.h"
 #include "hw_pri_ringstation_sys_gk20a.h"
 
-#if defined (CONFIG_TEGRA_SIMULATION_PLATFORM) && !defined (CONFIG_TEGRA_SIMULATION_SPLIT_MEM)
-
-void gk20a_reset_priv_ring(struct gk20a *g) {}
-void gk20a_priv_ring_isr(struct gk20a *g) {}
-
-#else
-
 void gk20a_reset_priv_ring(struct gk20a *g)
 {
        u32 pmc_en, decode_cfg, data;
        s32 retry = 200;
 
+       if (tegra_revision == TEGRA_REVISION_SIM)
+               return;
+
        pmc_en = gk20a_readl(g, mc_enable_r());
        pmc_en &= ~mc_enable_priv_ring_enabled_f();
        gk20a_writel(g, mc_enable_r(), pmc_en);
@@ -94,6 +92,9 @@ void gk20a_priv_ring_isr(struct gk20a *g)
        u32 cmd;
        s32 retry = 100;
 
+       if (tegra_revision == TEGRA_REVISION_SIM)
+               return;
+
        status0 = gk20a_readl(g, pri_ringmaster_intr_status0_r());
        status1 = gk20a_readl(g, pri_ringmaster_intr_status1_r());
 
@@ -124,4 +125,3 @@ void gk20a_priv_ring_isr(struct gk20a *g)
                " status1: 0x%08x", status0, status1);
 }
 
-#endif /* defined (CONFIG_TEGRA_SIMULATION_PLATFORM) && !defined (CONFIG_TEGRA_SIMULATION_SPLIT_MEM) */