gpu: host1x: Update host1x to align with v5.10

Update the host1x driver to Linux v5.10 with the 'Host1x/Tegra UAPI'
series [0] applied. This driver is built as an external module for
testing and development with upstream Linux kernels.

[0] https://patchwork.ozlabs.org/project/linux-tegra/list/?series=215770

Bug 3205478

Change-Id: I32c1a492293ca30dd47d1edf75aa53aa9e74b400
Signed-off-by: Jon Hunter <jonathanh@nvidia.com>
Reviewed-on: https://git-master.nvidia.com/r/c/linux-nvidia/+/2460074
Tested-by: mobile promotions <svcmobile_promotions@nvidia.com>
Reviewed-by: Shanker Donthineni <sdonthineni@nvidia.com>
Reviewed-by: Mikko Perttunen <mperttunen@nvidia.com>
Reviewed-by: mobile promotions <svcmobile_promotions@nvidia.com>
GVS: Gerrit_Virtual_Submit
This commit is contained in:
Jon Hunter
2020-12-15 12:12:47 +00:00
committed by Laxman Dewangan
parent cc5bcef3f6
commit 9f0b4d74ea
2 changed files with 18 additions and 26 deletions

View File

@@ -192,11 +192,9 @@ static unsigned int pin_job(struct host1x *host, struct host1x_job *job)
goto unpin; goto unpin;
} }
err = dma_map_sg(dev, sgt->sgl, sgt->nents, dir); err = dma_map_sgtable(dev, sgt, dir, 0);
if (!err) { if (err)
err = -ENOMEM;
goto unpin; goto unpin;
}
job->unpins[job->num_unpins].dev = dev; job->unpins[job->num_unpins].dev = dev;
job->unpins[job->num_unpins].dir = dir; job->unpins[job->num_unpins].dir = dir;
@@ -253,7 +251,7 @@ static unsigned int pin_job(struct host1x *host, struct host1x_job *job)
} }
if (host->domain) { if (host->domain) {
for_each_sg(sgt->sgl, sg, sgt->nents, j) for_each_sgtable_sg(sgt, sg, j)
gather_size += sg->length; gather_size += sg->length;
gather_size = iova_align(&host->iova, gather_size); gather_size = iova_align(&host->iova, gather_size);
@@ -265,9 +263,9 @@ static unsigned int pin_job(struct host1x *host, struct host1x_job *job)
goto put; goto put;
} }
err = iommu_map_sg(host->domain, err = iommu_map_sgtable(host->domain,
iova_dma_addr(&host->iova, alloc), iova_dma_addr(&host->iova, alloc),
sgt->sgl, sgt->nents, IOMMU_READ); sgt, IOMMU_READ);
if (err == 0) { if (err == 0) {
__free_iova(&host->iova, alloc); __free_iova(&host->iova, alloc);
err = -EINVAL; err = -EINVAL;
@@ -277,12 +275,9 @@ static unsigned int pin_job(struct host1x *host, struct host1x_job *job)
job->unpins[job->num_unpins].size = gather_size; job->unpins[job->num_unpins].size = gather_size;
phys_addr = iova_dma_addr(&host->iova, alloc); phys_addr = iova_dma_addr(&host->iova, alloc);
} else if (sgt) { } else if (sgt) {
err = dma_map_sg(host->dev, sgt->sgl, sgt->nents, err = dma_map_sgtable(host->dev, sgt, DMA_TO_DEVICE, 0);
DMA_TO_DEVICE); if (err)
if (!err) {
err = -ENOMEM;
goto put; goto put;
}
job->unpins[job->num_unpins].dir = DMA_TO_DEVICE; job->unpins[job->num_unpins].dir = DMA_TO_DEVICE;
job->unpins[job->num_unpins].dev = host->dev; job->unpins[job->num_unpins].dev = host->dev;
@@ -699,8 +694,7 @@ void host1x_job_unpin(struct host1x_job *job)
} }
if (unpin->dev && sgt) if (unpin->dev && sgt)
dma_unmap_sg(unpin->dev, sgt->sgl, sgt->nents, dma_unmap_sgtable(unpin->dev, sgt, unpin->dir, 0);
unpin->dir);
host1x_bo_unpin(dev, unpin->bo, sgt); host1x_bo_unpin(dev, unpin->bo, sgt);
host1x_bo_put(unpin->bo); host1x_bo_put(unpin->bo);

View File

@@ -293,19 +293,13 @@ int tegra_mipi_disable(struct tegra_mipi_device *dev)
} }
EXPORT_SYMBOL(tegra_mipi_disable); EXPORT_SYMBOL(tegra_mipi_disable);
int tegra_mipi_wait(struct tegra_mipi_device *device) int tegra_mipi_finish_calibration(struct tegra_mipi_device *device)
{ {
struct tegra_mipi *mipi = device->mipi; struct tegra_mipi *mipi = device->mipi;
void __iomem *status_reg = mipi->regs + (MIPI_CAL_STATUS << 2); void __iomem *status_reg = mipi->regs + (MIPI_CAL_STATUS << 2);
u32 value; u32 value;
int err; int err;
err = clk_enable(device->mipi->clk);
if (err < 0)
return err;
mutex_lock(&device->mipi->lock);
err = readl_relaxed_poll_timeout(status_reg, value, err = readl_relaxed_poll_timeout(status_reg, value,
!(value & MIPI_CAL_STATUS_ACTIVE) && !(value & MIPI_CAL_STATUS_ACTIVE) &&
(value & MIPI_CAL_STATUS_DONE), 50, (value & MIPI_CAL_STATUS_DONE), 50,
@@ -315,9 +309,9 @@ int tegra_mipi_wait(struct tegra_mipi_device *device)
return err; return err;
} }
EXPORT_SYMBOL(tegra_mipi_wait); EXPORT_SYMBOL(tegra_mipi_finish_calibration);
int tegra_mipi_calibrate(struct tegra_mipi_device *device) int tegra_mipi_start_calibration(struct tegra_mipi_device *device)
{ {
const struct tegra_mipi_soc *soc = device->mipi->soc; const struct tegra_mipi_soc *soc = device->mipi->soc;
unsigned int i; unsigned int i;
@@ -381,12 +375,16 @@ int tegra_mipi_calibrate(struct tegra_mipi_device *device)
value |= MIPI_CAL_CTRL_START; value |= MIPI_CAL_CTRL_START;
tegra_mipi_writel(device->mipi, value, MIPI_CAL_CTRL); tegra_mipi_writel(device->mipi, value, MIPI_CAL_CTRL);
mutex_unlock(&device->mipi->lock); /*
clk_disable(device->mipi->clk); * Wait for min 72uS to let calibration logic finish calibration
* sequence codes before waiting for pads idle state to apply the
* results.
*/
usleep_range(75, 80);
return 0; return 0;
} }
EXPORT_SYMBOL(tegra_mipi_calibrate); EXPORT_SYMBOL(tegra_mipi_start_calibration);
static const struct tegra_mipi_pad tegra114_mipi_pads[] = { static const struct tegra_mipi_pad tegra114_mipi_pads[] = {
{ .data = MIPI_CAL_CONFIG_CSIA }, { .data = MIPI_CAL_CONFIG_CSIA },