Merge branch 'etnaviv/next' of https://git.pengutronix.de/git/lst/linux into drm-next
So what we have for this cycle is a bit of spring cleaning with removal of unused register logging code and getting rid of the license text in favor of SPDX, a few smaller MMU handling improvements and a timeout calculation change, fixing premature fence wait timeouts after 50 days of uptime. Signed-off-by: Dave Airlie <airlied@redhat.com> Link: https://patchwork.freedesktop.org/patch/msgid/1526652437.28565.2.camel@pengutronix.de
This commit is contained in:
commit
ca6444f341
|
@ -22,11 +22,3 @@ config DRM_ETNAVIV_THERMAL
|
|||
help
|
||||
Compile in support for thermal throttling.
|
||||
Say Y unless you want to risk burning your SoC.
|
||||
|
||||
config DRM_ETNAVIV_REGISTER_LOGGING
|
||||
bool "enable ETNAVIV register logging"
|
||||
depends on DRM_ETNAVIV
|
||||
help
|
||||
Compile in support for logging register reads/writes in a format
|
||||
that can be parsed by envytools demsm tool. If enabled, register
|
||||
logging can be switched on via etnaviv.reglog=y module param.
|
||||
|
|
|
@ -1,18 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2014 Etnaviv Project
|
||||
* Author: Christian Gmeiner <christian.gmeiner@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2014-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#include "etnaviv_cmdbuf.h"
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2015 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2015-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#include <linux/kernel.h>
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2017 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2017-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#include <drm/drm_mm.h>
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2017 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __ETNAVIV_CMDBUF_H__
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2015 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2015-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#include <linux/component.h>
|
||||
|
@ -25,57 +14,6 @@
|
|||
#include "etnaviv_mmu.h"
|
||||
#include "etnaviv_perfmon.h"
|
||||
|
||||
#ifdef CONFIG_DRM_ETNAVIV_REGISTER_LOGGING
|
||||
static bool reglog;
|
||||
MODULE_PARM_DESC(reglog, "Enable register read/write logging");
|
||||
module_param(reglog, bool, 0600);
|
||||
#else
|
||||
#define reglog 0
|
||||
#endif
|
||||
|
||||
void __iomem *etnaviv_ioremap(struct platform_device *pdev, const char *name,
|
||||
const char *dbgname)
|
||||
{
|
||||
struct resource *res;
|
||||
void __iomem *ptr;
|
||||
|
||||
if (name)
|
||||
res = platform_get_resource_byname(pdev, IORESOURCE_MEM, name);
|
||||
else
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
|
||||
ptr = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(ptr)) {
|
||||
dev_err(&pdev->dev, "failed to ioremap %s: %ld\n", name,
|
||||
PTR_ERR(ptr));
|
||||
return ptr;
|
||||
}
|
||||
|
||||
if (reglog)
|
||||
dev_printk(KERN_DEBUG, &pdev->dev, "IO:region %s 0x%p %08zx\n",
|
||||
dbgname, ptr, (size_t)resource_size(res));
|
||||
|
||||
return ptr;
|
||||
}
|
||||
|
||||
void etnaviv_writel(u32 data, void __iomem *addr)
|
||||
{
|
||||
if (reglog)
|
||||
printk(KERN_DEBUG "IO:W %p %08x\n", addr, data);
|
||||
|
||||
writel(data, addr);
|
||||
}
|
||||
|
||||
u32 etnaviv_readl(const void __iomem *addr)
|
||||
{
|
||||
u32 val = readl(addr);
|
||||
|
||||
if (reglog)
|
||||
printk(KERN_DEBUG "IO:R %p %08x\n", addr, val);
|
||||
|
||||
return val;
|
||||
}
|
||||
|
||||
/*
|
||||
* DRM operations:
|
||||
*/
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2015 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2015-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#ifndef __ETNAVIV_DRV_H__
|
||||
|
@ -26,6 +15,7 @@
|
|||
#include <linux/pm_runtime.h>
|
||||
#include <linux/slab.h>
|
||||
#include <linux/list.h>
|
||||
#include <linux/time64.h>
|
||||
#include <linux/types.h>
|
||||
#include <linux/sizes.h>
|
||||
|
||||
|
@ -101,11 +91,6 @@ void etnaviv_gem_describe_objects(struct etnaviv_drm_private *priv,
|
|||
struct seq_file *m);
|
||||
#endif
|
||||
|
||||
void __iomem *etnaviv_ioremap(struct platform_device *pdev, const char *name,
|
||||
const char *dbgname);
|
||||
void etnaviv_writel(u32 data, void __iomem *addr);
|
||||
u32 etnaviv_readl(const void __iomem *addr);
|
||||
|
||||
#define DBG(fmt, ...) DRM_DEBUG(fmt"\n", ##__VA_ARGS__)
|
||||
#define VERB(fmt, ...) if (0) DRM_DEBUG(fmt"\n", ##__VA_ARGS__)
|
||||
|
||||
|
@ -132,19 +117,27 @@ static inline bool fence_after_eq(u32 a, u32 b)
|
|||
return (s32)(a - b) >= 0;
|
||||
}
|
||||
|
||||
/*
|
||||
* Etnaviv timeouts are specified wrt CLOCK_MONOTONIC, not jiffies.
|
||||
* We need to calculate the timeout in terms of number of jiffies
|
||||
* between the specified timeout and the current CLOCK_MONOTONIC time.
|
||||
*/
|
||||
static inline unsigned long etnaviv_timeout_to_jiffies(
|
||||
const struct timespec *timeout)
|
||||
{
|
||||
unsigned long timeout_jiffies = timespec_to_jiffies(timeout);
|
||||
unsigned long start_jiffies = jiffies;
|
||||
unsigned long remaining_jiffies;
|
||||
struct timespec64 ts, to;
|
||||
|
||||
if (time_after(start_jiffies, timeout_jiffies))
|
||||
remaining_jiffies = 0;
|
||||
else
|
||||
remaining_jiffies = timeout_jiffies - start_jiffies;
|
||||
to = timespec_to_timespec64(*timeout);
|
||||
|
||||
return remaining_jiffies;
|
||||
ktime_get_ts64(&ts);
|
||||
|
||||
/* timeouts before "now" have already expired */
|
||||
if (timespec64_compare(&to, &ts) <= 0)
|
||||
return 0;
|
||||
|
||||
ts = timespec64_sub(to, ts);
|
||||
|
||||
return timespec64_to_jiffies(&ts);
|
||||
}
|
||||
|
||||
#endif /* __ETNAVIV_DRV_H__ */
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2015 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2015-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#include <linux/devcoredump.h>
|
||||
|
|
|
@ -1,20 +1,8 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2015 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*
|
||||
* Etnaviv devcoredump file definitions
|
||||
*/
|
||||
|
||||
#ifndef ETNAVIV_DUMP_H
|
||||
#define ETNAVIV_DUMP_H
|
||||
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2015 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2015-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#include <linux/spinlock.h>
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2015 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2015-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#ifndef __ETNAVIV_GEM_H__
|
||||
|
|
|
@ -1,18 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2013 Red Hat
|
||||
* Author: Rob Clark <robdclark@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2014-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#include <linux/dma-buf.h>
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2015 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2015-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#include <linux/component.h>
|
||||
|
@ -1735,6 +1724,7 @@ static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
|
|||
{
|
||||
struct device *dev = &pdev->dev;
|
||||
struct etnaviv_gpu *gpu;
|
||||
struct resource *res;
|
||||
int err;
|
||||
|
||||
gpu = devm_kzalloc(dev, sizeof(*gpu), GFP_KERNEL);
|
||||
|
@ -1746,7 +1736,8 @@ static int etnaviv_gpu_platform_probe(struct platform_device *pdev)
|
|||
mutex_init(&gpu->fence_idr_lock);
|
||||
|
||||
/* Map registers: */
|
||||
gpu->mmio = etnaviv_ioremap(pdev, NULL, dev_name(gpu->dev));
|
||||
res = platform_get_resource(pdev, IORESOURCE_MEM, 0);
|
||||
gpu->mmio = devm_ioremap_resource(&pdev->dev, res);
|
||||
if (IS_ERR(gpu->mmio))
|
||||
return PTR_ERR(gpu->mmio);
|
||||
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2015 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2015-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#ifndef __ETNAVIV_GPU_H__
|
||||
|
@ -161,12 +150,12 @@ struct etnaviv_gpu {
|
|||
|
||||
static inline void gpu_write(struct etnaviv_gpu *gpu, u32 reg, u32 data)
|
||||
{
|
||||
etnaviv_writel(data, gpu->mmio + reg);
|
||||
writel(data, gpu->mmio + reg);
|
||||
}
|
||||
|
||||
static inline u32 gpu_read(struct etnaviv_gpu *gpu, u32 reg)
|
||||
{
|
||||
return etnaviv_readl(gpu->mmio + reg);
|
||||
return readl(gpu->mmio + reg);
|
||||
}
|
||||
|
||||
static inline bool fence_completed(struct etnaviv_gpu *gpu, u32 fence)
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2018 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "etnaviv_gpu.h"
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2014 Christian Gmeiner <christian.gmeiner@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2014-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
|
@ -47,11 +36,10 @@ static int __etnaviv_iommu_init(struct etnaviv_iommuv1_domain *etnaviv_domain)
|
|||
u32 *p;
|
||||
int i;
|
||||
|
||||
etnaviv_domain->base.bad_page_cpu = dma_alloc_coherent(
|
||||
etnaviv_domain->base.dev,
|
||||
SZ_4K,
|
||||
&etnaviv_domain->base.bad_page_dma,
|
||||
GFP_KERNEL);
|
||||
etnaviv_domain->base.bad_page_cpu =
|
||||
dma_alloc_wc(etnaviv_domain->base.dev, SZ_4K,
|
||||
&etnaviv_domain->base.bad_page_dma,
|
||||
GFP_KERNEL);
|
||||
if (!etnaviv_domain->base.bad_page_cpu)
|
||||
return -ENOMEM;
|
||||
|
||||
|
@ -59,14 +47,14 @@ static int __etnaviv_iommu_init(struct etnaviv_iommuv1_domain *etnaviv_domain)
|
|||
for (i = 0; i < SZ_4K / 4; i++)
|
||||
*p++ = 0xdead55aa;
|
||||
|
||||
etnaviv_domain->pgtable_cpu =
|
||||
dma_alloc_coherent(etnaviv_domain->base.dev, PT_SIZE,
|
||||
&etnaviv_domain->pgtable_dma,
|
||||
GFP_KERNEL);
|
||||
etnaviv_domain->pgtable_cpu = dma_alloc_wc(etnaviv_domain->base.dev,
|
||||
PT_SIZE,
|
||||
&etnaviv_domain->pgtable_dma,
|
||||
GFP_KERNEL);
|
||||
if (!etnaviv_domain->pgtable_cpu) {
|
||||
dma_free_coherent(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->base.bad_page_cpu,
|
||||
etnaviv_domain->base.bad_page_dma);
|
||||
dma_free_wc(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->base.bad_page_cpu,
|
||||
etnaviv_domain->base.bad_page_dma);
|
||||
return -ENOMEM;
|
||||
}
|
||||
|
||||
|
@ -81,13 +69,12 @@ static void etnaviv_iommuv1_domain_free(struct etnaviv_iommu_domain *domain)
|
|||
struct etnaviv_iommuv1_domain *etnaviv_domain =
|
||||
to_etnaviv_domain(domain);
|
||||
|
||||
dma_free_coherent(etnaviv_domain->base.dev, PT_SIZE,
|
||||
etnaviv_domain->pgtable_cpu,
|
||||
etnaviv_domain->pgtable_dma);
|
||||
dma_free_wc(etnaviv_domain->base.dev, PT_SIZE,
|
||||
etnaviv_domain->pgtable_cpu, etnaviv_domain->pgtable_dma);
|
||||
|
||||
dma_free_coherent(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->base.bad_page_cpu,
|
||||
etnaviv_domain->base.bad_page_dma);
|
||||
dma_free_wc(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->base.bad_page_cpu,
|
||||
etnaviv_domain->base.bad_page_dma);
|
||||
|
||||
kfree(etnaviv_domain);
|
||||
}
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2014 Christian Gmeiner <christian.gmeiner@gmail.com>
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2014-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#ifndef __ETNAVIV_IOMMU_H__
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2016 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2016-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#include <linux/platform_device.h>
|
||||
|
@ -47,8 +36,8 @@ struct etnaviv_iommuv2_domain {
|
|||
u32 *mtlb_cpu;
|
||||
dma_addr_t mtlb_dma;
|
||||
/* S(lave) TLB aka second level pagetable */
|
||||
u32 *stlb_cpu[1024];
|
||||
dma_addr_t stlb_dma[1024];
|
||||
u32 *stlb_cpu[MMUv2_MAX_STLB_ENTRIES];
|
||||
dma_addr_t stlb_dma[MMUv2_MAX_STLB_ENTRIES];
|
||||
};
|
||||
|
||||
static struct etnaviv_iommuv2_domain *
|
||||
|
@ -57,24 +46,54 @@ to_etnaviv_domain(struct etnaviv_iommu_domain *domain)
|
|||
return container_of(domain, struct etnaviv_iommuv2_domain, base);
|
||||
}
|
||||
|
||||
static int
|
||||
etnaviv_iommuv2_ensure_stlb(struct etnaviv_iommuv2_domain *etnaviv_domain,
|
||||
int stlb)
|
||||
{
|
||||
if (etnaviv_domain->stlb_cpu[stlb])
|
||||
return 0;
|
||||
|
||||
etnaviv_domain->stlb_cpu[stlb] =
|
||||
dma_alloc_wc(etnaviv_domain->base.dev, SZ_4K,
|
||||
&etnaviv_domain->stlb_dma[stlb],
|
||||
GFP_KERNEL);
|
||||
|
||||
if (!etnaviv_domain->stlb_cpu[stlb])
|
||||
return -ENOMEM;
|
||||
|
||||
memset32(etnaviv_domain->stlb_cpu[stlb], MMUv2_PTE_EXCEPTION,
|
||||
SZ_4K / sizeof(u32));
|
||||
|
||||
etnaviv_domain->mtlb_cpu[stlb] = etnaviv_domain->stlb_dma[stlb] |
|
||||
MMUv2_PTE_PRESENT;
|
||||
return 0;
|
||||
}
|
||||
|
||||
static int etnaviv_iommuv2_map(struct etnaviv_iommu_domain *domain,
|
||||
unsigned long iova, phys_addr_t paddr,
|
||||
size_t size, int prot)
|
||||
{
|
||||
struct etnaviv_iommuv2_domain *etnaviv_domain =
|
||||
to_etnaviv_domain(domain);
|
||||
int mtlb_entry, stlb_entry;
|
||||
u32 entry = (u32)paddr | MMUv2_PTE_PRESENT;
|
||||
int mtlb_entry, stlb_entry, ret;
|
||||
u32 entry = lower_32_bits(paddr) | MMUv2_PTE_PRESENT;
|
||||
|
||||
if (size != SZ_4K)
|
||||
return -EINVAL;
|
||||
|
||||
if (IS_ENABLED(CONFIG_PHYS_ADDR_T_64BIT))
|
||||
entry |= (upper_32_bits(paddr) & 0xff) << 4;
|
||||
|
||||
if (prot & ETNAVIV_PROT_WRITE)
|
||||
entry |= MMUv2_PTE_WRITEABLE;
|
||||
|
||||
mtlb_entry = (iova & MMUv2_MTLB_MASK) >> MMUv2_MTLB_SHIFT;
|
||||
stlb_entry = (iova & MMUv2_STLB_MASK) >> MMUv2_STLB_SHIFT;
|
||||
|
||||
ret = etnaviv_iommuv2_ensure_stlb(etnaviv_domain, mtlb_entry);
|
||||
if (ret)
|
||||
return ret;
|
||||
|
||||
etnaviv_domain->stlb_cpu[mtlb_entry][stlb_entry] = entry;
|
||||
|
||||
return 0;
|
||||
|
@ -101,14 +120,13 @@ static size_t etnaviv_iommuv2_unmap(struct etnaviv_iommu_domain *domain,
|
|||
static int etnaviv_iommuv2_init(struct etnaviv_iommuv2_domain *etnaviv_domain)
|
||||
{
|
||||
u32 *p;
|
||||
int ret, i, j;
|
||||
int ret, i;
|
||||
|
||||
/* allocate scratch page */
|
||||
etnaviv_domain->base.bad_page_cpu = dma_alloc_coherent(
|
||||
etnaviv_domain->base.dev,
|
||||
SZ_4K,
|
||||
&etnaviv_domain->base.bad_page_dma,
|
||||
GFP_KERNEL);
|
||||
etnaviv_domain->base.bad_page_cpu =
|
||||
dma_alloc_wc(etnaviv_domain->base.dev, SZ_4K,
|
||||
&etnaviv_domain->base.bad_page_dma,
|
||||
GFP_KERNEL);
|
||||
if (!etnaviv_domain->base.bad_page_cpu) {
|
||||
ret = -ENOMEM;
|
||||
goto fail_mem;
|
||||
|
@ -117,67 +135,40 @@ static int etnaviv_iommuv2_init(struct etnaviv_iommuv2_domain *etnaviv_domain)
|
|||
for (i = 0; i < SZ_4K / 4; i++)
|
||||
*p++ = 0xdead55aa;
|
||||
|
||||
etnaviv_domain->pta_cpu = dma_alloc_coherent(etnaviv_domain->base.dev,
|
||||
SZ_4K,
|
||||
&etnaviv_domain->pta_dma,
|
||||
GFP_KERNEL);
|
||||
etnaviv_domain->pta_cpu = dma_alloc_wc(etnaviv_domain->base.dev,
|
||||
SZ_4K, &etnaviv_domain->pta_dma,
|
||||
GFP_KERNEL);
|
||||
if (!etnaviv_domain->pta_cpu) {
|
||||
ret = -ENOMEM;
|
||||
goto fail_mem;
|
||||
}
|
||||
|
||||
etnaviv_domain->mtlb_cpu = dma_alloc_coherent(etnaviv_domain->base.dev,
|
||||
SZ_4K,
|
||||
&etnaviv_domain->mtlb_dma,
|
||||
GFP_KERNEL);
|
||||
etnaviv_domain->mtlb_cpu = dma_alloc_wc(etnaviv_domain->base.dev,
|
||||
SZ_4K, &etnaviv_domain->mtlb_dma,
|
||||
GFP_KERNEL);
|
||||
if (!etnaviv_domain->mtlb_cpu) {
|
||||
ret = -ENOMEM;
|
||||
goto fail_mem;
|
||||
}
|
||||
|
||||
/* pre-populate STLB pages (may want to switch to on-demand later) */
|
||||
for (i = 0; i < MMUv2_MAX_STLB_ENTRIES; i++) {
|
||||
etnaviv_domain->stlb_cpu[i] =
|
||||
dma_alloc_coherent(etnaviv_domain->base.dev,
|
||||
SZ_4K,
|
||||
&etnaviv_domain->stlb_dma[i],
|
||||
GFP_KERNEL);
|
||||
if (!etnaviv_domain->stlb_cpu[i]) {
|
||||
ret = -ENOMEM;
|
||||
goto fail_mem;
|
||||
}
|
||||
p = etnaviv_domain->stlb_cpu[i];
|
||||
for (j = 0; j < SZ_4K / 4; j++)
|
||||
*p++ = MMUv2_PTE_EXCEPTION;
|
||||
|
||||
etnaviv_domain->mtlb_cpu[i] = etnaviv_domain->stlb_dma[i] |
|
||||
MMUv2_PTE_PRESENT;
|
||||
}
|
||||
memset32(etnaviv_domain->mtlb_cpu, MMUv2_PTE_EXCEPTION,
|
||||
MMUv2_MAX_STLB_ENTRIES);
|
||||
|
||||
return 0;
|
||||
|
||||
fail_mem:
|
||||
if (etnaviv_domain->base.bad_page_cpu)
|
||||
dma_free_coherent(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->base.bad_page_cpu,
|
||||
etnaviv_domain->base.bad_page_dma);
|
||||
dma_free_wc(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->base.bad_page_cpu,
|
||||
etnaviv_domain->base.bad_page_dma);
|
||||
|
||||
if (etnaviv_domain->pta_cpu)
|
||||
dma_free_coherent(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->pta_cpu,
|
||||
etnaviv_domain->pta_dma);
|
||||
dma_free_wc(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->pta_cpu, etnaviv_domain->pta_dma);
|
||||
|
||||
if (etnaviv_domain->mtlb_cpu)
|
||||
dma_free_coherent(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->mtlb_cpu,
|
||||
etnaviv_domain->mtlb_dma);
|
||||
|
||||
for (i = 0; i < MMUv2_MAX_STLB_ENTRIES; i++) {
|
||||
if (etnaviv_domain->stlb_cpu[i])
|
||||
dma_free_coherent(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->stlb_cpu[i],
|
||||
etnaviv_domain->stlb_dma[i]);
|
||||
}
|
||||
dma_free_wc(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->mtlb_cpu, etnaviv_domain->mtlb_dma);
|
||||
|
||||
return ret;
|
||||
}
|
||||
|
@ -188,23 +179,21 @@ static void etnaviv_iommuv2_domain_free(struct etnaviv_iommu_domain *domain)
|
|||
to_etnaviv_domain(domain);
|
||||
int i;
|
||||
|
||||
dma_free_coherent(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->base.bad_page_cpu,
|
||||
etnaviv_domain->base.bad_page_dma);
|
||||
dma_free_wc(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->base.bad_page_cpu,
|
||||
etnaviv_domain->base.bad_page_dma);
|
||||
|
||||
dma_free_coherent(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->pta_cpu,
|
||||
etnaviv_domain->pta_dma);
|
||||
dma_free_wc(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->pta_cpu, etnaviv_domain->pta_dma);
|
||||
|
||||
dma_free_coherent(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->mtlb_cpu,
|
||||
etnaviv_domain->mtlb_dma);
|
||||
dma_free_wc(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->mtlb_cpu, etnaviv_domain->mtlb_dma);
|
||||
|
||||
for (i = 0; i < MMUv2_MAX_STLB_ENTRIES; i++) {
|
||||
if (etnaviv_domain->stlb_cpu[i])
|
||||
dma_free_coherent(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->stlb_cpu[i],
|
||||
etnaviv_domain->stlb_dma[i]);
|
||||
dma_free_wc(etnaviv_domain->base.dev, SZ_4K,
|
||||
etnaviv_domain->stlb_cpu[i],
|
||||
etnaviv_domain->stlb_dma[i]);
|
||||
}
|
||||
|
||||
vfree(etnaviv_domain);
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2015 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2015-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#include "common.xml.h"
|
||||
|
@ -162,22 +151,10 @@ static int etnaviv_iommu_find_iova(struct etnaviv_iommu *mmu,
|
|||
bool found;
|
||||
|
||||
ret = drm_mm_insert_node_in_range(&mmu->mm, node,
|
||||
size, 0, 0,
|
||||
mmu->last_iova, U64_MAX,
|
||||
mode);
|
||||
size, 0, 0, 0, U64_MAX, mode);
|
||||
if (ret != -ENOSPC)
|
||||
break;
|
||||
|
||||
/*
|
||||
* If we did not search from the start of the MMU region,
|
||||
* try again in case there are free slots.
|
||||
*/
|
||||
if (mmu->last_iova) {
|
||||
mmu->last_iova = 0;
|
||||
mmu->need_flush = true;
|
||||
continue;
|
||||
}
|
||||
|
||||
/* Try to retire some entries */
|
||||
drm_mm_scan_init(&scan, &mmu->mm, size, 0, 0, mode);
|
||||
|
||||
|
@ -274,7 +251,6 @@ int etnaviv_iommu_map_gem(struct etnaviv_iommu *mmu,
|
|||
if (ret < 0)
|
||||
goto unlock;
|
||||
|
||||
mmu->last_iova = node->start + etnaviv_obj->base.size;
|
||||
mapping->iova = node->start;
|
||||
ret = etnaviv_iommu_map(mmu, node->start, sgt, etnaviv_obj->base.size,
|
||||
ETNAVIV_PROT_READ | ETNAVIV_PROT_WRITE);
|
||||
|
@ -381,7 +357,6 @@ int etnaviv_iommu_get_suballoc_va(struct etnaviv_gpu *gpu, dma_addr_t paddr,
|
|||
mutex_unlock(&mmu->lock);
|
||||
return ret;
|
||||
}
|
||||
mmu->last_iova = vram_node->start + size;
|
||||
gpu->mmu->need_flush = true;
|
||||
mutex_unlock(&mmu->lock);
|
||||
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2015 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
* Copyright (C) 2015-2018 Etnaviv Project
|
||||
*/
|
||||
|
||||
#ifndef __ETNAVIV_MMU_H__
|
||||
|
@ -59,7 +48,6 @@ struct etnaviv_iommu {
|
|||
struct mutex lock;
|
||||
struct list_head mappings;
|
||||
struct drm_mm mm;
|
||||
u32 last_iova;
|
||||
bool need_flush;
|
||||
};
|
||||
|
||||
|
|
|
@ -1,18 +1,7 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2017 Etnaviv Project
|
||||
* Copyright (C) 2017 Zodiac Inflight Innovations
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include "etnaviv_gpu.h"
|
||||
|
|
|
@ -1,18 +1,7 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2017 Etnaviv Project
|
||||
* Copyright (C) 2017 Zodiac Inflight Innovations
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __ETNAVIV_PERFMON_H__
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
// SPDX-License-Identifier: GPL-2.0
|
||||
/*
|
||||
* Copyright (C) 2017 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#include <linux/kthread.h>
|
||||
|
|
|
@ -1,17 +1,6 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0 */
|
||||
/*
|
||||
* Copyright (C) 2017 Etnaviv Project
|
||||
*
|
||||
* This program is free software; you can redistribute it and/or modify it
|
||||
* under the terms of the GNU General Public License version 2 as published by
|
||||
* the Free Software Foundation.
|
||||
*
|
||||
* This program is distributed in the hope that it will be useful, but WITHOUT
|
||||
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
|
||||
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for
|
||||
* more details.
|
||||
*
|
||||
* You should have received a copy of the GNU General Public License along with
|
||||
* this program. If not, see <http://www.gnu.org/licenses/>.
|
||||
*/
|
||||
|
||||
#ifndef __ETNAVIV_SCHED_H__
|
||||
|
|
Loading…
Reference in New Issue