Commit 5169f359 authored by Thomas Zimmermann's avatar Thomas Zimmermann Committed by Patrik Jakobsson

drm/gma500: Move GTT enable and disable code into helpers

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: default avatarThomas Zimmermann <tzimmermann@suse.de>
Acked-by: default avatarPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Signed-off-by: default avatarPatrik Jakobsson <patrik.r.jakobsson@gmail.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20220308195222.13471-12-tzimmermann@suse.de
parent d339386c
...@@ -125,17 +125,44 @@ void psb_gtt_remove_pages(struct drm_psb_private *pdev, const struct resource *r ...@@ -125,17 +125,44 @@ void psb_gtt_remove_pages(struct drm_psb_private *pdev, const struct resource *r
mutex_unlock(&pdev->gtt_mutex); 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); 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); pci_write_config_word(pdev, PSB_GMCH_CTRL, dev_priv->gmch_ctrl);
PSB_WVDC32(dev_priv->pge_ctl, PSB_PGETBL_CTL); PSB_WVDC32(dev_priv->pge_ctl, PSB_PGETBL_CTL);
(void)PSB_RVDC32(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); mutex_destroy(&dev_priv->gtt_mutex);
} }
...@@ -159,22 +186,15 @@ int psb_gtt_init(struct drm_device *dev) ...@@ -159,22 +186,15 @@ int psb_gtt_init(struct drm_device *dev)
{ {
struct drm_psb_private *dev_priv = to_drm_psb_private(dev); struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
struct pci_dev *pdev = to_pci_dev(dev->dev); struct pci_dev *pdev = to_pci_dev(dev->dev);
struct psb_gtt *pg = &dev_priv->gtt;
unsigned gtt_pages; unsigned gtt_pages;
struct psb_gtt *pg; int ret;
int ret = 0;
mutex_init(&dev_priv->gtt_mutex); mutex_init(&dev_priv->gtt_mutex);
pg = &dev_priv->gtt; ret = psb_gtt_enable(dev_priv);
if (ret)
/* Enable the GTT */ goto err_mutex_destroy;
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);
/* The root resource we allocate address space from */ /* The root resource we allocate address space from */
pg->gtt_phys_start = dev_priv->pge_ctl & PAGE_MASK; pg->gtt_phys_start = dev_priv->pge_ctl & PAGE_MASK;
...@@ -227,17 +247,16 @@ int psb_gtt_init(struct drm_device *dev) ...@@ -227,17 +247,16 @@ int psb_gtt_init(struct drm_device *dev)
if (!dev_priv->gtt_map) { if (!dev_priv->gtt_map) {
dev_err(dev->dev, "Failure to map gtt.\n"); dev_err(dev->dev, "Failure to map gtt.\n");
ret = -ENOMEM; ret = -ENOMEM;
goto err_gtt_disable; goto err_psb_gtt_disable;
} }
psb_gtt_clear(dev_priv); psb_gtt_clear(dev_priv);
return 0; return 0;
err_gtt_disable: err_psb_gtt_disable:
pci_write_config_word(pdev, PSB_GMCH_CTRL, dev_priv->gmch_ctrl); psb_gtt_disable(dev_priv);
PSB_WVDC32(dev_priv->pge_ctl, PSB_PGETBL_CTL); err_mutex_destroy:
(void)PSB_RVDC32(PSB_PGETBL_CTL);
mutex_destroy(&dev_priv->gtt_mutex); mutex_destroy(&dev_priv->gtt_mutex);
return ret; return ret;
} }
...@@ -246,20 +265,14 @@ int psb_gtt_resume(struct drm_device *dev) ...@@ -246,20 +265,14 @@ int psb_gtt_resume(struct drm_device *dev)
{ {
struct drm_psb_private *dev_priv = to_drm_psb_private(dev); struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
struct pci_dev *pdev = to_pci_dev(dev->dev); struct pci_dev *pdev = to_pci_dev(dev->dev);
struct psb_gtt *pg = &dev_priv->gtt;
unsigned int gtt_pages; unsigned int gtt_pages;
struct psb_gtt *pg;
int ret; int ret;
pg = &dev_priv->gtt;
/* Enable the GTT */ /* Enable the GTT */
pci_read_config_word(pdev, PSB_GMCH_CTRL, &dev_priv->gmch_ctrl); ret = psb_gtt_enable(dev_priv);
pci_write_config_word(pdev, PSB_GMCH_CTRL, if (ret)
dev_priv->gmch_ctrl | _PSB_GMCH_ENABLED); return 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);
/* The root resource we allocate address space from */ /* The root resource we allocate address space from */
pg->gtt_phys_start = dev_priv->pge_ctl & PAGE_MASK; pg->gtt_phys_start = dev_priv->pge_ctl & PAGE_MASK;
...@@ -311,16 +324,14 @@ int psb_gtt_resume(struct drm_device *dev) ...@@ -311,16 +324,14 @@ int psb_gtt_resume(struct drm_device *dev)
if (gtt_pages != pg->gtt_pages) { if (gtt_pages != pg->gtt_pages) {
dev_err(dev->dev, "GTT resume error.\n"); dev_err(dev->dev, "GTT resume error.\n");
ret = -EINVAL; ret = -EINVAL;
goto err_gtt_disable; goto err_psb_gtt_disable;
} }
pg->gtt_pages = gtt_pages; pg->gtt_pages = gtt_pages;
psb_gtt_clear(dev_priv); psb_gtt_clear(dev_priv);
err_gtt_disable: err_psb_gtt_disable:
pci_write_config_word(pdev, PSB_GMCH_CTRL, dev_priv->gmch_ctrl); psb_gtt_disable(dev_priv);
PSB_WVDC32(dev_priv->pge_ctl, PSB_PGETBL_CTL);
(void)PSB_RVDC32(PSB_PGETBL_CTL);
return ret; return ret;
} }
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