igma.c revision 1.1.4.2 1 1.1.4.2 rmind /* $NetBSD: igma.c,v 1.1.4.2 2014/05/18 17:45:40 rmind Exp $ */
2 1.1.4.2 rmind
3 1.1.4.2 rmind /*
4 1.1.4.2 rmind * Copyright (c) 2014 Michael van Elst
5 1.1.4.2 rmind *
6 1.1.4.2 rmind * Permission to use, copy, modify, and distribute this software for any
7 1.1.4.2 rmind * purpose with or without fee is hereby granted, provided that the above
8 1.1.4.2 rmind * copyright notice and this permission notice appear in all copies.
9 1.1.4.2 rmind *
10 1.1.4.2 rmind * THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES
11 1.1.4.2 rmind * WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF
12 1.1.4.2 rmind * MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR
13 1.1.4.2 rmind * ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES
14 1.1.4.2 rmind * WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN
15 1.1.4.2 rmind * ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF
16 1.1.4.2 rmind * OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
17 1.1.4.2 rmind */
18 1.1.4.2 rmind
19 1.1.4.2 rmind /*
20 1.1.4.2 rmind * Intel Graphic Media Accelerator
21 1.1.4.2 rmind */
22 1.1.4.2 rmind
23 1.1.4.2 rmind #include <sys/cdefs.h>
24 1.1.4.2 rmind __KERNEL_RCSID(0, "$NetBSD: igma.c,v 1.1.4.2 2014/05/18 17:45:40 rmind Exp $");
25 1.1.4.2 rmind
26 1.1.4.2 rmind #include "vga.h"
27 1.1.4.2 rmind
28 1.1.4.2 rmind #include <sys/param.h>
29 1.1.4.2 rmind #include <sys/systm.h>
30 1.1.4.2 rmind #include <sys/device.h>
31 1.1.4.2 rmind #include <sys/bus.h>
32 1.1.4.2 rmind
33 1.1.4.2 rmind #include <dev/pci/pcireg.h>
34 1.1.4.2 rmind #include <dev/pci/pcivar.h>
35 1.1.4.2 rmind #include <dev/pci/pcidevs.h>
36 1.1.4.2 rmind #include <dev/pci/pciio.h>
37 1.1.4.2 rmind
38 1.1.4.2 rmind #include <dev/i2c/i2cvar.h>
39 1.1.4.2 rmind #include <dev/i2c/i2c_bitbang.h>
40 1.1.4.2 rmind #include <dev/i2c/ddcvar.h>
41 1.1.4.2 rmind
42 1.1.4.2 rmind #include <dev/videomode/videomode.h>
43 1.1.4.2 rmind #include <dev/videomode/edidvar.h>
44 1.1.4.2 rmind
45 1.1.4.2 rmind #include <dev/wscons/wsdisplayvar.h>
46 1.1.4.2 rmind
47 1.1.4.2 rmind #if NVGA > 0
48 1.1.4.2 rmind #include <dev/ic/mc6845reg.h>
49 1.1.4.2 rmind #include <dev/ic/pcdisplayvar.h>
50 1.1.4.2 rmind #include <dev/ic/vgareg.h>
51 1.1.4.2 rmind #include <dev/ic/vgavar.h>
52 1.1.4.2 rmind #endif
53 1.1.4.2 rmind
54 1.1.4.2 rmind #include <dev/pci/igmareg.h>
55 1.1.4.2 rmind #include <dev/pci/igmavar.h>
56 1.1.4.2 rmind
57 1.1.4.2 rmind #include "igmafb.h"
58 1.1.4.2 rmind
59 1.1.4.2 rmind struct igma_softc;
60 1.1.4.2 rmind struct igma_i2c {
61 1.1.4.2 rmind kmutex_t ii_lock;
62 1.1.4.2 rmind struct igma_softc *ii_sc;
63 1.1.4.2 rmind bus_addr_t ii_reg;
64 1.1.4.2 rmind struct i2c_controller ii_i2c;
65 1.1.4.2 rmind const char *ii_name;
66 1.1.4.2 rmind u_int32_t ii_dir;
67 1.1.4.2 rmind };
68 1.1.4.2 rmind
69 1.1.4.2 rmind struct igma_softc {
70 1.1.4.2 rmind device_t sc_dev;
71 1.1.4.2 rmind struct igma_chip sc_chip;
72 1.1.4.2 rmind struct igma_i2c sc_ii[GMBUS_NUM_PORTS];
73 1.1.4.2 rmind };
74 1.1.4.2 rmind
75 1.1.4.2 rmind static int igma_match(device_t, cfdata_t, void *);
76 1.1.4.2 rmind static void igma_attach(device_t, device_t, void *);
77 1.1.4.2 rmind static int igma_print(void *, const char *);
78 1.1.4.2 rmind
79 1.1.4.2 rmind static void igma_i2c_attach(struct igma_softc *);
80 1.1.4.2 rmind
81 1.1.4.2 rmind CFATTACH_DECL_NEW(igma, sizeof(struct igma_softc),
82 1.1.4.2 rmind igma_match, igma_attach, NULL, NULL);
83 1.1.4.2 rmind
84 1.1.4.2 rmind static int igma_i2c_acquire_bus(void *, int);
85 1.1.4.2 rmind static void igma_i2c_release_bus(void *, int);
86 1.1.4.2 rmind static int igma_i2c_send_start(void *, int);
87 1.1.4.2 rmind static int igma_i2c_send_stop(void *, int);
88 1.1.4.2 rmind static int igma_i2c_initiate_xfer(void *, i2c_addr_t, int);
89 1.1.4.2 rmind static int igma_i2c_read_byte(void *, uint8_t *, int);
90 1.1.4.2 rmind static int igma_i2c_write_byte(void *, uint8_t, int);
91 1.1.4.2 rmind static void igma_i2cbb_set_bits(void *, uint32_t);
92 1.1.4.2 rmind static void igma_i2cbb_set_dir(void *, uint32_t);
93 1.1.4.2 rmind static uint32_t igma_i2cbb_read(void *);
94 1.1.4.2 rmind
95 1.1.4.2 rmind static void igma_reg_barrier(const struct igma_chip *, int);
96 1.1.4.2 rmind static u_int32_t igma_reg_read(const struct igma_chip *, int);
97 1.1.4.2 rmind static void igma_reg_write(const struct igma_chip *, int, u_int32_t);
98 1.1.4.2 rmind static u_int8_t igma_vga_read(const struct igma_chip *, int);
99 1.1.4.2 rmind static void igma_vga_write(const struct igma_chip *, int , u_int8_t);
100 1.1.4.2 rmind #if 0
101 1.1.4.2 rmind static u_int8_t igma_crtc_read(const struct igma_chip *, int);
102 1.1.4.2 rmind static void igma_crtc_write(const struct igma_chip *, int, u_int8_t);
103 1.1.4.2 rmind #endif
104 1.1.4.2 rmind
105 1.1.4.2 rmind static const struct i2c_bitbang_ops igma_i2cbb_ops = {
106 1.1.4.2 rmind igma_i2cbb_set_bits,
107 1.1.4.2 rmind igma_i2cbb_set_dir,
108 1.1.4.2 rmind igma_i2cbb_read,
109 1.1.4.2 rmind { 1, 2, 0, 1 }
110 1.1.4.2 rmind };
111 1.1.4.2 rmind
112 1.1.4.2 rmind static const struct igma_chip_ops igma_bus_ops = {
113 1.1.4.2 rmind igma_reg_barrier,
114 1.1.4.2 rmind igma_reg_read,
115 1.1.4.2 rmind igma_reg_write,
116 1.1.4.2 rmind igma_vga_read,
117 1.1.4.2 rmind igma_vga_write,
118 1.1.4.2 rmind #if 0
119 1.1.4.2 rmind igma_crtc_read,
120 1.1.4.2 rmind igma_crtc_write,
121 1.1.4.2 rmind #endif
122 1.1.4.2 rmind };
123 1.1.4.2 rmind
124 1.1.4.2 rmind static struct igma_product {
125 1.1.4.2 rmind u_int16_t product;
126 1.1.4.2 rmind int gentype;
127 1.1.4.2 rmind int num_pipes;
128 1.1.4.2 rmind } const igma_products[] = {
129 1.1.4.2 rmind /* i830 */
130 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82830MP_IV, 200,2 },
131 1.1.4.2 rmind /* i845g */
132 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82845G_IGD, 200,2 },
133 1.1.4.2 rmind /* i85x */
134 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82855GM_IGD, 200,2 },
135 1.1.4.2 rmind // 0x358e ?
136 1.1.4.2 rmind /* i865g */
137 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82865_IGD, 200,2 },
138 1.1.4.2 rmind /* i915g */
139 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82915G_IGD, 200,2 },
140 1.1.4.2 rmind { PCI_PRODUCT_INTEL_E7221_IGD, 200,2 },
141 1.1.4.2 rmind /* i915gm */
142 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82915GM_IGD, 300,2 },
143 1.1.4.2 rmind /* i945g */
144 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82945P_IGD, 300,2 },
145 1.1.4.2 rmind /* i945gm */
146 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82945GM_IGD, 300,2 },
147 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82945GM_IGD_1, 300,2 },
148 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82945GME_IGD, 300,2 },
149 1.1.4.2 rmind /* i965g */
150 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82946GZ_IGD, 300,2 },
151 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82G35_IGD, 300,2 },
152 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82G35_IGD_1, 300,2 },
153 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82965Q_IGD, 300,2 },
154 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82965Q_IGD_1, 300,2 },
155 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82965G_IGD, 300,2 },
156 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82965G_IGD_1, 300,2 },
157 1.1.4.2 rmind /* g33 */
158 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82G33_IGD, 300,2 },
159 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82G33_IGD_1, 300,2 },
160 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82Q33_IGD, 300,2 },
161 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82Q33_IGD_1, 300,2 },
162 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82Q35_IGD, 300,2 },
163 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82Q35_IGD_1, 300,2 },
164 1.1.4.2 rmind /* pineview */
165 1.1.4.2 rmind { PCI_PRODUCT_INTEL_PINEVIEW_IGD, 350,2 },
166 1.1.4.2 rmind { PCI_PRODUCT_INTEL_PINEVIEW_M_IGD, 350,2 },
167 1.1.4.2 rmind /* i965gm */
168 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82965PM_IGD, 400,2 },
169 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82965PM_IGD_1, 400,2 },
170 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82965GME_IGD, 400,2 },
171 1.1.4.2 rmind /* gm45 */
172 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82GM45_IGD, 450,2 },
173 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82GM45_IGD_1, 450,2 },
174 1.1.4.2 rmind /* g45 */
175 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82IGD_E_IGD, 450,2 },
176 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82Q45_IGD, 450,2 },
177 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82G45_IGD, 450,2 },
178 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82G41_IGD, 450,2 },
179 1.1.4.2 rmind { PCI_PRODUCT_INTEL_82B43_IGD, 450,2 },
180 1.1.4.2 rmind // 0x2e92 ?
181 1.1.4.2 rmind /* ironlake d */
182 1.1.4.2 rmind { PCI_PRODUCT_INTEL_IRONLAKE_D_IGD, 500,2 },
183 1.1.4.2 rmind /* ironlake m */
184 1.1.4.2 rmind { PCI_PRODUCT_INTEL_IRONLAKE_M_IGD, 500,2 },
185 1.1.4.2 rmind /* sandy bridge */
186 1.1.4.2 rmind { PCI_PRODUCT_INTEL_SANDYBRIDGE_IGD, 600,2 },
187 1.1.4.2 rmind { PCI_PRODUCT_INTEL_SANDYBRIDGE_IGD_1, 600,2 },
188 1.1.4.2 rmind { PCI_PRODUCT_INTEL_SANDYBRIDGE_IGD_2, 600,2 },
189 1.1.4.2 rmind /* sandy bridge m */
190 1.1.4.2 rmind { PCI_PRODUCT_INTEL_SANDYBRIDGE_M_IGD, 600,2 },
191 1.1.4.2 rmind { PCI_PRODUCT_INTEL_SANDYBRIDGE_M_IGD_1, 600,2 },
192 1.1.4.2 rmind { PCI_PRODUCT_INTEL_SANDYBRIDGE_M_IGD_2, 600,2 },
193 1.1.4.2 rmind /* sandy bridge s */
194 1.1.4.2 rmind { PCI_PRODUCT_INTEL_SANDYBRIDGE_S_IGD, 600,2 },
195 1.1.4.2 rmind /* ivy bridge */
196 1.1.4.2 rmind { PCI_PRODUCT_INTEL_IVYBRIDGE_IGD, 700,3 },
197 1.1.4.2 rmind { PCI_PRODUCT_INTEL_IVYBRIDGE_IGD_1, 700,3 },
198 1.1.4.2 rmind /* ivy bridge m */
199 1.1.4.2 rmind { PCI_PRODUCT_INTEL_IVYBRIDGE_M_IGD, 700,3 },
200 1.1.4.2 rmind { PCI_PRODUCT_INTEL_IVYBRIDGE_M_IGD_1, 700,3 },
201 1.1.4.2 rmind /* ivy bridge s */
202 1.1.4.2 rmind { PCI_PRODUCT_INTEL_IVYBRIDGE_S_IGD, 700,3 },
203 1.1.4.2 rmind { PCI_PRODUCT_INTEL_IVYBRIDGE_S_IGD_1, 700,3 },
204 1.1.4.2 rmind #if 0
205 1.1.4.2 rmind /* valleyview d */
206 1.1.4.2 rmind /* valleyview m */
207 1.1.4.2 rmind { PCI_PRODUCT_INTEL_HASWELL_IGD_1, 800,3 },
208 1.1.4.2 rmind /* haswell d */
209 1.1.4.2 rmind { PCI_PRODUCT_INTEL_HASWELL_IGD, 800,3 },
210 1.1.4.2 rmind { PCI_PRODUCT_INTEL_HASWELL_IGD_1, 800,3 },
211 1.1.4.2 rmind /* haswell m */
212 1.1.4.2 rmind /* broadwell d */
213 1.1.4.2 rmind /* broadwell m */
214 1.1.4.2 rmind #endif
215 1.1.4.2 rmind };
216 1.1.4.2 rmind
217 1.1.4.2 rmind static int
218 1.1.4.2 rmind igma_newpch_match(const struct pci_attach_args *pa)
219 1.1.4.2 rmind {
220 1.1.4.2 rmind if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL)
221 1.1.4.2 rmind return 0;
222 1.1.4.2 rmind switch (0xff00 & PCI_PRODUCT(pa->pa_id)) {
223 1.1.4.2 rmind case 0x3b00: /* ibex peak */
224 1.1.4.2 rmind case 0x1c00: /* cougar point */
225 1.1.4.2 rmind case 0x1e00: /* panther point */
226 1.1.4.2 rmind case 0x8c00: /* lynx point */
227 1.1.4.2 rmind case 0x9c00: /* lynx point lp */
228 1.1.4.2 rmind return 1;
229 1.1.4.2 rmind }
230 1.1.4.2 rmind
231 1.1.4.2 rmind return 0;
232 1.1.4.2 rmind }
233 1.1.4.2 rmind
234 1.1.4.2 rmind static const struct igma_product *
235 1.1.4.2 rmind igma_lookup(const struct pci_attach_args *pa)
236 1.1.4.2 rmind {
237 1.1.4.2 rmind const struct igma_product *ip;
238 1.1.4.2 rmind int i;
239 1.1.4.2 rmind
240 1.1.4.2 rmind if (PCI_VENDOR(pa->pa_id) != PCI_VENDOR_INTEL)
241 1.1.4.2 rmind return NULL;
242 1.1.4.2 rmind for (i=0; i < __arraycount(igma_products); ++i) {
243 1.1.4.2 rmind ip = &igma_products[i];
244 1.1.4.2 rmind if (PCI_PRODUCT(pa->pa_id) == ip->product)
245 1.1.4.2 rmind return ip;
246 1.1.4.2 rmind }
247 1.1.4.2 rmind return NULL;
248 1.1.4.2 rmind }
249 1.1.4.2 rmind
250 1.1.4.2 rmind static void
251 1.1.4.2 rmind igma_product_to_chip(const struct pci_attach_args *pa, struct igma_chip *cd)
252 1.1.4.2 rmind {
253 1.1.4.2 rmind const struct igma_product *ip;
254 1.1.4.2 rmind struct pci_attach_args PA;
255 1.1.4.2 rmind
256 1.1.4.2 rmind ip = igma_lookup(pa);
257 1.1.4.2 rmind KASSERT(ip != NULL);
258 1.1.4.2 rmind
259 1.1.4.2 rmind cd->ops = &igma_bus_ops;
260 1.1.4.2 rmind cd->num_gmbus = 6;
261 1.1.4.2 rmind cd->num_pipes = ip->num_pipes;
262 1.1.4.2 rmind cd->quirks = 0;
263 1.1.4.2 rmind cd->backlight_factor = 1;
264 1.1.4.2 rmind
265 1.1.4.2 rmind cd->gpio_offset = OLD_GPIOA;
266 1.1.4.2 rmind cd->vga_cntrl = PCH_VGA_CNTRL;
267 1.1.4.2 rmind cd->backlight_cntrl = OLD_BLC_PWM_CTL;
268 1.1.4.2 rmind cd->backlight_cntrl2 = OLD_BLC_PWM_CTL2;
269 1.1.4.2 rmind
270 1.1.4.2 rmind PA = *pa;
271 1.1.4.2 rmind if (pci_find_device(&PA, igma_newpch_match)) {
272 1.1.4.2 rmind cd->gpio_offset = PCH_GPIOA;
273 1.1.4.2 rmind cd->vga_cntrl = CPU_VGA_CNTRL;
274 1.1.4.2 rmind cd->backlight_cntrl = CPU_BLC_PWM_CTL;
275 1.1.4.2 rmind cd->backlight_cntrl2 = CPU_BLC_PWM_CTL2;
276 1.1.4.2 rmind }
277 1.1.4.2 rmind
278 1.1.4.2 rmind switch (ip->gentype) {
279 1.1.4.2 rmind case 200:
280 1.1.4.2 rmind cd->backlight_factor = 2;
281 1.1.4.2 rmind break;
282 1.1.4.2 rmind case 300:
283 1.1.4.2 rmind case 350:
284 1.1.4.2 rmind cd->backlight_factor = 2;
285 1.1.4.2 rmind cd->quirks |= IGMA_PFITDISABLE_QUIRK;
286 1.1.4.2 rmind break;
287 1.1.4.2 rmind case 450:
288 1.1.4.2 rmind cd->pri_cntrl = PRI_CTRL_NOTRICKLE;
289 1.1.4.2 rmind cd->quirks |= IGMA_PLANESTART_QUIRK;
290 1.1.4.2 rmind break;
291 1.1.4.2 rmind default:
292 1.1.4.2 rmind cd->pri_cntrl = 0;
293 1.1.4.2 rmind break;
294 1.1.4.2 rmind }
295 1.1.4.2 rmind }
296 1.1.4.2 rmind
297 1.1.4.2 rmind static void
298 1.1.4.2 rmind igma_adjust_chip(struct igma_softc *sc, struct igma_chip *cd)
299 1.1.4.2 rmind {
300 1.1.4.2 rmind const struct igma_chip_ops *co = cd->ops;
301 1.1.4.2 rmind u_int32_t reg;
302 1.1.4.2 rmind
303 1.1.4.2 rmind reg = co->read_reg(cd, cd->vga_cntrl);
304 1.1.4.2 rmind if (reg & VGA_PIPE_B_SELECT)
305 1.1.4.2 rmind cd->use_pipe = 1;
306 1.1.4.2 rmind }
307 1.1.4.2 rmind
308 1.1.4.2 rmind static int
309 1.1.4.2 rmind igma_print(void *aux, const char *pnp)
310 1.1.4.2 rmind {
311 1.1.4.2 rmind if (pnp)
312 1.1.4.2 rmind aprint_normal("drm at %s", pnp);
313 1.1.4.2 rmind return (UNCONF);
314 1.1.4.2 rmind }
315 1.1.4.2 rmind
316 1.1.4.2 rmind static int
317 1.1.4.2 rmind igma_match(device_t parent, cfdata_t match, void *aux)
318 1.1.4.2 rmind {
319 1.1.4.2 rmind struct pci_attach_args *pa = (struct pci_attach_args *)aux;
320 1.1.4.2 rmind const struct igma_product *ip;
321 1.1.4.2 rmind
322 1.1.4.2 rmind if (PCI_CLASS(pa->pa_class) != PCI_CLASS_DISPLAY)
323 1.1.4.2 rmind return 0;
324 1.1.4.2 rmind
325 1.1.4.2 rmind ip = igma_lookup(pa);
326 1.1.4.2 rmind if (ip != NULL)
327 1.1.4.2 rmind return 100;
328 1.1.4.2 rmind
329 1.1.4.2 rmind return 0;
330 1.1.4.2 rmind }
331 1.1.4.2 rmind
332 1.1.4.2 rmind static void
333 1.1.4.2 rmind igma_attach(device_t parent, device_t self, void *aux)
334 1.1.4.2 rmind {
335 1.1.4.2 rmind struct igma_softc *sc = device_private(self);
336 1.1.4.2 rmind const struct pci_attach_args *pa = (struct pci_attach_args *)aux;
337 1.1.4.2 rmind struct igma_attach_args iaa;
338 1.1.4.2 rmind bus_space_tag_t gttmmt, gmt, regt;
339 1.1.4.2 rmind bus_space_handle_t gttmmh, gmh, regh;
340 1.1.4.2 rmind bus_addr_t gttmmb, gmb;
341 1.1.4.2 rmind
342 1.1.4.2 rmind pci_aprint_devinfo(pa, NULL);
343 1.1.4.2 rmind
344 1.1.4.2 rmind sc->sc_dev = self;
345 1.1.4.2 rmind
346 1.1.4.2 rmind /* Initialize according to chip type */
347 1.1.4.2 rmind igma_product_to_chip(pa, &sc->sc_chip);
348 1.1.4.2 rmind
349 1.1.4.2 rmind if (pci_mapreg_map(pa, PCI_BAR0, PCI_MAPREG_TYPE_MEM,
350 1.1.4.2 rmind BUS_SPACE_MAP_LINEAR,
351 1.1.4.2 rmind >tmmt, >tmmh, >tmmb, NULL)) {
352 1.1.4.2 rmind aprint_error_dev(sc->sc_dev, "unable to map GTTMM\n");
353 1.1.4.2 rmind return;
354 1.1.4.2 rmind }
355 1.1.4.2 rmind sc->sc_chip.mmiot = gttmmt;
356 1.1.4.2 rmind if (bus_space_subregion(gttmmt, gttmmh, 0, 2*1024*1024,
357 1.1.4.2 rmind &sc->sc_chip.mmioh)) {
358 1.1.4.2 rmind aprint_error_dev(sc->sc_dev, "unable to submap MMIO\n");
359 1.1.4.2 rmind return;
360 1.1.4.2 rmind }
361 1.1.4.2 rmind sc->sc_chip.gttt = gttmmt;
362 1.1.4.2 rmind if (bus_space_subregion(gttmmt, gttmmh, 2*1024*1024, 2*1024*1024,
363 1.1.4.2 rmind &sc->sc_chip.gtth)) {
364 1.1.4.2 rmind aprint_error_dev(sc->sc_dev, "unable to submap GTT\n");
365 1.1.4.2 rmind return;
366 1.1.4.2 rmind }
367 1.1.4.2 rmind
368 1.1.4.2 rmind if (pci_mapreg_map(pa, PCI_BAR2, PCI_MAPREG_TYPE_MEM,
369 1.1.4.2 rmind BUS_SPACE_MAP_LINEAR | BUS_SPACE_MAP_PREFETCHABLE,
370 1.1.4.2 rmind &gmt, &gmh, &gmb, NULL)) {
371 1.1.4.2 rmind aprint_error_dev(sc->sc_dev, "unable to map aperture\n");
372 1.1.4.2 rmind return;
373 1.1.4.2 rmind }
374 1.1.4.2 rmind sc->sc_chip.gmt = gmt;
375 1.1.4.2 rmind sc->sc_chip.gmh = gmh;
376 1.1.4.2 rmind sc->sc_chip.gmb = gmb;
377 1.1.4.2 rmind
378 1.1.4.2 rmind if (pci_mapreg_map(pa, PCI_BAR4, PCI_MAPREG_TYPE_IO, 0,
379 1.1.4.2 rmind ®t, ®h, NULL, NULL)) {
380 1.1.4.2 rmind aprint_error_dev(sc->sc_dev, "unable to map IO registers\n");
381 1.1.4.2 rmind return;
382 1.1.4.2 rmind }
383 1.1.4.2 rmind
384 1.1.4.2 rmind #if NVGA > 0
385 1.1.4.2 rmind iaa.iaa_console = vga_cndetach() ? true : false;
386 1.1.4.2 rmind /* Hack */
387 1.1.4.2 rmind if (iaa.iaa_console)
388 1.1.4.2 rmind wsdisplay_cndetach();
389 1.1.4.2 rmind #else
390 1.1.4.2 rmind iaa.iaa_console = 0;
391 1.1.4.2 rmind #endif
392 1.1.4.2 rmind sc->sc_chip.vgat = regt;
393 1.1.4.2 rmind if (bus_space_map(regt, 0x3c0, 0x10, 0, &sc->sc_chip.vgah)) {
394 1.1.4.2 rmind aprint_error_dev(sc->sc_dev, "unable to map VGA registers\n");
395 1.1.4.2 rmind return;
396 1.1.4.2 rmind }
397 1.1.4.2 rmind
398 1.1.4.2 rmind /* Check hardware for more information */
399 1.1.4.2 rmind igma_adjust_chip(sc, &sc->sc_chip);
400 1.1.4.2 rmind
401 1.1.4.2 rmind aprint_normal("%s: VGA_CNTRL: 0x%x\n",device_xname(sc->sc_dev),
402 1.1.4.2 rmind sc->sc_chip.vga_cntrl);
403 1.1.4.2 rmind aprint_normal("%s: GPIO_OFFSET: 0x%x\n",device_xname(sc->sc_dev),
404 1.1.4.2 rmind sc->sc_chip.gpio_offset);
405 1.1.4.2 rmind aprint_normal("%s: BACKLIGHT_CTRL: 0x%x\n",device_xname(sc->sc_dev),
406 1.1.4.2 rmind sc->sc_chip.backlight_cntrl);
407 1.1.4.2 rmind aprint_normal("%s: BACKLIGHT_CTRL2: 0x%x\n",device_xname(sc->sc_dev),
408 1.1.4.2 rmind sc->sc_chip.backlight_cntrl2);
409 1.1.4.2 rmind
410 1.1.4.2 rmind #if NIGMAFB > 0
411 1.1.4.2 rmind strcpy(iaa.iaa_name, "igmafb");
412 1.1.4.2 rmind iaa.iaa_chip = sc->sc_chip;
413 1.1.4.2 rmind config_found_ia(sc->sc_dev, "igmabus", &iaa, igma_print);
414 1.1.4.2 rmind #endif
415 1.1.4.2 rmind
416 1.1.4.2 rmind igma_i2c_attach(sc);
417 1.1.4.2 rmind }
418 1.1.4.2 rmind
419 1.1.4.2 rmind static void
420 1.1.4.2 rmind igma_i2c_attach(struct igma_softc *sc)
421 1.1.4.2 rmind {
422 1.1.4.2 rmind struct igma_i2c *ii;
423 1.1.4.2 rmind int i;
424 1.1.4.2 rmind #if 0
425 1.1.4.2 rmind struct i2cbus_attach_args iba;
426 1.1.4.2 rmind #endif
427 1.1.4.2 rmind
428 1.1.4.2 rmind for (i=0; i<sc->sc_chip.num_gmbus; ++i) {
429 1.1.4.2 rmind ii = &sc->sc_ii[i];
430 1.1.4.2 rmind ii->ii_sc = sc;
431 1.1.4.2 rmind
432 1.1.4.2 rmind /* XXX */
433 1.1.4.2 rmind ii->ii_reg = sc->sc_chip.gpio_offset - PCH_GPIOA;
434 1.1.4.2 rmind switch (i) {
435 1.1.4.2 rmind case 0:
436 1.1.4.2 rmind ii->ii_reg += PCH_GPIOB;
437 1.1.4.2 rmind ii->ii_name = "ssc";
438 1.1.4.2 rmind break;
439 1.1.4.2 rmind case 1:
440 1.1.4.2 rmind ii->ii_reg += PCH_GPIOA;
441 1.1.4.2 rmind ii->ii_name = "vga";
442 1.1.4.2 rmind break;
443 1.1.4.2 rmind case 2:
444 1.1.4.2 rmind ii->ii_reg += PCH_GPIOC;
445 1.1.4.2 rmind ii->ii_name = "panel";
446 1.1.4.2 rmind break;
447 1.1.4.2 rmind case 3:
448 1.1.4.2 rmind ii->ii_reg += PCH_GPIOD;
449 1.1.4.2 rmind ii->ii_name = "dpc";
450 1.1.4.2 rmind break;
451 1.1.4.2 rmind case 4:
452 1.1.4.2 rmind ii->ii_reg += PCH_GPIOE;
453 1.1.4.2 rmind ii->ii_name = "dpb";
454 1.1.4.2 rmind break;
455 1.1.4.2 rmind case 5:
456 1.1.4.2 rmind ii->ii_reg += PCH_GPIOF;
457 1.1.4.2 rmind ii->ii_name = "dpd";
458 1.1.4.2 rmind break;
459 1.1.4.2 rmind default:
460 1.1.4.2 rmind panic("don't know GMBUS %d\n",i);
461 1.1.4.2 rmind }
462 1.1.4.2 rmind
463 1.1.4.2 rmind mutex_init(&ii->ii_lock, MUTEX_DEFAULT, IPL_NONE);
464 1.1.4.2 rmind
465 1.1.4.2 rmind ii->ii_i2c.ic_cookie = ii;
466 1.1.4.2 rmind ii->ii_i2c.ic_acquire_bus = igma_i2c_acquire_bus;
467 1.1.4.2 rmind ii->ii_i2c.ic_release_bus = igma_i2c_release_bus;
468 1.1.4.2 rmind ii->ii_i2c.ic_send_start = igma_i2c_send_start;
469 1.1.4.2 rmind ii->ii_i2c.ic_send_stop = igma_i2c_send_stop;
470 1.1.4.2 rmind ii->ii_i2c.ic_initiate_xfer = igma_i2c_initiate_xfer;
471 1.1.4.2 rmind ii->ii_i2c.ic_read_byte = igma_i2c_read_byte;
472 1.1.4.2 rmind ii->ii_i2c.ic_write_byte = igma_i2c_write_byte;
473 1.1.4.2 rmind ii->ii_i2c.ic_exec = NULL;
474 1.1.4.2 rmind
475 1.1.4.2 rmind #if 0
476 1.1.4.2 rmind iba.iba_type = I2C_TYPE_SMBUS;
477 1.1.4.2 rmind iba.iba_tag = &ii->ii_i2c;
478 1.1.4.2 rmind config_found_ia(sc->sc_dev, "i2cbus", &iba, iicbus_print);
479 1.1.4.2 rmind #endif
480 1.1.4.2 rmind }
481 1.1.4.2 rmind }
482 1.1.4.2 rmind
483 1.1.4.2 rmind /*
484 1.1.4.2 rmind * I2C interface
485 1.1.4.2 rmind */
486 1.1.4.2 rmind
487 1.1.4.2 rmind static int
488 1.1.4.2 rmind igma_i2c_acquire_bus(void *cookie, int flags)
489 1.1.4.2 rmind {
490 1.1.4.2 rmind struct igma_i2c *ii = cookie;
491 1.1.4.2 rmind mutex_enter(&ii->ii_lock);
492 1.1.4.2 rmind return 0;
493 1.1.4.2 rmind }
494 1.1.4.2 rmind
495 1.1.4.2 rmind static void
496 1.1.4.2 rmind igma_i2c_release_bus(void *cookie, int flags)
497 1.1.4.2 rmind {
498 1.1.4.2 rmind struct igma_i2c *ii = cookie;
499 1.1.4.2 rmind mutex_exit(&ii->ii_lock);
500 1.1.4.2 rmind }
501 1.1.4.2 rmind
502 1.1.4.2 rmind static int
503 1.1.4.2 rmind igma_i2c_send_start(void *cookie, int flags)
504 1.1.4.2 rmind {
505 1.1.4.2 rmind return i2c_bitbang_send_start(cookie, flags, &igma_i2cbb_ops);
506 1.1.4.2 rmind }
507 1.1.4.2 rmind
508 1.1.4.2 rmind static int
509 1.1.4.2 rmind igma_i2c_send_stop(void *cookie, int flags)
510 1.1.4.2 rmind {
511 1.1.4.2 rmind return i2c_bitbang_send_stop(cookie, flags, &igma_i2cbb_ops);
512 1.1.4.2 rmind }
513 1.1.4.2 rmind
514 1.1.4.2 rmind static int
515 1.1.4.2 rmind igma_i2c_initiate_xfer(void *cookie, i2c_addr_t addr, int flags)
516 1.1.4.2 rmind {
517 1.1.4.2 rmind return i2c_bitbang_initiate_xfer(cookie, addr, flags, &igma_i2cbb_ops);
518 1.1.4.2 rmind }
519 1.1.4.2 rmind
520 1.1.4.2 rmind static int
521 1.1.4.2 rmind igma_i2c_read_byte(void *cookie, uint8_t *valp, int flags)
522 1.1.4.2 rmind {
523 1.1.4.2 rmind return i2c_bitbang_read_byte(cookie, valp, flags, &igma_i2cbb_ops);
524 1.1.4.2 rmind }
525 1.1.4.2 rmind
526 1.1.4.2 rmind static int
527 1.1.4.2 rmind igma_i2c_write_byte(void *cookie, uint8_t val, int flags)
528 1.1.4.2 rmind {
529 1.1.4.2 rmind return i2c_bitbang_write_byte(cookie, val, flags, &igma_i2cbb_ops);
530 1.1.4.2 rmind }
531 1.1.4.2 rmind
532 1.1.4.2 rmind static void
533 1.1.4.2 rmind igma_i2cbb_set_bits(void *cookie, uint32_t bits)
534 1.1.4.2 rmind {
535 1.1.4.2 rmind struct igma_i2c *ii = cookie;
536 1.1.4.2 rmind struct igma_softc *sc = ii->ii_sc;
537 1.1.4.2 rmind const struct igma_chip *cd = &sc->sc_chip;
538 1.1.4.2 rmind const struct igma_chip_ops *co = cd->ops;
539 1.1.4.2 rmind uint32_t reg;
540 1.1.4.2 rmind
541 1.1.4.2 rmind reg = co->read_reg(cd, ii->ii_reg);
542 1.1.4.2 rmind reg &= GPIO_DATA_PULLUP_DISABLE | GPIO_CLOCK_PULLUP_DISABLE;
543 1.1.4.2 rmind
544 1.1.4.2 rmind if ((bits | ii->ii_dir) & 1)
545 1.1.4.2 rmind /* make data input, signal is pulled high */
546 1.1.4.2 rmind reg |= GPIO_DATA_DIR_IN | GPIO_DATA_DIR_MASK;
547 1.1.4.2 rmind else
548 1.1.4.2 rmind /* make data output, signal is driven low */
549 1.1.4.2 rmind reg |= GPIO_DATA_DIR_OUT | GPIO_DATA_DIR_MASK
550 1.1.4.2 rmind | GPIO_DATA_VAL_MASK;
551 1.1.4.2 rmind
552 1.1.4.2 rmind if (bits & 2)
553 1.1.4.2 rmind /* make clock input, signal is pulled high */
554 1.1.4.2 rmind reg |= GPIO_CLOCK_DIR_IN | GPIO_CLOCK_DIR_MASK;
555 1.1.4.2 rmind else
556 1.1.4.2 rmind /* make clock output, signal is driven low */
557 1.1.4.2 rmind reg |= GPIO_CLOCK_DIR_OUT | GPIO_CLOCK_DIR_MASK
558 1.1.4.2 rmind | GPIO_CLOCK_VAL_MASK;
559 1.1.4.2 rmind
560 1.1.4.2 rmind co->write_reg(cd, ii->ii_reg, reg);
561 1.1.4.2 rmind #if 1
562 1.1.4.2 rmind reg = co->read_reg(cd, ii->ii_reg);
563 1.1.4.2 rmind #else
564 1.1.4.2 rmind co->barrier(cd, ii->ii_reg);
565 1.1.4.2 rmind #endif
566 1.1.4.2 rmind }
567 1.1.4.2 rmind
568 1.1.4.2 rmind static void
569 1.1.4.2 rmind igma_i2cbb_set_dir(void *cookie, uint32_t bits)
570 1.1.4.2 rmind {
571 1.1.4.2 rmind struct igma_i2c *ii = cookie;
572 1.1.4.2 rmind
573 1.1.4.2 rmind ii->ii_dir = bits;
574 1.1.4.2 rmind }
575 1.1.4.2 rmind
576 1.1.4.2 rmind static uint32_t
577 1.1.4.2 rmind igma_i2cbb_read(void *cookie)
578 1.1.4.2 rmind {
579 1.1.4.2 rmind struct igma_i2c *ii = cookie;
580 1.1.4.2 rmind struct igma_softc *sc = ii->ii_sc;
581 1.1.4.2 rmind const struct igma_chip *cd = &sc->sc_chip;
582 1.1.4.2 rmind const struct igma_chip_ops *co = cd->ops;
583 1.1.4.2 rmind uint32_t reg;
584 1.1.4.2 rmind int sda, scl;
585 1.1.4.2 rmind
586 1.1.4.2 rmind reg = co->read_reg(cd, ii->ii_reg);
587 1.1.4.2 rmind
588 1.1.4.2 rmind sda = reg & GPIO_DATA_VAL_IN;
589 1.1.4.2 rmind scl = reg & GPIO_CLOCK_VAL_IN;
590 1.1.4.2 rmind
591 1.1.4.2 rmind reg = (sda ? 1 : 0) | (scl ? 2 : 0);
592 1.1.4.2 rmind return reg;
593 1.1.4.2 rmind }
594 1.1.4.2 rmind
595 1.1.4.2 rmind static void
596 1.1.4.2 rmind igma_reg_barrier(const struct igma_chip *cd, int r)
597 1.1.4.2 rmind {
598 1.1.4.2 rmind bus_space_barrier(cd->mmiot, cd->mmioh, r, sizeof(u_int32_t),
599 1.1.4.2 rmind BUS_SPACE_BARRIER_READ | BUS_SPACE_BARRIER_WRITE);
600 1.1.4.2 rmind }
601 1.1.4.2 rmind
602 1.1.4.2 rmind static u_int32_t
603 1.1.4.2 rmind igma_reg_read(const struct igma_chip *cd, int r)
604 1.1.4.2 rmind {
605 1.1.4.2 rmind return bus_space_read_4(cd->mmiot, cd->mmioh, r);
606 1.1.4.2 rmind }
607 1.1.4.2 rmind
608 1.1.4.2 rmind static void
609 1.1.4.2 rmind igma_reg_write(const struct igma_chip *cd, int r, u_int32_t v)
610 1.1.4.2 rmind {
611 1.1.4.2 rmind bus_space_write_4(cd->mmiot, cd->mmioh, r, v);
612 1.1.4.2 rmind }
613 1.1.4.2 rmind
614 1.1.4.2 rmind static u_int8_t
615 1.1.4.2 rmind igma_vga_read(const struct igma_chip *cd, int r)
616 1.1.4.2 rmind {
617 1.1.4.2 rmind bus_space_write_1(cd->vgat, cd->vgah, 0x4, r | 0x20);
618 1.1.4.2 rmind return bus_space_read_1(cd->vgat, cd->vgah, 0x5);
619 1.1.4.2 rmind }
620 1.1.4.2 rmind
621 1.1.4.2 rmind static void
622 1.1.4.2 rmind igma_vga_write(const struct igma_chip *cd, int r, u_int8_t v)
623 1.1.4.2 rmind {
624 1.1.4.2 rmind bus_space_write_1(cd->vgat, cd->vgah, 0x4, r | 0x20);
625 1.1.4.2 rmind bus_space_write_1(cd->vgat, cd->vgah, 0x5, v);
626 1.1.4.2 rmind }
627 1.1.4.2 rmind
628 1.1.4.2 rmind #if 0
629 1.1.4.2 rmind static u_int8_t
630 1.1.4.2 rmind igma_crtc_read(const struct igma_chip *cd, int r)
631 1.1.4.2 rmind {
632 1.1.4.2 rmind bus_space_write_1(cd->crtct, cd->crtch, 0x4, r);
633 1.1.4.2 rmind return bus_space_read_1(cd->crtct, cd->crtch, 0x5);
634 1.1.4.2 rmind }
635 1.1.4.2 rmind
636 1.1.4.2 rmind static void
637 1.1.4.2 rmind igma_crtc_write(const struct igma_chip *cd, int r, u_int8_t v)
638 1.1.4.2 rmind {
639 1.1.4.2 rmind bus_space_write_1(cd->crtct, cd->crtch, 0x4, r);
640 1.1.4.2 rmind bus_space_write_1(cd->crtct, cd->crtch, 0x5, v);
641 1.1.4.2 rmind }
642 1.1.4.2 rmind #endif
643