]> git.lizzy.rs Git - plan9front.git/blob - sys/src/9/pc/vgaigfx.c
igfx: reverting previous change, pci id is for the second graphics controller pci...
[plan9front.git] / sys / src / 9 / pc / vgaigfx.c
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 void
16 igfxenable(VGAscr* scr)
17 {
18         Pcidev *p;
19         
20         if(scr->mmio != nil)
21                 return;
22         p = scr->pci;
23         if(p == nil)
24                 return;
25         scr->mmio = vmap(p->mem[0].bar&~0x0F, p->mem[0].size);
26         if(scr->mmio == nil)
27                 return;
28         addvgaseg("igfxmmio", p->mem[0].bar&~0x0F, p->mem[0].size);
29         if(scr->paddr == 0)
30                 vgalinearpci(scr);
31         if(scr->apsize){
32                 addvgaseg("igfxscreen", scr->paddr, scr->apsize);
33                 scr->storage = (scr->apsize - 64*64*4) & ~(BY2PG-1);
34                 if(scr->storage > 0x1000000)
35                         scr->storage = 0x1000000;
36         }
37 }
38
39 VGAdev vgaigfxdev = {
40         "igfx",
41         igfxenable,
42 };
43
44 static void
45 igfxcurload(VGAscr* scr, Cursor* curs)
46 {
47         uchar set, clr;
48         u32int *p;
49         int i, j;
50
51         p = (u32int*)((uchar*)scr->vaddr + scr->storage);
52         memset(p, 0, 64*64*4);
53         for(i=0;i<32;i++) {
54                 set = curs->set[i];
55                 clr = curs->clr[i];
56                 for(j=0x80; j; j>>=1){
57                         if((set|clr)&j)
58                                 *p++ = (0xFF<<24) | (set&j ? 0x000000 : 0xFFFFFF);
59                         else
60                                 *p++ = 0;
61                 }
62                 if(i & 1)
63                         p += 64-16;
64         }
65         scr->offset = curs->offset;
66 }
67
68 enum {
69         CURCTL = 0,
70         CURBASE,
71         CURPOS,
72
73         NPIPE = 3,
74 };
75
76 static u32int*
77 igfxcurregs(VGAscr* scr, int pipe)
78 {
79         u32int o;
80
81         if(scr->mmio == nil || scr->storage == 0)
82                 return nil;
83         o = pipe*0x1000;
84         /* check PIPExCONF if enabled */
85         if((scr->mmio[(0x70008 | o)/4] & (1<<31)) == 0)
86                 return nil;
87         if(scr->pci->did == 0x2a42){    /* G45 */
88                 if(pipe > 1)
89                         return nil;
90                 o = pipe*0x40;
91         }
92         return (u32int*)((uchar*)scr->mmio + (0x70080 + o));
93 }
94
95 static int
96 igfxcurmove(VGAscr* scr, Point p)
97 {
98         int i, x, y;
99         u32int *r;
100
101         for(i=0; i<NPIPE; i++){
102                 if((r = igfxcurregs(scr, i)) != nil){
103                         x = p.x + scr->offset.x;
104                         if(x < 0) x = -x | 0x8000;
105                         y = p.y + scr->offset.y;
106                         if(y < 0) y = -y | 0x8000;
107                         r[CURPOS] = (y << 16) | x;
108                 }
109         }
110         return 0;
111 }
112
113 static void
114 igfxcurenable(VGAscr* scr)
115 {
116         u32int *r;
117         int i;
118
119         igfxenable(scr);
120         igfxcurload(scr, &arrow);
121         igfxcurmove(scr, ZP);
122
123         for(i=0; i<NPIPE; i++){
124                 if((r = igfxcurregs(scr, i)) != nil){
125                         r[CURCTL] = (r[CURCTL] & ~(3<<28 | 1<<5)) | (i<<28) | 7;
126                         r[CURBASE] = scr->storage;
127                 }
128         }
129 }
130
131 static void
132 igfxcurdisable(VGAscr* scr)
133 {
134         u32int *r;
135         int i;
136
137         for(i=0; i<NPIPE; i++){
138                 if((r = igfxcurregs(scr, i)) != nil){
139                         r[CURCTL] &= ~(1<<5 | 7);
140                         r[CURBASE] = 0;
141                 }
142         }
143 }
144
145 VGAcur vgaigfxcur = {
146         "igfxhwgc",
147         igfxcurenable,
148         igfxcurdisable,
149         igfxcurload,
150         igfxcurmove,
151 };