Loading drivers/gpu/msm/adreno_a5xx_preempt.c +39 −4 Original line number Diff line number Diff line /* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -537,13 +537,42 @@ static int a5xx_preemption_iommu_init(struct adreno_device *adreno_dev) KGSL_MEMFLAGS_GPUREADONLY, KGSL_MEMDESC_PRIVILEGED, "smmu_info"); } static void a5xx_preemption_iommu_close(struct adreno_device *adreno_dev) { struct kgsl_device *device = KGSL_DEVICE(adreno_dev); struct kgsl_iommu *iommu = KGSL_IOMMU_PRIV(device); kgsl_free_global(device, &iommu->smmu_info); } #else static int a5xx_preemption_iommu_init(struct adreno_device *adreno_dev) { return -ENODEV; } static void a5xx_preemption_iommu_close(struct adreno_device *adreno_dev) { } #endif static void a5xx_preemption_close(struct kgsl_device *device) { struct adreno_device *adreno_dev = ADRENO_DEVICE(device); struct adreno_preemption *preempt = &adreno_dev->preempt; struct adreno_ringbuffer *rb; unsigned int i; del_timer(&preempt->timer); kgsl_free_global(device, &preempt->counters); a5xx_preemption_iommu_close(adreno_dev); FOR_EACH_RINGBUFFER(adreno_dev, rb, i) { kgsl_free_global(device, &rb->preemption_desc); } } int a5xx_preemption_init(struct adreno_device *adreno_dev) { struct kgsl_device *device = KGSL_DEVICE(adreno_dev); Loading @@ -568,7 +597,7 @@ int a5xx_preemption_init(struct adreno_device *adreno_dev) A5XX_CP_CTXRECORD_PREEMPTION_COUNTER_SIZE, 0, 0, "preemption_counters"); if (ret) return ret; goto err; addr = preempt->counters.gpuaddr; Loading @@ -576,10 +605,16 @@ int a5xx_preemption_init(struct adreno_device *adreno_dev) FOR_EACH_RINGBUFFER(adreno_dev, rb, i) { ret = a5xx_preemption_ringbuffer_init(adreno_dev, rb, addr); if (ret) return ret; goto err; addr += A5XX_CP_CTXRECORD_PREEMPTION_COUNTER_SIZE; } return a5xx_preemption_iommu_init(adreno_dev); ret = a5xx_preemption_iommu_init(adreno_dev); err: if (ret) a5xx_preemption_close(device); return ret; } Loading
drivers/gpu/msm/adreno_a5xx_preempt.c +39 −4 Original line number Diff line number Diff line /* Copyright (c) 2014-2016, The Linux Foundation. All rights reserved. /* Copyright (c) 2014-2017, The Linux Foundation. All rights reserved. * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License version 2 and Loading Loading @@ -537,13 +537,42 @@ static int a5xx_preemption_iommu_init(struct adreno_device *adreno_dev) KGSL_MEMFLAGS_GPUREADONLY, KGSL_MEMDESC_PRIVILEGED, "smmu_info"); } static void a5xx_preemption_iommu_close(struct adreno_device *adreno_dev) { struct kgsl_device *device = KGSL_DEVICE(adreno_dev); struct kgsl_iommu *iommu = KGSL_IOMMU_PRIV(device); kgsl_free_global(device, &iommu->smmu_info); } #else static int a5xx_preemption_iommu_init(struct adreno_device *adreno_dev) { return -ENODEV; } static void a5xx_preemption_iommu_close(struct adreno_device *adreno_dev) { } #endif static void a5xx_preemption_close(struct kgsl_device *device) { struct adreno_device *adreno_dev = ADRENO_DEVICE(device); struct adreno_preemption *preempt = &adreno_dev->preempt; struct adreno_ringbuffer *rb; unsigned int i; del_timer(&preempt->timer); kgsl_free_global(device, &preempt->counters); a5xx_preemption_iommu_close(adreno_dev); FOR_EACH_RINGBUFFER(adreno_dev, rb, i) { kgsl_free_global(device, &rb->preemption_desc); } } int a5xx_preemption_init(struct adreno_device *adreno_dev) { struct kgsl_device *device = KGSL_DEVICE(adreno_dev); Loading @@ -568,7 +597,7 @@ int a5xx_preemption_init(struct adreno_device *adreno_dev) A5XX_CP_CTXRECORD_PREEMPTION_COUNTER_SIZE, 0, 0, "preemption_counters"); if (ret) return ret; goto err; addr = preempt->counters.gpuaddr; Loading @@ -576,10 +605,16 @@ int a5xx_preemption_init(struct adreno_device *adreno_dev) FOR_EACH_RINGBUFFER(adreno_dev, rb, i) { ret = a5xx_preemption_ringbuffer_init(adreno_dev, rb, addr); if (ret) return ret; goto err; addr += A5XX_CP_CTXRECORD_PREEMPTION_COUNTER_SIZE; } return a5xx_preemption_iommu_init(adreno_dev); ret = a5xx_preemption_iommu_init(adreno_dev); err: if (ret) a5xx_preemption_close(device); return ret; }