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 --- |