mmu.c (d0034a7a4ac7fae708146ac0059b9c47a1543f0d) mmu.c (f71635e893c3832790484f2e22b8d5825cc6ce1c)
1// SPDX-License-Identifier: GPL-2.0-only
2/**************************************************************************
3 * Copyright (c) 2007, Intel Corporation.
4 *
5 **************************************************************************/
6
7#include <linux/highmem.h>
8

--- 52 unchanged lines hidden (view full) ---

61 mb();
62 psb_clflush(addr);
63 mb();
64}
65
66static void psb_mmu_flush_pd_locked(struct psb_mmu_driver *driver, int force)
67{
68 struct drm_device *dev = driver->dev;
1// SPDX-License-Identifier: GPL-2.0-only
2/**************************************************************************
3 * Copyright (c) 2007, Intel Corporation.
4 *
5 **************************************************************************/
6
7#include <linux/highmem.h>
8

--- 52 unchanged lines hidden (view full) ---

61 mb();
62 psb_clflush(addr);
63 mb();
64}
65
66static void psb_mmu_flush_pd_locked(struct psb_mmu_driver *driver, int force)
67{
68 struct drm_device *dev = driver->dev;
69 struct drm_psb_private *dev_priv = dev->dev_private;
69 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
70
71 if (atomic_read(&driver->needs_tlbflush) || force) {
72 uint32_t val = PSB_RSGX32(PSB_CR_BIF_CTRL);
73 PSB_WSGX32(val | _PSB_CB_CTRL_INVALDC, PSB_CR_BIF_CTRL);
74
75 /* Make sure data cache is turned off before enabling it */
76 wmb();
77 PSB_WSGX32(val & ~_PSB_CB_CTRL_INVALDC, PSB_CR_BIF_CTRL);

--- 11 unchanged lines hidden (view full) ---

89 psb_mmu_flush_pd_locked(driver, force);
90 up_write(&driver->sem);
91}
92#endif
93
94void psb_mmu_flush(struct psb_mmu_driver *driver)
95{
96 struct drm_device *dev = driver->dev;
70
71 if (atomic_read(&driver->needs_tlbflush) || force) {
72 uint32_t val = PSB_RSGX32(PSB_CR_BIF_CTRL);
73 PSB_WSGX32(val | _PSB_CB_CTRL_INVALDC, PSB_CR_BIF_CTRL);
74
75 /* Make sure data cache is turned off before enabling it */
76 wmb();
77 PSB_WSGX32(val & ~_PSB_CB_CTRL_INVALDC, PSB_CR_BIF_CTRL);

--- 11 unchanged lines hidden (view full) ---

89 psb_mmu_flush_pd_locked(driver, force);
90 up_write(&driver->sem);
91}
92#endif
93
94void psb_mmu_flush(struct psb_mmu_driver *driver)
95{
96 struct drm_device *dev = driver->dev;
97 struct drm_psb_private *dev_priv = dev->dev_private;
97 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
98 uint32_t val;
99
100 down_write(&driver->sem);
101 val = PSB_RSGX32(PSB_CR_BIF_CTRL);
102 if (atomic_read(&driver->needs_tlbflush))
103 PSB_WSGX32(val | _PSB_CB_CTRL_INVALDC, PSB_CR_BIF_CTRL);
104 else
105 PSB_WSGX32(val | _PSB_CB_CTRL_FLUSH, PSB_CR_BIF_CTRL);

--- 9 unchanged lines hidden (view full) ---

115 if (driver->msvdx_mmu_invaldc)
116 atomic_set(driver->msvdx_mmu_invaldc, 1);
117 up_write(&driver->sem);
118}
119
120void psb_mmu_set_pd_context(struct psb_mmu_pd *pd, int hw_context)
121{
122 struct drm_device *dev = pd->driver->dev;
98 uint32_t val;
99
100 down_write(&driver->sem);
101 val = PSB_RSGX32(PSB_CR_BIF_CTRL);
102 if (atomic_read(&driver->needs_tlbflush))
103 PSB_WSGX32(val | _PSB_CB_CTRL_INVALDC, PSB_CR_BIF_CTRL);
104 else
105 PSB_WSGX32(val | _PSB_CB_CTRL_FLUSH, PSB_CR_BIF_CTRL);

--- 9 unchanged lines hidden (view full) ---

115 if (driver->msvdx_mmu_invaldc)
116 atomic_set(driver->msvdx_mmu_invaldc, 1);
117 up_write(&driver->sem);
118}
119
120void psb_mmu_set_pd_context(struct psb_mmu_pd *pd, int hw_context)
121{
122 struct drm_device *dev = pd->driver->dev;
123 struct drm_psb_private *dev_priv = dev->dev_private;
123 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
124 uint32_t offset = (hw_context == 0) ? PSB_CR_BIF_DIR_LIST_BASE0 :
125 PSB_CR_BIF_DIR_LIST_BASE1 + hw_context * 4;
126
127 down_write(&pd->driver->sem);
128 PSB_WSGX32(page_to_pfn(pd->p) << PAGE_SHIFT, offset);
129 wmb();
130 psb_mmu_flush_pd_locked(pd->driver, 1);
131 pd->hw_context = hw_context;

--- 93 unchanged lines hidden (view full) ---

225 __free_page(pt->p);
226 kfree(pt);
227}
228
229void psb_mmu_free_pagedir(struct psb_mmu_pd *pd)
230{
231 struct psb_mmu_driver *driver = pd->driver;
232 struct drm_device *dev = driver->dev;
124 uint32_t offset = (hw_context == 0) ? PSB_CR_BIF_DIR_LIST_BASE0 :
125 PSB_CR_BIF_DIR_LIST_BASE1 + hw_context * 4;
126
127 down_write(&pd->driver->sem);
128 PSB_WSGX32(page_to_pfn(pd->p) << PAGE_SHIFT, offset);
129 wmb();
130 psb_mmu_flush_pd_locked(pd->driver, 1);
131 pd->hw_context = hw_context;

--- 93 unchanged lines hidden (view full) ---

225 __free_page(pt->p);
226 kfree(pt);
227}
228
229void psb_mmu_free_pagedir(struct psb_mmu_pd *pd)
230{
231 struct psb_mmu_driver *driver = pd->driver;
232 struct drm_device *dev = driver->dev;
233 struct drm_psb_private *dev_priv = dev->dev_private;
233 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
234 struct psb_mmu_pt *pt;
235 int i;
236
237 down_write(&driver->sem);
238 if (pd->hw_context != -1) {
239 PSB_WSGX32(0, PSB_CR_BIF_DIR_LIST_BASE0 + pd->hw_context * 4);
240 psb_mmu_flush_pd_locked(driver, 1);
241 }

--- 162 unchanged lines hidden (view full) ---

404 up_read(&driver->sem);
405
406 return pd;
407}
408
409void psb_mmu_driver_takedown(struct psb_mmu_driver *driver)
410{
411 struct drm_device *dev = driver->dev;
234 struct psb_mmu_pt *pt;
235 int i;
236
237 down_write(&driver->sem);
238 if (pd->hw_context != -1) {
239 PSB_WSGX32(0, PSB_CR_BIF_DIR_LIST_BASE0 + pd->hw_context * 4);
240 psb_mmu_flush_pd_locked(driver, 1);
241 }

--- 162 unchanged lines hidden (view full) ---

404 up_read(&driver->sem);
405
406 return pd;
407}
408
409void psb_mmu_driver_takedown(struct psb_mmu_driver *driver)
410{
411 struct drm_device *dev = driver->dev;
412 struct drm_psb_private *dev_priv = dev->dev_private;
412 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
413
414 PSB_WSGX32(driver->bif_ctrl, PSB_CR_BIF_CTRL);
415 psb_mmu_free_pagedir(driver->default_pd);
416 kfree(driver);
417}
418
419struct psb_mmu_driver *psb_mmu_driver_init(struct drm_device *dev,
420 int trap_pagefaults,
421 int invalid_type,
422 atomic_t *msvdx_mmu_invaldc)
423{
424 struct psb_mmu_driver *driver;
413
414 PSB_WSGX32(driver->bif_ctrl, PSB_CR_BIF_CTRL);
415 psb_mmu_free_pagedir(driver->default_pd);
416 kfree(driver);
417}
418
419struct psb_mmu_driver *psb_mmu_driver_init(struct drm_device *dev,
420 int trap_pagefaults,
421 int invalid_type,
422 atomic_t *msvdx_mmu_invaldc)
423{
424 struct psb_mmu_driver *driver;
425 struct drm_psb_private *dev_priv = dev->dev_private;
425 struct drm_psb_private *dev_priv = to_drm_psb_private(dev);
426
427 driver = kmalloc(sizeof(*driver), GFP_KERNEL);
428
429 if (!driver)
430 return NULL;
431
432 driver->dev = dev;
433 driver->default_pd = psb_mmu_alloc_pd(driver, trap_pagefaults,

--- 339 unchanged lines hidden ---
426
427 driver = kmalloc(sizeof(*driver), GFP_KERNEL);
428
429 if (!driver)
430 return NULL;
431
432 driver->dev = dev;
433 driver->default_pd = psb_mmu_alloc_pd(driver, trap_pagefaults,

--- 339 unchanged lines hidden ---