This source file includes following definitions.
- nvkm_rdport
- nvkm_wrport
- nvkm_rdvgas
- nvkm_wrvgas
- nvkm_rdvgag
- nvkm_wrvgag
- nvkm_rdvgac
- nvkm_wrvgac
- nvkm_rdvgai
- nvkm_wrvgai
- nvkm_lockvgac
- nvkm_rdvgaowner
- nvkm_wrvgaowner
   1 
   2 
   3 
   4 
   5 
   6 
   7 
   8 
   9 
  10 
  11 
  12 
  13 
  14 
  15 
  16 
  17 
  18 
  19 
  20 
  21 
  22 
  23 
  24 #include <subdev/vga.h>
  25 
  26 u8
  27 nvkm_rdport(struct nvkm_device *device, int head, u16 port)
  28 {
  29         if (device->card_type >= NV_50)
  30                 return nvkm_rd08(device, 0x601000 + port);
  31 
  32         if (port == 0x03c0 || port == 0x03c1 || 
  33             port == 0x03c2 || port == 0x03da || 
  34             port == 0x03d4 || port == 0x03d5)   
  35                 return nvkm_rd08(device, 0x601000 + (head * 0x2000) + port);
  36 
  37         if (port == 0x03c2 || port == 0x03cc || 
  38             port == 0x03c4 || port == 0x03c5 || 
  39             port == 0x03ce || port == 0x03cf) { 
  40                 if (device->card_type < NV_40)
  41                         head = 0; 
  42                 return nvkm_rd08(device, 0x0c0000 + (head * 0x2000) + port);
  43         }
  44 
  45         return 0x00;
  46 }
  47 
  48 void
  49 nvkm_wrport(struct nvkm_device *device, int head, u16 port, u8 data)
  50 {
  51         if (device->card_type >= NV_50)
  52                 nvkm_wr08(device, 0x601000 + port, data);
  53         else
  54         if (port == 0x03c0 || port == 0x03c1 || 
  55             port == 0x03c2 || port == 0x03da || 
  56             port == 0x03d4 || port == 0x03d5)   
  57                 nvkm_wr08(device, 0x601000 + (head * 0x2000) + port, data);
  58         else
  59         if (port == 0x03c2 || port == 0x03cc || 
  60             port == 0x03c4 || port == 0x03c5 || 
  61             port == 0x03ce || port == 0x03cf) { 
  62                 if (device->card_type < NV_40)
  63                         head = 0; 
  64                 nvkm_wr08(device, 0x0c0000 + (head * 0x2000) + port, data);
  65         }
  66 }
  67 
  68 u8
  69 nvkm_rdvgas(struct nvkm_device *device, int head, u8 index)
  70 {
  71         nvkm_wrport(device, head, 0x03c4, index);
  72         return nvkm_rdport(device, head, 0x03c5);
  73 }
  74 
  75 void
  76 nvkm_wrvgas(struct nvkm_device *device, int head, u8 index, u8 value)
  77 {
  78         nvkm_wrport(device, head, 0x03c4, index);
  79         nvkm_wrport(device, head, 0x03c5, value);
  80 }
  81 
  82 u8
  83 nvkm_rdvgag(struct nvkm_device *device, int head, u8 index)
  84 {
  85         nvkm_wrport(device, head, 0x03ce, index);
  86         return nvkm_rdport(device, head, 0x03cf);
  87 }
  88 
  89 void
  90 nvkm_wrvgag(struct nvkm_device *device, int head, u8 index, u8 value)
  91 {
  92         nvkm_wrport(device, head, 0x03ce, index);
  93         nvkm_wrport(device, head, 0x03cf, value);
  94 }
  95 
  96 u8
  97 nvkm_rdvgac(struct nvkm_device *device, int head, u8 index)
  98 {
  99         nvkm_wrport(device, head, 0x03d4, index);
 100         return nvkm_rdport(device, head, 0x03d5);
 101 }
 102 
 103 void
 104 nvkm_wrvgac(struct nvkm_device *device, int head, u8 index, u8 value)
 105 {
 106         nvkm_wrport(device, head, 0x03d4, index);
 107         nvkm_wrport(device, head, 0x03d5, value);
 108 }
 109 
 110 u8
 111 nvkm_rdvgai(struct nvkm_device *device, int head, u16 port, u8 index)
 112 {
 113         if (port == 0x03c4) return nvkm_rdvgas(device, head, index);
 114         if (port == 0x03ce) return nvkm_rdvgag(device, head, index);
 115         if (port == 0x03d4) return nvkm_rdvgac(device, head, index);
 116         return 0x00;
 117 }
 118 
 119 void
 120 nvkm_wrvgai(struct nvkm_device *device, int head, u16 port, u8 index, u8 value)
 121 {
 122         if      (port == 0x03c4) nvkm_wrvgas(device, head, index, value);
 123         else if (port == 0x03ce) nvkm_wrvgag(device, head, index, value);
 124         else if (port == 0x03d4) nvkm_wrvgac(device, head, index, value);
 125 }
 126 
 127 bool
 128 nvkm_lockvgac(struct nvkm_device *device, bool lock)
 129 {
 130         bool locked = !nvkm_rdvgac(device, 0, 0x1f);
 131         u8 data = lock ? 0x99 : 0x57;
 132         if (device->card_type < NV_50)
 133                 nvkm_wrvgac(device, 0, 0x1f, data);
 134         else
 135                 nvkm_wrvgac(device, 0, 0x3f, data);
 136         if (device->chipset == 0x11) {
 137                 if (!(nvkm_rd32(device, 0x001084) & 0x10000000))
 138                         nvkm_wrvgac(device, 1, 0x1f, data);
 139         }
 140         return locked;
 141 }
 142 
 143 
 144 
 145 
 146 
 147 
 148 
 149 
 150 
 151 
 152 
 153 
 154 
 155 
 156 
 157 
 158 
 159 
 160 
 161 u8
 162 nvkm_rdvgaowner(struct nvkm_device *device)
 163 {
 164         if (device->card_type < NV_50) {
 165                 if (device->chipset == 0x11) {
 166                         u32 tied = nvkm_rd32(device, 0x001084) & 0x10000000;
 167                         if (tied == 0) {
 168                                 u8 slA = nvkm_rdvgac(device, 0, 0x28) & 0x80;
 169                                 u8 tvA = nvkm_rdvgac(device, 0, 0x33) & 0x01;
 170                                 u8 slB = nvkm_rdvgac(device, 1, 0x28) & 0x80;
 171                                 u8 tvB = nvkm_rdvgac(device, 1, 0x33) & 0x01;
 172                                 if (slA && !tvA) return 0x00;
 173                                 if (slB && !tvB) return 0x03;
 174                                 if (slA) return 0x00;
 175                                 if (slB) return 0x03;
 176                                 return 0x00;
 177                         }
 178                         return 0x04;
 179                 }
 180 
 181                 return nvkm_rdvgac(device, 0, 0x44);
 182         }
 183 
 184         return 0x00;
 185 }
 186 
 187 void
 188 nvkm_wrvgaowner(struct nvkm_device *device, u8 select)
 189 {
 190         if (device->card_type < NV_50) {
 191                 u8 owner = (select == 1) ? 3 : select;
 192                 if (device->chipset == 0x11) {
 193                         
 194                         nvkm_rdvgac(device, 0, 0x1f);
 195                         nvkm_rdvgac(device, 1, 0x1f);
 196                 }
 197 
 198                 nvkm_wrvgac(device, 0, 0x44, owner);
 199 
 200                 if (device->chipset == 0x11) {
 201                         nvkm_wrvgac(device, 0, 0x2e, owner);
 202                         nvkm_wrvgac(device, 0, 0x2e, owner);
 203                 }
 204         }
 205 }