drm/gma500: Move GTT enable and disable code into helpers
authorThomas Zimmermann <tzimmermann@suse.de>
Tue, 8 Mar 2022 19:52:21 +0000 (20:52 +0100)
committerPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Wed, 16 Mar 2022 16:42:24 +0000 (17:42 +0100)
Move the code for enabling and disabling the GTT into helpers and call
the functions in psb_gtt_init(), psb_gtt_fini() and psb_gtt_resume().
Removes code duplication.

Signed-off-by: Thomas Zimmermann <tzimmermann@suse.de>
Acked-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Signed-off-by: Patrik Jakobsson <patrik.r.jakobsson@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220308195222.13471-12-tzimmermann@suse.de
drivers/gpu/drm/gma500/gtt.c

index b03feec..83d9a9f 100644 (file)
@@ -125,17 +125,44 @@ void psb_gtt_remove_pages(struct drm_psb_private *pdev, const struct resource *r
        mutex_unlock(&pdev->gtt_mutex);
 }
 
-void psb_gtt_fini(struct drm_device *dev)
+static int psb_gtt_enable(struct drm_psb_private *dev_priv)
 {
-       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
+       struct drm_device *dev = &dev_priv->dev;
        struct pci_dev *pdev = to_pci_dev(dev->dev);
+       int ret;
 
-       iounmap(dev_priv->gtt_map);
+       ret = pci_read_config_word(pdev, PSB_GMCH_CTRL, &dev_priv->gmch_ctrl);
+       if (ret)
+               return pcibios_err_to_errno(ret);
+       ret = pci_write_config_word(pdev, PSB_GMCH_CTRL, dev_priv->gmch_ctrl | _PSB_GMCH_ENABLED);
+       if (ret)
+               return pcibios_err_to_errno(ret);
+
+       dev_priv->pge_ctl = PSB_RVDC32(PSB_PGETBL_CTL);
+       PSB_WVDC32(dev_priv->pge_ctl | _PSB_PGETBL_ENABLED, PSB_PGETBL_CTL);
+
+       (void)PSB_RVDC32(PSB_PGETBL_CTL);
+
+       return 0;
+}
+
+static void psb_gtt_disable(struct drm_psb_private *dev_priv)
+{
+       struct drm_device *dev = &dev_priv->dev;
+       struct pci_dev *pdev = to_pci_dev(dev->dev);
 
        pci_write_config_word(pdev, PSB_GMCH_CTRL, dev_priv->gmch_ctrl);
        PSB_WVDC32(dev_priv->pge_ctl, PSB_PGETBL_CTL);
+
        (void)PSB_RVDC32(PSB_PGETBL_CTL);
+}
 
+void psb_gtt_fini(struct drm_device *dev)
+{
+       struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
+
+       iounmap(dev_priv->gtt_map);
+       psb_gtt_disable(dev_priv);
        mutex_destroy(&dev_priv->gtt_mutex);
 }
 
@@ -159,22 +186,15 @@ int psb_gtt_init(struct drm_device *dev)
 {
        struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
        struct pci_dev *pdev = to_pci_dev(dev->dev);
+       struct psb_gtt *pg = &dev_priv->gtt;
        unsigned gtt_pages;
-       struct psb_gtt *pg;
-       int ret = 0;
+       int ret;
 
        mutex_init(&dev_priv->gtt_mutex);
 
-       pg = &dev_priv->gtt;
-
-       /* Enable the GTT */
-       pci_read_config_word(pdev, PSB_GMCH_CTRL, &dev_priv->gmch_ctrl);
-       pci_write_config_word(pdev, PSB_GMCH_CTRL,
-                             dev_priv->gmch_ctrl | _PSB_GMCH_ENABLED);
-
-       dev_priv->pge_ctl = PSB_RVDC32(PSB_PGETBL_CTL);
-       PSB_WVDC32(dev_priv->pge_ctl | _PSB_PGETBL_ENABLED, PSB_PGETBL_CTL);
-       (void) PSB_RVDC32(PSB_PGETBL_CTL);
+       ret = psb_gtt_enable(dev_priv);
+       if (ret)
+               goto err_mutex_destroy;
 
        /* The root resource we allocate address space from */
        pg->gtt_phys_start = dev_priv->pge_ctl & PAGE_MASK;
@@ -227,17 +247,16 @@ int psb_gtt_init(struct drm_device *dev)
        if (!dev_priv->gtt_map) {
                dev_err(dev->dev, "Failure to map gtt.\n");
                ret = -ENOMEM;
-               goto err_gtt_disable;
+               goto err_psb_gtt_disable;
        }
 
        psb_gtt_clear(dev_priv);
 
        return 0;
 
-err_gtt_disable:
-       pci_write_config_word(pdev, PSB_GMCH_CTRL, dev_priv->gmch_ctrl);
-       PSB_WVDC32(dev_priv->pge_ctl, PSB_PGETBL_CTL);
-       (void)PSB_RVDC32(PSB_PGETBL_CTL);
+err_psb_gtt_disable:
+       psb_gtt_disable(dev_priv);
+err_mutex_destroy:
        mutex_destroy(&dev_priv->gtt_mutex);
        return ret;
 }
@@ -246,20 +265,14 @@ int psb_gtt_resume(struct drm_device *dev)
 {
        struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
        struct pci_dev *pdev = to_pci_dev(dev->dev);
+       struct psb_gtt *pg = &dev_priv->gtt;
        unsigned int gtt_pages;
-       struct psb_gtt *pg;
        int ret;
 
-       pg = &dev_priv->gtt;
-
        /* Enable the GTT */
-       pci_read_config_word(pdev, PSB_GMCH_CTRL, &dev_priv->gmch_ctrl);
-       pci_write_config_word(pdev, PSB_GMCH_CTRL,
-                             dev_priv->gmch_ctrl | _PSB_GMCH_ENABLED);
-
-       dev_priv->pge_ctl = PSB_RVDC32(PSB_PGETBL_CTL);
-       PSB_WVDC32(dev_priv->pge_ctl | _PSB_PGETBL_ENABLED, PSB_PGETBL_CTL);
-       (void) PSB_RVDC32(PSB_PGETBL_CTL);
+       ret = psb_gtt_enable(dev_priv);
+       if (ret)
+               return ret;
 
        /* The root resource we allocate address space from */
        pg->gtt_phys_start = dev_priv->pge_ctl & PAGE_MASK;
@@ -311,16 +324,14 @@ int psb_gtt_resume(struct drm_device *dev)
        if (gtt_pages != pg->gtt_pages) {
                dev_err(dev->dev, "GTT resume error.\n");
                ret = -EINVAL;
-               goto err_gtt_disable;
+               goto err_psb_gtt_disable;
        }
 
        pg->gtt_pages = gtt_pages;
 
        psb_gtt_clear(dev_priv);
 
-err_gtt_disable:
-       pci_write_config_word(pdev, PSB_GMCH_CTRL, dev_priv->gmch_ctrl);
-       PSB_WVDC32(dev_priv->pge_ctl, PSB_PGETBL_CTL);
-       (void)PSB_RVDC32(PSB_PGETBL_CTL);
+err_psb_gtt_disable:
+       psb_gtt_disable(dev_priv);
        return ret;
 }