Commit 268af50f authored by Robin Murphy's avatar Robin Murphy Committed by Neil Armstrong

drm/panfrost: Support cache-coherent integrations

When the GPU's ACE-Lite interface is fully wired up and capable of
snooping CPU caches, it may be described as "dma-coherent" in
devicetree, which will already inform the DMA layer not to perform
unnecessary cache maintenance. However, we still need to ensure that
the GPU uses the appropriate cacheable outer-shareable attributes in
order to generate the requisite snoop signals, and that CPU mappings
don't create a mismatch by using a non-cacheable type either.
Signed-off-by: default avatarRobin Murphy <robin.murphy@arm.com>
Tested-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
Reviewed-by: default avatarSteven Price <steven.price@arm.com>
Signed-off-by: default avatarNeil Armstrong <narmstrong@baylibre.com>
Link: https://patchwork.freedesktop.org/patch/msgid/7024ce18c1cb1a226e918037d49175571db0b436.1600780574.git.robin.murphy@arm.com
parent 728da60d
...@@ -88,6 +88,7 @@ struct panfrost_device { ...@@ -88,6 +88,7 @@ struct panfrost_device {
/* pm_domains for devices with more than one. */ /* pm_domains for devices with more than one. */
struct device *pm_domain_devs[MAX_PM_DOMAINS]; struct device *pm_domain_devs[MAX_PM_DOMAINS];
struct device_link *pm_domain_links[MAX_PM_DOMAINS]; struct device_link *pm_domain_links[MAX_PM_DOMAINS];
bool coherent;
struct panfrost_features features; struct panfrost_features features;
const struct panfrost_compatible *comp; const struct panfrost_compatible *comp;
......
...@@ -587,6 +587,8 @@ static int panfrost_probe(struct platform_device *pdev) ...@@ -587,6 +587,8 @@ static int panfrost_probe(struct platform_device *pdev)
if (!pfdev->comp) if (!pfdev->comp)
return -ENODEV; return -ENODEV;
pfdev->coherent = device_get_dma_attr(&pdev->dev) == DEV_DMA_COHERENT;
/* Allocate and initialze the DRM device. */ /* Allocate and initialze the DRM device. */
ddev = drm_dev_alloc(&panfrost_drm_driver, &pdev->dev); ddev = drm_dev_alloc(&panfrost_drm_driver, &pdev->dev);
if (IS_ERR(ddev)) if (IS_ERR(ddev))
......
...@@ -220,6 +220,7 @@ static const struct drm_gem_object_funcs panfrost_gem_funcs = { ...@@ -220,6 +220,7 @@ static const struct drm_gem_object_funcs panfrost_gem_funcs = {
*/ */
struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t size) struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t size)
{ {
struct panfrost_device *pfdev = dev->dev_private;
struct panfrost_gem_object *obj; struct panfrost_gem_object *obj;
obj = kzalloc(sizeof(*obj), GFP_KERNEL); obj = kzalloc(sizeof(*obj), GFP_KERNEL);
...@@ -229,6 +230,7 @@ struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t ...@@ -229,6 +230,7 @@ struct drm_gem_object *panfrost_gem_create_object(struct drm_device *dev, size_t
INIT_LIST_HEAD(&obj->mappings.list); INIT_LIST_HEAD(&obj->mappings.list);
mutex_init(&obj->mappings.lock); mutex_init(&obj->mappings.lock);
obj->base.base.funcs = &panfrost_gem_funcs; obj->base.base.funcs = &panfrost_gem_funcs;
obj->base.map_cached = pfdev->coherent;
return &obj->base.base; return &obj->base.base;
} }
......
...@@ -371,6 +371,7 @@ int panfrost_mmu_pgtable_alloc(struct panfrost_file_priv *priv) ...@@ -371,6 +371,7 @@ int panfrost_mmu_pgtable_alloc(struct panfrost_file_priv *priv)
.pgsize_bitmap = SZ_4K | SZ_2M, .pgsize_bitmap = SZ_4K | SZ_2M,
.ias = FIELD_GET(0xff, pfdev->features.mmu_features), .ias = FIELD_GET(0xff, pfdev->features.mmu_features),
.oas = FIELD_GET(0xff00, pfdev->features.mmu_features), .oas = FIELD_GET(0xff00, pfdev->features.mmu_features),
.coherent_walk = pfdev->coherent,
.tlb = &mmu_tlb_ops, .tlb = &mmu_tlb_ops,
.iommu_dev = pfdev->dev, .iommu_dev = pfdev->dev,
}; };
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment