1*4882a593Smuzhiyun /**************************************************************************
2*4882a593Smuzhiyun *
3*4882a593Smuzhiyun * Copyright (c) 2018 Advanced Micro Devices, Inc.
4*4882a593Smuzhiyun * All Rights Reserved.
5*4882a593Smuzhiyun *
6*4882a593Smuzhiyun * Permission is hereby granted, free of charge, to any person obtaining a
7*4882a593Smuzhiyun * copy of this software and associated documentation files (the
8*4882a593Smuzhiyun * "Software"), to deal in the Software without restriction, including
9*4882a593Smuzhiyun * without limitation the rights to use, copy, modify, merge, publish,
10*4882a593Smuzhiyun * distribute, sub license, and/or sell copies of the Software, and to
11*4882a593Smuzhiyun * permit persons to whom the Software is furnished to do so, subject to
12*4882a593Smuzhiyun * the following conditions:
13*4882a593Smuzhiyun *
14*4882a593Smuzhiyun * The above copyright notice and this permission notice (including the
15*4882a593Smuzhiyun * next paragraph) shall be included in all copies or substantial portions
16*4882a593Smuzhiyun * of the Software.
17*4882a593Smuzhiyun *
18*4882a593Smuzhiyun * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
19*4882a593Smuzhiyun * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
20*4882a593Smuzhiyun * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL
21*4882a593Smuzhiyun * THE COPYRIGHT HOLDERS, AUTHORS AND/OR ITS SUPPLIERS BE LIABLE FOR ANY CLAIM,
22*4882a593Smuzhiyun * DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR
23*4882a593Smuzhiyun * OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE
24*4882a593Smuzhiyun * USE OR OTHER DEALINGS IN THE SOFTWARE.
25*4882a593Smuzhiyun *
26*4882a593Smuzhiyun **************************************************************************/
27*4882a593Smuzhiyun /*
28*4882a593Smuzhiyun * Authors: Huang Rui <ray.huang@amd.com>
29*4882a593Smuzhiyun */
30*4882a593Smuzhiyun
31*4882a593Smuzhiyun #ifndef TTM_SET_MEMORY
32*4882a593Smuzhiyun #define TTM_SET_MEMORY
33*4882a593Smuzhiyun
34*4882a593Smuzhiyun #include <linux/mm.h>
35*4882a593Smuzhiyun
36*4882a593Smuzhiyun #ifdef CONFIG_X86
37*4882a593Smuzhiyun
38*4882a593Smuzhiyun #include <asm/set_memory.h>
39*4882a593Smuzhiyun
ttm_set_pages_array_wb(struct page ** pages,int addrinarray)40*4882a593Smuzhiyun static inline int ttm_set_pages_array_wb(struct page **pages, int addrinarray)
41*4882a593Smuzhiyun {
42*4882a593Smuzhiyun return set_pages_array_wb(pages, addrinarray);
43*4882a593Smuzhiyun }
44*4882a593Smuzhiyun
ttm_set_pages_array_wc(struct page ** pages,int addrinarray)45*4882a593Smuzhiyun static inline int ttm_set_pages_array_wc(struct page **pages, int addrinarray)
46*4882a593Smuzhiyun {
47*4882a593Smuzhiyun return set_pages_array_wc(pages, addrinarray);
48*4882a593Smuzhiyun }
49*4882a593Smuzhiyun
ttm_set_pages_array_uc(struct page ** pages,int addrinarray)50*4882a593Smuzhiyun static inline int ttm_set_pages_array_uc(struct page **pages, int addrinarray)
51*4882a593Smuzhiyun {
52*4882a593Smuzhiyun return set_pages_array_uc(pages, addrinarray);
53*4882a593Smuzhiyun }
54*4882a593Smuzhiyun
ttm_set_pages_wb(struct page * page,int numpages)55*4882a593Smuzhiyun static inline int ttm_set_pages_wb(struct page *page, int numpages)
56*4882a593Smuzhiyun {
57*4882a593Smuzhiyun return set_pages_wb(page, numpages);
58*4882a593Smuzhiyun }
59*4882a593Smuzhiyun
ttm_set_pages_wc(struct page * page,int numpages)60*4882a593Smuzhiyun static inline int ttm_set_pages_wc(struct page *page, int numpages)
61*4882a593Smuzhiyun {
62*4882a593Smuzhiyun unsigned long addr = (unsigned long)page_address(page);
63*4882a593Smuzhiyun
64*4882a593Smuzhiyun return set_memory_wc(addr, numpages);
65*4882a593Smuzhiyun }
66*4882a593Smuzhiyun
ttm_set_pages_uc(struct page * page,int numpages)67*4882a593Smuzhiyun static inline int ttm_set_pages_uc(struct page *page, int numpages)
68*4882a593Smuzhiyun {
69*4882a593Smuzhiyun return set_pages_uc(page, numpages);
70*4882a593Smuzhiyun }
71*4882a593Smuzhiyun
72*4882a593Smuzhiyun #else /* for CONFIG_X86 */
73*4882a593Smuzhiyun
74*4882a593Smuzhiyun #if IS_ENABLED(CONFIG_AGP)
75*4882a593Smuzhiyun
76*4882a593Smuzhiyun #include <asm/agp.h>
77*4882a593Smuzhiyun
ttm_set_pages_array_wb(struct page ** pages,int addrinarray)78*4882a593Smuzhiyun static inline int ttm_set_pages_array_wb(struct page **pages, int addrinarray)
79*4882a593Smuzhiyun {
80*4882a593Smuzhiyun int i;
81*4882a593Smuzhiyun
82*4882a593Smuzhiyun for (i = 0; i < addrinarray; i++)
83*4882a593Smuzhiyun unmap_page_from_agp(pages[i]);
84*4882a593Smuzhiyun return 0;
85*4882a593Smuzhiyun }
86*4882a593Smuzhiyun
ttm_set_pages_array_wc(struct page ** pages,int addrinarray)87*4882a593Smuzhiyun static inline int ttm_set_pages_array_wc(struct page **pages, int addrinarray)
88*4882a593Smuzhiyun {
89*4882a593Smuzhiyun int i;
90*4882a593Smuzhiyun
91*4882a593Smuzhiyun for (i = 0; i < addrinarray; i++)
92*4882a593Smuzhiyun map_page_into_agp(pages[i]);
93*4882a593Smuzhiyun return 0;
94*4882a593Smuzhiyun }
95*4882a593Smuzhiyun
ttm_set_pages_array_uc(struct page ** pages,int addrinarray)96*4882a593Smuzhiyun static inline int ttm_set_pages_array_uc(struct page **pages, int addrinarray)
97*4882a593Smuzhiyun {
98*4882a593Smuzhiyun int i;
99*4882a593Smuzhiyun
100*4882a593Smuzhiyun for (i = 0; i < addrinarray; i++)
101*4882a593Smuzhiyun map_page_into_agp(pages[i]);
102*4882a593Smuzhiyun return 0;
103*4882a593Smuzhiyun }
104*4882a593Smuzhiyun
ttm_set_pages_wb(struct page * page,int numpages)105*4882a593Smuzhiyun static inline int ttm_set_pages_wb(struct page *page, int numpages)
106*4882a593Smuzhiyun {
107*4882a593Smuzhiyun int i;
108*4882a593Smuzhiyun
109*4882a593Smuzhiyun for (i = 0; i < numpages; i++)
110*4882a593Smuzhiyun unmap_page_from_agp(page++);
111*4882a593Smuzhiyun return 0;
112*4882a593Smuzhiyun }
113*4882a593Smuzhiyun
114*4882a593Smuzhiyun #else /* for CONFIG_AGP */
115*4882a593Smuzhiyun
ttm_set_pages_array_wb(struct page ** pages,int addrinarray)116*4882a593Smuzhiyun static inline int ttm_set_pages_array_wb(struct page **pages, int addrinarray)
117*4882a593Smuzhiyun {
118*4882a593Smuzhiyun return 0;
119*4882a593Smuzhiyun }
120*4882a593Smuzhiyun
ttm_set_pages_array_wc(struct page ** pages,int addrinarray)121*4882a593Smuzhiyun static inline int ttm_set_pages_array_wc(struct page **pages, int addrinarray)
122*4882a593Smuzhiyun {
123*4882a593Smuzhiyun return 0;
124*4882a593Smuzhiyun }
125*4882a593Smuzhiyun
ttm_set_pages_array_uc(struct page ** pages,int addrinarray)126*4882a593Smuzhiyun static inline int ttm_set_pages_array_uc(struct page **pages, int addrinarray)
127*4882a593Smuzhiyun {
128*4882a593Smuzhiyun return 0;
129*4882a593Smuzhiyun }
130*4882a593Smuzhiyun
ttm_set_pages_wb(struct page * page,int numpages)131*4882a593Smuzhiyun static inline int ttm_set_pages_wb(struct page *page, int numpages)
132*4882a593Smuzhiyun {
133*4882a593Smuzhiyun return 0;
134*4882a593Smuzhiyun }
135*4882a593Smuzhiyun
136*4882a593Smuzhiyun #endif /* for CONFIG_AGP */
137*4882a593Smuzhiyun
ttm_set_pages_wc(struct page * page,int numpages)138*4882a593Smuzhiyun static inline int ttm_set_pages_wc(struct page *page, int numpages)
139*4882a593Smuzhiyun {
140*4882a593Smuzhiyun return 0;
141*4882a593Smuzhiyun }
142*4882a593Smuzhiyun
ttm_set_pages_uc(struct page * page,int numpages)143*4882a593Smuzhiyun static inline int ttm_set_pages_uc(struct page *page, int numpages)
144*4882a593Smuzhiyun {
145*4882a593Smuzhiyun return 0;
146*4882a593Smuzhiyun }
147*4882a593Smuzhiyun
148*4882a593Smuzhiyun #endif /* for CONFIG_X86 */
149*4882a593Smuzhiyun
150*4882a593Smuzhiyun #endif
151