diff options
Diffstat (limited to 'drivers/gpu/drm/drm_cache.c')
| -rw-r--r-- | drivers/gpu/drm/drm_cache.c | 28 | 
1 files changed, 27 insertions, 1 deletions
diff --git a/drivers/gpu/drm/drm_cache.c b/drivers/gpu/drm/drm_cache.c index ec469824621..a575cb2e6bd 100644 --- a/drivers/gpu/drm/drm_cache.c +++ b/drivers/gpu/drm/drm_cache.c @@ -37,12 +37,13 @@ drm_clflush_page(struct page *page)  {  	uint8_t *page_virtual;  	unsigned int i; +	const int size = boot_cpu_data.x86_clflush_size;  	if (unlikely(page == NULL))  		return;  	page_virtual = kmap_atomic(page); -	for (i = 0; i < PAGE_SIZE; i += boot_cpu_data.x86_clflush_size) +	for (i = 0; i < PAGE_SIZE; i += size)  		clflush(page_virtual + i);  	kunmap_atomic(page_virtual);  } @@ -100,6 +101,31 @@ drm_clflush_pages(struct page *pages[], unsigned long num_pages)  EXPORT_SYMBOL(drm_clflush_pages);  void +drm_clflush_sg(struct sg_table *st) +{ +#if defined(CONFIG_X86) +	if (cpu_has_clflush) { +		struct scatterlist *sg; +		int i; + +		mb(); +		for_each_sg(st->sgl, sg, st->nents, i) +			drm_clflush_page(sg_page(sg)); +		mb(); + +		return; +	} + +	if (on_each_cpu(drm_clflush_ipi_handler, NULL, 1) != 0) +		printk(KERN_ERR "Timed out waiting for cache flush.\n"); +#else +	printk(KERN_ERR "Architecture has no drm_cache.c support\n"); +	WARN_ON_ONCE(1); +#endif +} +EXPORT_SYMBOL(drm_clflush_sg); + +void  drm_clflush_virt_range(char *addr, unsigned long length)  {  #if defined(CONFIG_X86)  |