gpu: host1x: Simplify register mapping and add common aperture
authorMikko Perttunen <mperttunen@nvidia.com>
Mon, 27 Jun 2022 14:20:00 +0000 (17:20 +0300)
committerThierry Reding <treding@nvidia.com>
Fri, 8 Jul 2022 14:27:52 +0000 (16:27 +0200)
Refactor 'regs' property loading using devm_platform_ioremap_*
and add loading of the 'common' region found on Tegra234.

Signed-off-by: Mikko Perttunen <mperttunen@nvidia.com>
Signed-off-by: Thierry Reding <treding@nvidia.com>
drivers/gpu/host1x/dev.c
drivers/gpu/host1x/dev.h

index 89cc79a48eab8340b80090a3285b892efd38b6d3..8c6ce8014c09db1f04f7ea4b830b93ff988ce210 100644 (file)
 #include "hw/host1x06.h"
 #include "hw/host1x07.h"
 
+void host1x_common_writel(struct host1x *host1x, u32 v, u32 r)
+{
+       writel(v, host1x->common_regs + r);
+}
+
 void host1x_hypervisor_writel(struct host1x *host1x, u32 v, u32 r)
 {
        writel(v, host1x->hv_regs + r);
@@ -412,7 +417,6 @@ static int host1x_get_resets(struct host1x *host)
 static int host1x_probe(struct platform_device *pdev)
 {
        struct host1x *host;
-       struct resource *regs, *hv_regs = NULL;
        int syncpt_irq;
        int err;
 
@@ -423,25 +427,23 @@ static int host1x_probe(struct platform_device *pdev)
        host->info = of_device_get_match_data(&pdev->dev);
 
        if (host->info->has_hypervisor) {
-               regs = platform_get_resource_byname(pdev, IORESOURCE_MEM, "vm");
-               if (!regs) {
-                       dev_err(&pdev->dev, "failed to get vm registers\n");
-                       return -ENXIO;
-               }
+               host->regs = devm_platform_ioremap_resource_byname(pdev, "vm");
+               if (IS_ERR(host->regs))
+                       return PTR_ERR(host->regs);
+
+               host->hv_regs = devm_platform_ioremap_resource_byname(pdev, "hypervisor");
+               if (IS_ERR(host->hv_regs))
+                       return PTR_ERR(host->hv_regs);
 
-               hv_regs = platform_get_resource_byname(pdev, IORESOURCE_MEM,
-                                                      "hypervisor");
-               if (!hv_regs) {
-                       dev_err(&pdev->dev,
-                               "failed to get hypervisor registers\n");
-                       return -ENXIO;
+               if (host->info->has_common) {
+                       host->common_regs = devm_platform_ioremap_resource_byname(pdev, "common");
+                       if (IS_ERR(host->common_regs))
+                               return PTR_ERR(host->common_regs);
                }
        } else {
-               regs = platform_get_resource(pdev, IORESOURCE_MEM, 0);
-               if (!regs) {
-                       dev_err(&pdev->dev, "failed to get registers\n");
-                       return -ENXIO;
-               }
+               host->regs = devm_platform_ioremap_resource(pdev, 0);
+               if (IS_ERR(host->regs))
+                       return PTR_ERR(host->regs);
        }
 
        syncpt_irq = platform_get_irq(pdev, 0);
@@ -456,16 +458,6 @@ static int host1x_probe(struct platform_device *pdev)
        /* set common host1x device data */
        platform_set_drvdata(pdev, host);
 
-       host->regs = devm_ioremap_resource(&pdev->dev, regs);
-       if (IS_ERR(host->regs))
-               return PTR_ERR(host->regs);
-
-       if (host->info->has_hypervisor) {
-               host->hv_regs = devm_ioremap_resource(&pdev->dev, hv_regs);
-               if (IS_ERR(host->hv_regs))
-                       return PTR_ERR(host->hv_regs);
-       }
-
        host->dev->dma_parms = &host->dma_parms;
        dma_set_max_seg_size(host->dev, UINT_MAX);
 
index 7552a455453475c22f26bb390935d54ac211a213..85edcc6e0fc7aad13136936ab3a18c768f54c502 100644 (file)
@@ -100,6 +100,7 @@ struct host1x_info {
        u64 dma_mask; /* mask of addressable memory */
        bool has_wide_gather; /* supports GATHER_W opcode */
        bool has_hypervisor; /* has hypervisor registers */
+       bool has_common; /* has common registers separate from hypervisor */
        unsigned int num_sid_entries;
        const struct host1x_sid_entry *sid_table;
        /*
@@ -115,6 +116,7 @@ struct host1x {
 
        void __iomem *regs;
        void __iomem *hv_regs; /* hypervisor region */
+       void __iomem *common_regs;
        struct host1x_syncpt *syncpt;
        struct host1x_syncpt_base *bases;
        struct device *dev;
@@ -156,6 +158,7 @@ struct host1x {
        struct host1x_bo_cache cache;
 };
 
+void host1x_common_writel(struct host1x *host1x, u32 v, u32 r);
 void host1x_hypervisor_writel(struct host1x *host1x, u32 r, u32 v);
 u32 host1x_hypervisor_readl(struct host1x *host1x, u32 r);
 void host1x_sync_writel(struct host1x *host1x, u32 r, u32 v);