drm_cache.c revision 1.8
1/*	$OpenBSD: drm_cache.c,v 1.8 2020/06/08 04:47:58 jsg Exp $	*/
2/*
3 * Copyright (c) 2017 Mark Kettenis
4 *
5 * Permission to use, copy, modify, and distribute this software for any
6 * purpose with or without fee is hereby granted, provided that the above
7 * copyright notice and this permission notice appear in all copies.
8 *
9 * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
10 * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
11 * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
12 * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
13 * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
14 * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
15 * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
16 */
17
18#include <sys/types.h>
19#include <sys/param.h>
20#include <uvm/uvm_extern.h>
21
22#include <linux/highmem.h>
23#include <linux/scatterlist.h>
24
25#if defined(__i386__) || defined(__amd64__)
26static void
27drm_clflush_page(struct vm_page *page)
28{
29	void *addr;
30
31	if (page == NULL)
32		return;
33
34	addr = kmap_atomic(page);
35	pmap_flush_cache((vaddr_t)addr, PAGE_SIZE);
36	kunmap_atomic(addr);
37}
38
39void
40drm_clflush_pages(struct vm_page *pages[], unsigned long num_pages)
41{
42	unsigned long i;
43
44	for (i = 0; i < num_pages; i++)
45		drm_clflush_page(*pages++);
46}
47
48void
49drm_clflush_sg(struct sg_table *st)
50{
51	struct sg_page_iter sg_iter;
52
53	for_each_sg_page(st->sgl, &sg_iter, st->nents, 0)
54		drm_clflush_page(sg_page_iter_page(&sg_iter));
55}
56
57void
58drm_clflush_virt_range(void *addr, unsigned long length)
59{
60	pmap_flush_cache((vaddr_t)addr, length);
61}
62#else
63void
64drm_clflush_pages(struct vm_page *pages[], unsigned long num_pages)
65{
66	STUB();
67}
68#endif
69