| 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"9 #define Image IMAGE10 #include <draw.h>11 #include <memdraw.h>12 #include <cursor.h>13 #include "screen.h"15 static ulong16 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 }58 static uintptr59 gmsize(Pcidev *pci, void *mmio)60 {61 u32int x, i, npg, *gtt;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 }80 static void81 igfxenable(VGAscr* scr)82 {83 Pcidev *p;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 }109 VGAdev vgaigfxdev = {110 "igfx",111 igfxenable,112 };114 static void115 igfxcurload(VGAscr* scr, Cursor* curs)116 {117 uchar set, clr;118 u32int *p;119 int i, j;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 else132 *p++ = 0;133 }134 if(i & 1)135 p += 64-16;136 }137 scr->offset = curs->offset;138 }140 enum {141 CURCTL = 0,142 CURBASE,143 CURPOS,145 NPIPE = 3,146 };148 static u32int*149 igfxcurregs(VGAscr* scr, int pipe)150 {151 u32int o;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 }180 static int181 igfxcurmove(VGAscr* scr, Point p)182 {183 int i, x, y;184 u32int *r;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 }198 static void199 igfxcurenable(VGAscr* scr)200 {201 u32int *r;202 int i;204 igfxenable(scr);205 igfxcurload(scr, &arrow);206 igfxcurmove(scr, ZP);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 }216 static void217 igfxcurdisable(VGAscr* scr)218 {219 u32int *r;220 int i;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 }230 VGAcur vgaigfxcur = {231 "igfxhwgc",232 igfxcurenable,233 igfxcurdisable,234 igfxcurload,235 igfxcurmove,236 };