1fa225cbcSrjs/**************************************************************************
2fa225cbcSrjs
3fa225cbcSrjsCopyright 1998-1999 Precision Insight, Inc., Cedar Park, Texas.
4fa225cbcSrjsAll Rights Reserved.
5fa225cbcSrjs
6fa225cbcSrjsPermission is hereby granted, free of charge, to any person obtaining a
7fa225cbcSrjscopy of this software and associated documentation files (the
8fa225cbcSrjs"Software"), to deal in the Software without restriction, including
9fa225cbcSrjswithout limitation the rights to use, copy, modify, merge, publish,
10fa225cbcSrjsdistribute, sub license, and/or sell copies of the Software, and to
11fa225cbcSrjspermit persons to whom the Software is furnished to do so, subject to
12fa225cbcSrjsthe following conditions:
13fa225cbcSrjs
14fa225cbcSrjsThe above copyright notice and this permission notice (including the
15fa225cbcSrjsnext paragraph) shall be included in all copies or substantial portions
16fa225cbcSrjsof the Software.
17fa225cbcSrjs
18fa225cbcSrjsTHE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
19fa225cbcSrjsOR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
20fa225cbcSrjsMERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT.
21fa225cbcSrjsIN NO EVENT SHALL PRECISION INSIGHT AND/OR ITS SUPPLIERS BE LIABLE FOR
22fa225cbcSrjsANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
23fa225cbcSrjsTORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
24fa225cbcSrjsSOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
25fa225cbcSrjs
26fa225cbcSrjs**************************************************************************/
27fa225cbcSrjs
28fa225cbcSrjs/*
29fa225cbcSrjs * Authors:
30fa225cbcSrjs *   Keith Whitwell <keith@tungstengraphics.com>
31fa225cbcSrjs */
32fa225cbcSrjs
33fa225cbcSrjs#ifdef HAVE_CONFIG_H
34fa225cbcSrjs#include "config.h"
35fa225cbcSrjs#endif
36fa225cbcSrjs
37fa225cbcSrjs#include "xf86.h"
38fa225cbcSrjs#include "i810.h"
39fa225cbcSrjs
40fa225cbcSrjsstruct wm_info {
41fa225cbcSrjs   double freq;
42fa225cbcSrjs   unsigned int wm;
43fa225cbcSrjs};
44fa225cbcSrjs
45fa225cbcSrjsstatic struct wm_info i810_wm_8_100[] = {
46fa225cbcSrjs   {0, 0x22003000},
47fa225cbcSrjs   {25.2, 0x22003000},
48fa225cbcSrjs   {28.0, 0x22003000},
49fa225cbcSrjs   {31.5, 0x22003000},
50fa225cbcSrjs   {36.0, 0x22007000},
51fa225cbcSrjs   {40.0, 0x22007000},
52fa225cbcSrjs   {45.0, 0x22007000},
53fa225cbcSrjs   {49.5, 0x22008000},
54fa225cbcSrjs   {50.0, 0x22008000},
55fa225cbcSrjs   {56.3, 0x22008000},
56fa225cbcSrjs   {65.0, 0x22008000},
57fa225cbcSrjs   {75.0, 0x22008000},
58fa225cbcSrjs   {78.8, 0x22008000},
59fa225cbcSrjs   {80.0, 0x22008000},
60fa225cbcSrjs   {94.0, 0x22008000},
61fa225cbcSrjs   {96.0, 0x22107000},
62fa225cbcSrjs   {99.0, 0x22107000},
63fa225cbcSrjs   {108.0, 0x22107000},
64fa225cbcSrjs   {121.0, 0x22107000},
65fa225cbcSrjs   {128.9, 0x22107000},
66fa225cbcSrjs   {132.0, 0x22109000},
67fa225cbcSrjs   {135.0, 0x22109000},
68fa225cbcSrjs   {157.5, 0x2210b000},
69fa225cbcSrjs   {162.0, 0x2210b000},
70fa225cbcSrjs   {175.5, 0x2210b000},
71fa225cbcSrjs   {189.0, 0x2220e000},
72fa225cbcSrjs   {202.5, 0x2220e000}
73fa225cbcSrjs};
74fa225cbcSrjs
75fa225cbcSrjsstatic struct wm_info i810_wm_16_100[] = {
76fa225cbcSrjs   {0, 0x22004000},
77fa225cbcSrjs   {25.2, 0x22006000},
78fa225cbcSrjs   {28.0, 0x22006000},
79fa225cbcSrjs   {31.5, 0x22007000},
80fa225cbcSrjs   {36.0, 0x22007000},
81fa225cbcSrjs   {40.0, 0x22007000},
82fa225cbcSrjs   {45.0, 0x22007000},
83fa225cbcSrjs   {49.5, 0x22009000},
84fa225cbcSrjs   {50.0, 0x22009000},
85fa225cbcSrjs   {56.3, 0x22108000},
86fa225cbcSrjs   {65.0, 0x2210e000},
87fa225cbcSrjs   {75.0, 0x2210e000},
88fa225cbcSrjs   {78.8, 0x2210e000},
89fa225cbcSrjs   {80.0, 0x22210000},
90fa225cbcSrjs   {94.5, 0x22210000},
91fa225cbcSrjs   {96.0, 0x22210000},
92fa225cbcSrjs   {99.0, 0x22210000},
93fa225cbcSrjs   {108.0, 0x22210000},
94fa225cbcSrjs   {121.0, 0x22210000},
95fa225cbcSrjs   {128.9, 0x22210000},
96fa225cbcSrjs   {132.0, 0x22314000},
97fa225cbcSrjs   {135.0, 0x22314000},
98fa225cbcSrjs   {157.5, 0x22415000},
99fa225cbcSrjs   {162.0, 0x22416000},
100fa225cbcSrjs   {175.5, 0x22416000},
101fa225cbcSrjs   {189.0, 0x22416000},
102fa225cbcSrjs   {195.0, 0x22416000},
103fa225cbcSrjs   {202.5, 0x22416000}
104fa225cbcSrjs};
105fa225cbcSrjs
106fa225cbcSrjsstatic struct wm_info i810_wm_24_100[] = {
107fa225cbcSrjs   {0, 0x22006000},
108fa225cbcSrjs   {25.2, 0x22009000},
109fa225cbcSrjs   {28.0, 0x22009000},
110fa225cbcSrjs   {31.5, 0x2200a000},
111fa225cbcSrjs   {36.0, 0x2210c000},
112fa225cbcSrjs   {40.0, 0x2210c000},
113fa225cbcSrjs   {45.0, 0x2210c000},
114fa225cbcSrjs   {49.5, 0x22111000},
115fa225cbcSrjs   {50.0, 0x22111000},
116fa225cbcSrjs   {56.3, 0x22111000},
117fa225cbcSrjs   {65.0, 0x22214000},
118fa225cbcSrjs   {75.0, 0x22214000},
119fa225cbcSrjs   {78.8, 0x22215000},
120fa225cbcSrjs   {80.0, 0x22216000},
121fa225cbcSrjs   {94.5, 0x22218000},
122fa225cbcSrjs   {96.0, 0x22418000},
123fa225cbcSrjs   {99.0, 0x22418000},
124fa225cbcSrjs   {108.0, 0x22418000},
125fa225cbcSrjs   {121.0, 0x22418000},
126fa225cbcSrjs   {128.9, 0x22419000},
127fa225cbcSrjs   {132.0, 0x22519000},
128fa225cbcSrjs   {135.0, 0x4441d000},
129fa225cbcSrjs   {157.5, 0x44419000},
130fa225cbcSrjs   {162.0, 0x44419000},
131fa225cbcSrjs   {175.5, 0x44419000},
132fa225cbcSrjs   {189.0, 0x44419000},
133fa225cbcSrjs   {195.0, 0x44419000},
134fa225cbcSrjs   {202.5, 0x44419000}
135fa225cbcSrjs};
136fa225cbcSrjs
137fa225cbcSrjs#if 0
138fa225cbcSrjs/* not used */
139fa225cbcSrjsstatic struct wm_info i810_wm_32_100[] = {
140fa225cbcSrjs   {0, 0x2210b000},
141fa225cbcSrjs   {60, 0x22415000},			/* 0x314000 works too */
142fa225cbcSrjs   {80, 0x22419000}			/* 0x518000 works too */
143fa225cbcSrjs};
144fa225cbcSrjs#endif
145fa225cbcSrjs
146fa225cbcSrjsstatic struct wm_info i810_wm_8_133[] = {
147fa225cbcSrjs   {0, 0x22003000},
148fa225cbcSrjs   {25.2, 0x22003000},
149fa225cbcSrjs   {28.0, 0x22003000},
150fa225cbcSrjs   {31.5, 0x22003000},
151fa225cbcSrjs   {36.0, 0x22007000},
152fa225cbcSrjs   {40.0, 0x22007000},
153fa225cbcSrjs   {45.0, 0x22007000},
154fa225cbcSrjs   {49.5, 0x22008000},
155fa225cbcSrjs   {50.0, 0x22008000},
156fa225cbcSrjs   {56.3, 0x22008000},
157fa225cbcSrjs   {65.0, 0x22008000},
158fa225cbcSrjs   {75.0, 0x22008000},
159fa225cbcSrjs   {78.8, 0x22008000},
160fa225cbcSrjs   {80.0, 0x22008000},
161fa225cbcSrjs   {94.0, 0x22008000},
162fa225cbcSrjs   {96.0, 0x22107000},
163fa225cbcSrjs   {99.0, 0x22107000},
164fa225cbcSrjs   {108.0, 0x22107000},
165fa225cbcSrjs   {121.0, 0x22107000},
166fa225cbcSrjs   {128.9, 0x22107000},
167fa225cbcSrjs   {132.0, 0x22109000},
168fa225cbcSrjs   {135.0, 0x22109000},
169fa225cbcSrjs   {157.5, 0x2210b000},
170fa225cbcSrjs   {162.0, 0x2210b000},
171fa225cbcSrjs   {175.5, 0x2210b000},
172fa225cbcSrjs   {189.0, 0x2220e000},
173fa225cbcSrjs   {202.5, 0x2220e000}
174fa225cbcSrjs};
175fa225cbcSrjs
176fa225cbcSrjsstatic struct wm_info i810_wm_16_133[] = {
177fa225cbcSrjs   {0, 0x22004000},
178fa225cbcSrjs   {25.2, 0x22006000},
179fa225cbcSrjs   {28.0, 0x22006000},
180fa225cbcSrjs   {31.5, 0x22007000},
181fa225cbcSrjs   {36.0, 0x22007000},
182fa225cbcSrjs   {40.0, 0x22007000},
183fa225cbcSrjs   {45.0, 0x22007000},
184fa225cbcSrjs   {49.5, 0x22009000},
185fa225cbcSrjs   {50.0, 0x22009000},
186fa225cbcSrjs   {56.3, 0x22108000},
187fa225cbcSrjs   {65.0, 0x2210e000},
188fa225cbcSrjs   {75.0, 0x2210e000},
189fa225cbcSrjs   {78.8, 0x2210e000},
190fa225cbcSrjs   {80.0, 0x22210000},
191fa225cbcSrjs   {94.5, 0x22210000},
192fa225cbcSrjs   {96.0, 0x22210000},
193fa225cbcSrjs   {99.0, 0x22210000},
194fa225cbcSrjs   {108.0, 0x22210000},
195fa225cbcSrjs   {121.0, 0x22210000},
196fa225cbcSrjs   {128.9, 0x22210000},
197fa225cbcSrjs   {132.0, 0x22314000},
198fa225cbcSrjs   {135.0, 0x22314000},
199fa225cbcSrjs   {157.5, 0x22415000},
200fa225cbcSrjs   {162.0, 0x22416000},
201fa225cbcSrjs   {175.5, 0x22416000},
202fa225cbcSrjs   {189.0, 0x22416000},
203fa225cbcSrjs   {195.0, 0x22416000},
204fa225cbcSrjs   {202.5, 0x22416000}
205fa225cbcSrjs};
206fa225cbcSrjs
207fa225cbcSrjsstatic struct wm_info i810_wm_24_133[] = {
208fa225cbcSrjs   {0, 0x22006000},
209fa225cbcSrjs   {25.2, 0x22009000},
210fa225cbcSrjs   {28.0, 0x22009000},
211fa225cbcSrjs   {31.5, 0x2200a000},
212fa225cbcSrjs   {36.0, 0x2210c000},
213fa225cbcSrjs   {40.0, 0x2210c000},
214fa225cbcSrjs   {45.0, 0x2210c000},
215fa225cbcSrjs   {49.5, 0x22111000},
216fa225cbcSrjs   {50.0, 0x22111000},
217fa225cbcSrjs   {56.3, 0x22111000},
218fa225cbcSrjs   {65.0, 0x22214000},
219fa225cbcSrjs   {75.0, 0x22214000},
220fa225cbcSrjs   {78.8, 0x22215000},
221fa225cbcSrjs   {80.0, 0x22216000},
222fa225cbcSrjs   {94.5, 0x22218000},
223fa225cbcSrjs   {96.0, 0x22418000},
224fa225cbcSrjs   {99.0, 0x22418000},
225fa225cbcSrjs   {108.0, 0x22418000},
226fa225cbcSrjs   {121.0, 0x22418000},
227fa225cbcSrjs   {128.9, 0x22419000},
228fa225cbcSrjs   {132.0, 0x22519000},
229fa225cbcSrjs   {135.0, 0x4441d000},
230fa225cbcSrjs   {157.5, 0x44419000},
231fa225cbcSrjs   {162.0, 0x44419000},
232fa225cbcSrjs   {175.5, 0x44419000},
233fa225cbcSrjs   {189.0, 0x44419000},
234fa225cbcSrjs   {195.0, 0x44419000},
235fa225cbcSrjs   {202.5, 0x44419000}
236fa225cbcSrjs};
237fa225cbcSrjs
238fa225cbcSrjs#define Elements(x) (sizeof(x)/sizeof(*x))
239fa225cbcSrjs
240fa225cbcSrjs/*
241fa225cbcSrjs * I810CalcFIFO --
242fa225cbcSrjs *
243fa225cbcSrjs * Calculate burst length and FIFO watermark.
244fa225cbcSrjs */
245fa225cbcSrjs
246fa225cbcSrjsunsigned int
247fa225cbcSrjsI810CalcWatermark(ScrnInfoPtr pScrn, double freq, Bool dcache)
248fa225cbcSrjs{
249fa225cbcSrjs   I810Ptr pI810 = I810PTR(pScrn);
250fa225cbcSrjs   struct wm_info *tab;
251fa225cbcSrjs   int nr;
252fa225cbcSrjs   int i;
253fa225cbcSrjs
254fa225cbcSrjs   if (pI810->LmFreqSel == 100) {
255fa225cbcSrjs      switch (pScrn->bitsPerPixel) {
256fa225cbcSrjs      case 8:
257fa225cbcSrjs	 tab = i810_wm_8_100;
258fa225cbcSrjs	 nr = Elements(i810_wm_8_100);
259fa225cbcSrjs	 break;
260fa225cbcSrjs      case 16:
261fa225cbcSrjs	 tab = i810_wm_16_100;
262fa225cbcSrjs	 nr = Elements(i810_wm_16_100);
263fa225cbcSrjs	 break;
264fa225cbcSrjs      case 24:
265fa225cbcSrjs	 tab = i810_wm_24_100;
266fa225cbcSrjs	 nr = Elements(i810_wm_24_100);
267fa225cbcSrjs	 break;
268fa225cbcSrjs      default:
269fa225cbcSrjs	 return 0;
270fa225cbcSrjs      }
271fa225cbcSrjs   } else {
272fa225cbcSrjs      switch (pScrn->bitsPerPixel) {
273fa225cbcSrjs      case 8:
274fa225cbcSrjs	 tab = i810_wm_8_133;
275fa225cbcSrjs	 nr = Elements(i810_wm_8_133);
276fa225cbcSrjs	 break;
277fa225cbcSrjs      case 16:
278fa225cbcSrjs	 tab = i810_wm_16_133;
279fa225cbcSrjs	 nr = Elements(i810_wm_16_133);
280fa225cbcSrjs	 break;
281fa225cbcSrjs      case 24:
282fa225cbcSrjs	 tab = i810_wm_24_133;
283fa225cbcSrjs	 nr = Elements(i810_wm_24_133);
284fa225cbcSrjs	 break;
285fa225cbcSrjs      default:
286fa225cbcSrjs	 return 0;
287fa225cbcSrjs      }
288fa225cbcSrjs   }
289fa225cbcSrjs
290fa225cbcSrjs   for (i = 0; i < nr && tab[i].freq < freq; i++) ;
291fa225cbcSrjs
292fa225cbcSrjs   if (i == nr)
293fa225cbcSrjs      i--;
294fa225cbcSrjs
295fa225cbcSrjs   xf86DrvMsgVerb(pScrn->scrnIndex, X_INFO, 3,
296fa225cbcSrjs		  "chose watermark 0x%x: (tab.freq %.1f)\n",
297fa225cbcSrjs		  tab[i].wm, tab[i].freq);
298fa225cbcSrjs
299fa225cbcSrjs   /* None of these values (sourced from intel) have watermarks for
300fa225cbcSrjs    * the dcache memory.  Fake it for now by using the same watermark
301fa225cbcSrjs    * for both...
302fa225cbcSrjs    *
303fa225cbcSrjs    * Update: this is probably because dcache isn't real useful as
304fa225cbcSrjs    * framebuffer memory, so intel's drivers don't need watermarks
305fa225cbcSrjs    * for that memory because they never use it to feed the ramdacs.
306fa225cbcSrjs    * We do use it in the fallback mode, so keep the watermarks for
307fa225cbcSrjs    * now.
308fa225cbcSrjs    */
309fa225cbcSrjs   if (dcache)
310fa225cbcSrjs      return (tab[i].wm & ~0xffffff) | ((tab[i].wm >> 12) & 0xfff);
311fa225cbcSrjs   else
312fa225cbcSrjs      return tab[i].wm;
313fa225cbcSrjs}
314