Esempio n. 1
0
int nvhost_vic_finalize_poweron(struct platform_device *pdev)
{
	struct nvhost_device_data *pdata = nvhost_get_devdata(pdev);
	int err;

	nvhost_dbg_fn("");

	host1x_writel(pdev, flcn_slcg_override_high_a_r(), 0);
	host1x_writel(pdev, flcn_cg_r(),
		     flcn_cg_idle_cg_dly_cnt_f(4) |
		     flcn_cg_idle_cg_en_f(1) |
		     flcn_cg_wakeup_dly_cnt_f(4));

	err = nvhost_flcn_boot(pdev);
	if (err)
		return err;

	if (pdata->scaling_init) {
		err = nvhost_scale_hw_init(pdev);
		if (err)
			dev_warn(&pdev->dev, "failed to initialize scaling (%d)",
				 err);
	}

	return 0;
}
Esempio n. 2
0
int nvhost_vic03_finalize_poweron(struct platform_device *pdev)
{
	host1x_writel(pdev, flcn_slcg_override_high_a_r(), 0);
	host1x_writel(pdev, flcn_cg_r(),
		     flcn_cg_idle_cg_dly_cnt_f(4) |
		     flcn_cg_idle_cg_en_f(1) |
		     flcn_cg_wakeup_dly_cnt_f(4));
	return vic03_boot(pdev);
}
Esempio n. 3
0
static int msenc_dma_pa_to_internal_256b(struct platform_device *dev,
        u32 offset, u32 internal_offset, bool imem)
{
    u32 cmd = msenc_dmatrfcmd_size_256b_f();
    u32 pa_offset =  msenc_dmatrffboffs_offs_f(offset);
    u32 i_offset = msenc_dmatrfmoffs_offs_f(internal_offset);
    u32 timeout = 0; /* default*/

    if (imem)
        cmd |= msenc_dmatrfcmd_imem_true_f();

    host1x_writel(dev, msenc_dmatrfmoffs_r(), i_offset);
    host1x_writel(dev, msenc_dmatrffboffs_r(), pa_offset);
    host1x_writel(dev, msenc_dmatrfcmd_r(), cmd);

    return msenc_dma_wait_idle(dev, &timeout);

}
Esempio n. 4
0
int vi_disable_irq(struct vi *tegra_vi)
{
	int val;
	int err = 0;

	err = nvhost_module_busy(tegra_vi->ndev);
	if (err)
		return err;

	if (tegra_vi->ndev->id) {
		/* Disable FIFO Overflow Interrupt */
		host1x_writel(tegra_vi->ndev,
				CSI_CSI_PIXEL_PARSER_B_INTERRUPT_MASK_0,
				0);

		/* Reset status register */
		val = host1x_readl(tegra_vi->ndev,
					CSI_CSI_PIXEL_PARSER_B_STATUS_0);

		host1x_writel(tegra_vi->ndev,
				CSI_CSI_PIXEL_PARSER_B_STATUS_0,
				val);
	} else {
		/* interrupts are associated only with master dev vi.0 */
		disable_irq(tegra_vi->vi_irq);

		/* Disable FIFO Overflow Interrupt */
		host1x_writel(tegra_vi->ndev,
				CSI_CSI_PIXEL_PARSER_A_INTERRUPT_MASK_0,
				0);

		/* Reset status register */
		val = host1x_readl(tegra_vi->ndev,
					CSI_CSI_PIXEL_PARSER_A_STATUS_0);

		host1x_writel(tegra_vi->ndev,
				CSI_CSI_PIXEL_PARSER_A_STATUS_0,
				val);
	}

	nvhost_module_idle(tegra_vi->ndev);

	return 0;
}
Esempio n. 5
0
static int vic03_flcn_dma_pa_to_internal_256b(struct platform_device *pdev,
					      phys_addr_t pa,
					      u32 internal_offset,
					      bool imem)
{
	u32 cmd = flcn_dmatrfcmd_size_256b_f();
	u32 pa_offset =  flcn_dmatrffboffs_offs_f(pa);
	u32 i_offset = flcn_dmatrfmoffs_offs_f(internal_offset);
	u32 timeout = 0; /* default*/

	if (imem)
		cmd |= flcn_dmatrfcmd_imem_true_f();

	host1x_writel(pdev, flcn_dmatrfmoffs_r(), i_offset);
	host1x_writel(pdev, flcn_dmatrffboffs_r(), pa_offset);
	host1x_writel(pdev, flcn_dmatrfcmd_r(), cmd);

	return vic03_flcn_dma_wait_idle(pdev, &timeout);

}
Esempio n. 6
0
static irqreturn_t vi_isr(int irq, void *dev_id)
{
	struct vi *tegra_vi = (struct vi *)dev_id;
	int val;

	dev_dbg(&tegra_vi->ndev->dev, "%s: ++", __func__);

	if (tegra_vi->ndev->id) {
		val = host1x_readl(tegra_vi->ndev,
					CSI_CSI_PIXEL_PARSER_B_STATUS_0);

		/* changes required as per t124 register spec */
		if (val & PPB_FIFO_OVRF)
			atomic_inc(&(tegra_vi->vi_out.overflow));

		/* Reset interrupt status register */
		host1x_writel(tegra_vi->ndev,
				CSI_CSI_PIXEL_PARSER_B_STATUS_0,
				val);
	} else {
		val = host1x_readl(tegra_vi->ndev,
					CSI_CSI_PIXEL_PARSER_A_STATUS_0);

		/* changes required as per t124 register spec */
		if (val & PPA_FIFO_OVRF)
			atomic_inc(&(tegra_vi->vi_out.overflow));

		/* Reset interrupt status register */
		host1x_writel(tegra_vi->ndev,
				CSI_CSI_PIXEL_PARSER_A_STATUS_0,
				val);
	}

	schedule_work(&tegra_vi->stats_work);
	return IRQ_HANDLED;
}
Esempio n. 7
0
int msenc_boot(struct platform_device *dev)
{
    u32 timeout;
    u32 offset;
    int err = 0;
    struct msenc *m = get_msenc(dev);

    /* check if firmware is loaded or not */
    if (!m || !m->valid)
        return -ENOMEDIUM;

    host1x_writel(dev, msenc_dmactl_r(), 0);
    host1x_writel(dev, msenc_dmatrfbase_r(),
                  (m->phys + m->os.bin_data_offset) >> 8);

    for (offset = 0; offset < m->os.data_size; offset += 256)
        msenc_dma_pa_to_internal_256b(dev,
                                      m->os.data_offset + offset,
                                      offset, false);

    msenc_dma_pa_to_internal_256b(dev, m->os.code_offset, 0, true);

    /* setup msenc interrupts and enable interface */
    host1x_writel(dev, msenc_irqmset_r(),
                  (msenc_irqmset_ext_f(0xff) |
                   msenc_irqmset_swgen1_set_f() |
                   msenc_irqmset_swgen0_set_f() |
                   msenc_irqmset_exterr_set_f() |
                   msenc_irqmset_halt_set_f()   |
                   msenc_irqmset_wdtmr_set_f()));
    host1x_writel(dev, msenc_irqdest_r(),
                  (msenc_irqdest_host_ext_f(0xff) |
                   msenc_irqdest_host_swgen1_host_f() |
                   msenc_irqdest_host_swgen0_host_f() |
                   msenc_irqdest_host_exterr_host_f() |
                   msenc_irqdest_host_halt_host_f()));
    host1x_writel(dev, msenc_itfen_r(),
                  (msenc_itfen_mthden_enable_f() |
                   msenc_itfen_ctxen_enable_f()));

    /* boot msenc */
    host1x_writel(dev, msenc_bootvec_r(), msenc_bootvec_vec_f(0));
    host1x_writel(dev, msenc_cpuctl_r(),
                  msenc_cpuctl_startcpu_true_f());

    timeout = 0; /* default */

    err = msenc_wait_idle(dev, &timeout);
    if (err != 0) {
        dev_err(&dev->dev, "boot failed due to timeout");
        return err;
    }

    return 0;
}
Esempio n. 8
0
static int vic03_boot(struct platform_device *pdev)
{
	struct vic03 *v = get_vic03(pdev);
	u32 timeout;
	u32 offset;
	int err = 0;

	/* check if firmware is loaded or not */
	if (!v || !v->ucode.valid)
		return -ENOMEDIUM;

	if (v->is_booted)
		return 0;

	err = vic03_wait_mem_scrubbing(pdev);
	if (err)
		return err;

	host1x_writel(pdev, flcn_dmactl_r(), 0);

	host1x_writel(pdev, flcn_dmatrfbase_r(),
			(v->ucode.dma_addr + v->ucode.os.bin_data_offset) >> 8);

	for (offset = 0; offset < v->ucode.os.data_size; offset += 256)
		vic03_flcn_dma_pa_to_internal_256b(pdev,
					   v->ucode.os.data_offset + offset,
					   offset, false);

	vic03_flcn_dma_pa_to_internal_256b(pdev, v->ucode.os.code_offset,
					   0, true);

	/* setup falcon interrupts and enable interface */
	host1x_writel(pdev, flcn_irqmset_r(), (flcn_irqmset_ext_f(0xff)    |
					   flcn_irqmset_swgen1_set_f() |
					   flcn_irqmset_swgen0_set_f() |
					   flcn_irqmset_exterr_set_f() |
					   flcn_irqmset_halt_set_f()   |
					   flcn_irqmset_wdtmr_set_f()));
	host1x_writel(pdev, flcn_irqdest_r(), (flcn_irqdest_host_ext_f(0xff) |
					   flcn_irqdest_host_swgen1_host_f() |
					   flcn_irqdest_host_swgen0_host_f() |
					   flcn_irqdest_host_exterr_host_f() |
					   flcn_irqdest_host_halt_host_f()));
	host1x_writel(pdev, flcn_itfen_r(), (flcn_itfen_mthden_enable_f() |
					flcn_itfen_ctxen_enable_f()));

	/* boot falcon */
	host1x_writel(pdev, flcn_bootvec_r(), flcn_bootvec_vec_f(0));
	host1x_writel(pdev, flcn_cpuctl_r(), flcn_cpuctl_startcpu_true_f());

	timeout = 0; /* default */

	err = vic03_flcn_wait_idle(pdev, &timeout);
	if (err != 0) {
		dev_err(&pdev->dev, "boot failed due to timeout");
		return err;
	}

	v->is_booted = true;

	return 0;
}