changelog shortlog tags branches changeset files revisions annotate raw help

Mercurial > hg > plan9front / sys/src/9/pc/vgaigfx.c

changeset 5650: ddb7d8313239
parent: 6d7a4777c8b8
child: 98c859a30701
author: cinap_lenrek@felloff.net
date: Fri, 06 Jan 2017 02:54:26 +0100
permissions: -rw-r--r--
description: cfs: fix cfsctl interaction with mount cache (mount -C flag)

the root fileserver is mounted with the mount cache enabled
causing the contents of the cfsctl file to be cached as well
leading to wrong results. so after we generated the new stat
buffer, we increment the qid.vers so the cache starts out
clean.
1 #include "u.h"
2 #include "../port/lib.h"
3 #include "mem.h"
4 #include "dat.h"
5 #include "fns.h"
6 #include "io.h"
7 #include "../port/error.h"
8 
9 #define Image IMAGE
10 #include <draw.h>
11 #include <memdraw.h>
12 #include <cursor.h>
13 #include "screen.h"
14 
15 static ulong
16 stolenmb(Pcidev *p)
17 {
18  switch(p->did){
19  case 0x0166: /* Ivy Bridge */
20  case 0x0102: /* Core-5 Sandy Bridge */
21  case 0x0152: /* Core-i3 */
22  switch((pcicfgr16(p, 0x50) >> 3) & 0x1f){
23  case 0x01: return 32 - 2;
24  case 0x02: return 64 - 2; /* 0102 Dell machine here */
25  case 0x03: return 96 - 2;
26  case 0x04: return 128 - 2;
27  case 0x05: return 32 - 2;
28  case 0x06: return 48 - 2;
29  case 0x07: return 64 - 2;
30  case 0x08: return 128 - 2;
31  case 0x09: return 256 - 2;
32  case 0x0A: return 96 - 2;
33  case 0x0B: return 160 - 2;
34  case 0x0C: return 224 - 2;
35  case 0x0D: return 352 - 2;
36  case 0x0E: return 448 - 2;
37  case 0x0F: return 480 - 2;
38  case 0x10: return 512 - 2;
39  }
40  break;
41  case 0x2a42: /* X200 */
42  case 0x29a2: /* 82P965/G965 HECI desktop */
43  case 0x2a02: /* CF-R7 */
44  switch((pcicfgr16(p, 0x52) >> 4) & 7){
45  case 0x01: return 1;
46  case 0x02: return 4;
47  case 0x03: return 8;
48  case 0x04: return 16;
49  case 0x05: return 32;
50  case 0x06: return 48;
51  case 0x07: return 64;
52  }
53  break;
54  }
55  return 0;
56 }
57 
58 static uintptr
59 gmsize(Pcidev *pci, void *mmio)
60 {
61  u32int x, i, npg, *gtt;
62 
63  npg = stolenmb(pci)<<(20-12);
64  if(npg == 0)
65  return 0;
66  gtt = (u32int*)((uchar*)mmio + pci->mem[0].size/2);
67  if((gtt[0]&1) == 0)
68  return 0;
69  x = (gtt[0]>>12)+1;
70  for(i=1; i<npg; i++){
71  if((gtt[i]&1) == 0 || (gtt[i]>>12) != x)
72  break;
73  x++;
74  }
75  if(0) print("igfx: graphics memory at %p-%p (%ud MB)\n",
76  (uintptr)(x-i)<<12, (uintptr)x<<12, (i>>(20-12)));
77  return (uintptr)i<<12;
78 }
79 
80 static void
81 igfxenable(VGAscr* scr)
82 {
83  Pcidev *p;
84 
85  if(scr->mmio != nil)
86  return;
87  p = scr->pci;
88  if(p == nil)
89  return;
90  scr->mmio = vmap(p->mem[0].bar&~0x0F, p->mem[0].size);
91  if(scr->mmio == nil)
92  return;
93  addvgaseg("igfxmmio", p->mem[0].bar&~0x0F, p->mem[0].size);
94  if(scr->paddr == 0)
95  vgalinearpci(scr);
96  if(scr->apsize){
97  addvgaseg("igfxscreen", scr->paddr, scr->apsize);
98  scr->storage = gmsize(p, scr->mmio);
99  if(scr->storage < MB)
100  scr->storage = 0;
101  else if(scr->storage > scr->apsize)
102  scr->storage = scr->apsize;
103  if(scr->storage != 0)
104  scr->storage -= PGROUND(64*64*4);
105  }
106  scr->softscreen = 1;
107 }
108 
109 VGAdev vgaigfxdev = {
110  "igfx",
111  igfxenable,
112 };
113 
114 static void
115 igfxcurload(VGAscr* scr, Cursor* curs)
116 {
117  uchar set, clr;
118  u32int *p;
119  int i, j;
120 
121  if(scr->storage == 0)
122  return;
123  p = (u32int*)((uchar*)scr->vaddr + scr->storage);
124  memset(p, 0, 64*64*4);
125  for(i=0;i<32;i++) {
126  set = curs->set[i];
127  clr = curs->clr[i];
128  for(j=0x80; j; j>>=1){
129  if((set|clr)&j)
130  *p++ = (0xFF<<24) | (set&j ? 0x000000 : 0xFFFFFF);
131  else
132  *p++ = 0;
133  }
134  if(i & 1)
135  p += 64-16;
136  }
137  scr->offset = curs->offset;
138 }
139 
140 enum {
141  CURCTL = 0,
142  CURBASE,
143  CURPOS,
144 
145  NPIPE = 3,
146 };
147 
148 static u32int*
149 igfxcurregs(VGAscr* scr, int pipe)
150 {
151  u32int o;
152 
153  if(scr->mmio == nil || scr->storage == 0)
154  return nil;
155  o = pipe*0x1000;
156  /* check PIPExCONF if enabled */
157  if((scr->mmio[(0x70008 | o)/4] & (1<<31)) == 0)
158  return nil;
159  switch(scr->pci->did){
160  case 0x0166: /* Ivy Bridge */
161  case 0x0152: /* Core-i3 */
162  if(pipe > 2)
163  return nil;
164  break;
165  case 0x2a42: /* X200 */
166  case 0x29a2: /* 82P965/G965 HECI desktop */
167  case 0x2a02: /* CF-R7 */
168  case 0x0102: /* Sndy Bridge */
169  if(pipe > 1)
170  return nil;
171  o = pipe*0x40;
172  break;
173  default:
174  if(pipe > 0)
175  return nil;
176  }
177  return (u32int*)((uchar*)scr->mmio + (0x70080 + o));
178 }
179 
180 static int
181 igfxcurmove(VGAscr* scr, Point p)
182 {
183  int i, x, y;
184  u32int *r;
185 
186  for(i=0; i<NPIPE; i++){
187  if((r = igfxcurregs(scr, i)) != nil){
188  x = p.x + scr->offset.x;
189  if(x < 0) x = -x | 0x8000;
190  y = p.y + scr->offset.y;
191  if(y < 0) y = -y | 0x8000;
192  r[CURPOS] = (y << 16) | x;
193  }
194  }
195  return 0;
196 }
197 
198 static void
199 igfxcurenable(VGAscr* scr)
200 {
201  u32int *r;
202  int i;
203 
204  igfxenable(scr);
205  igfxcurload(scr, &arrow);
206  igfxcurmove(scr, ZP);
207 
208  for(i=0; i<NPIPE; i++){
209  if((r = igfxcurregs(scr, i)) != nil){
210  r[CURCTL] = (r[CURCTL] & ~(3<<28 | 1<<5)) | (i<<28) | 7;
211  r[CURBASE] = scr->storage;
212  }
213  }
214 }
215 
216 static void
217 igfxcurdisable(VGAscr* scr)
218 {
219  u32int *r;
220  int i;
221 
222  for(i=0; i<NPIPE; i++){
223  if((r = igfxcurregs(scr, i)) != nil){
224  r[CURCTL] &= ~(1<<5 | 7);
225  r[CURBASE] = 0;
226  }
227  }
228 }
229 
230 VGAcur vgaigfxcur = {
231  "igfxhwgc",
232  igfxcurenable,
233  igfxcurdisable,
234  igfxcurload,
235  igfxcurmove,
236 };