Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/dev/pci - move register definition in their own header, ...
details: https://anonhg.NetBSD.org/src/rev/cd3422b7bc05
branches: trunk
changeset: 752888:cd3422b7bc05
user: macallan <macallan%NetBSD.org@localhost>
date: Wed Mar 10 05:16:17 2010 +0000
description:
- move register definition in their own header, reduce magic numbers
- get geometry and framebuffer layout from the chip instead of hardcoding
- get rid of some now superfluous leftovers
- remove some debug code
- clean things up a bit
- dump registers with WCFB_DEBUG even if we're not the console
diffstat:
sys/dev/pci/wcfb.c | 87 +++++++++++++++++++-------------------------------
sys/dev/pci/wcfbreg.h | 56 ++++++++++++++++++++++++++++++++
2 files changed, 90 insertions(+), 53 deletions(-)
diffs (246 lines):
diff -r 1b95e882a08f -r cd3422b7bc05 sys/dev/pci/wcfb.c
--- a/sys/dev/pci/wcfb.c Wed Mar 10 03:11:49 2010 +0000
+++ b/sys/dev/pci/wcfb.c Wed Mar 10 05:16:17 2010 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: wcfb.c,v 1.5 2010/03/10 02:41:02 macallan Exp $ */
+/* $NetBSD: wcfb.c,v 1.6 2010/03/10 05:16:17 macallan Exp $ */
/*-
* Copyright (c) 2010 Michael Lorenz
@@ -27,7 +27,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: wcfb.c,v 1.5 2010/03/10 02:41:02 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: wcfb.c,v 1.6 2010/03/10 05:16:17 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -45,6 +45,7 @@
#include <dev/pci/pcireg.h>
#include <dev/pci/pcivar.h>
#include <dev/pci/pciio.h>
+#include <dev/pci/wcfbreg.h>
#include <dev/wscons/wsdisplayvar.h>
#include <dev/wscons/wsconsio.h>
@@ -94,7 +95,7 @@
u_char sc_cmap_red[256];
u_char sc_cmap_green[256];
u_char sc_cmap_blue[256];
- uint32_t sc_fb0off;
+ uint32_t sc_fb0off, sc_fb1off;
void (*copycols)(void *, int, int, int, int);
void (*erasecols)(void *, int, int, int, long);
@@ -151,8 +152,9 @@
prop_dictionary_t dict;
struct wsemuldisplaydev_attach_args aa;
int i, j;
+ uint32_t reg;
unsigned long defattr;
- bool is_console;
+ bool is_console = 0;
char devinfo[256];
void *wtf;
@@ -164,23 +166,14 @@
dict = device_properties(self);
prop_dictionary_get_bool(dict, "is_console", &is_console);
- if(!is_console) return;
-
+#ifndef WCFB_DEBUG
+ if (!is_console) return;
+#endif
sc->sc_memt = pa->pa_memt;
sc->sc_iot = pa->pa_iot;
sc->sc_pc = pa->pa_pc;
sc->sc_pcitag = pa->pa_tag;
- /* fill in parameters from properties */
- if (!prop_dictionary_get_uint32(dict, "width", &sc->sc_width)) {
- aprint_error("%s: no width property\n", device_xname(self));
- return;
- }
- if (!prop_dictionary_get_uint32(dict, "height", &sc->sc_height)) {
- aprint_error("%s: no height property\n", device_xname(self));
- return;
- }
-
if (pci_mapreg_map(pa, 0x14, PCI_MAPREG_TYPE_MEM, 0,
&sc->sc_regt, &sc->sc_regh, &sc->sc_reg, &sc->sc_regsize)) {
aprint_error("%s: failed to map registers.\n",
@@ -203,13 +196,19 @@
sc->sc_fbaddr = bus_space_vaddr(sc->sc_memt, sc->sc_fbh);
- sc->sc_fb0off = bus_space_read_4(sc->sc_regt, sc->sc_regh, 0x8080) -
- sc->sc_fb;
+ sc->sc_fb0off =
+ bus_space_read_4(sc->sc_regt, sc->sc_regh, WC_FB8_ADDR0) - sc->sc_fb;
sc->sc_fb0 = sc->sc_fbaddr + sc->sc_fb0off;
- sc->sc_fb1 = sc->sc_fb0 + 0x200000;
+ sc->sc_fb1off =
+ bus_space_read_4(sc->sc_regt, sc->sc_regh, WC_FB8_ADDR1) - sc->sc_fb;
+ sc->sc_fb1 = sc->sc_fbaddr + sc->sc_fb1off;
- sc->sc_stride = 1 <<
- ((bus_space_read_4(sc->sc_regt, sc->sc_regh, 0x8074) & 0x00ff0000) >> 16);
+ reg = bus_space_read_4(sc->sc_regt, sc->sc_regh, WC_RESOLUTION);
+ sc->sc_height = (reg >> 16) + 1;
+ sc->sc_width = (reg & 0xffff) + 1;
+ sc->sc_stride = 1 <<
+ ((bus_space_read_4(sc->sc_regt, sc->sc_regh, WC_CONFIG) &
+ 0x00ff0000) >> 16);
printf("%s: %d x %d, %d\n", device_xname(sc->sc_dev),
sc->sc_width, sc->sc_height, sc->sc_stride);
@@ -229,6 +228,9 @@
printf("\n");
}
+ /* make sure video output is on */
+ bus_space_write_4(sc->sc_regt, sc->sc_regh, WC_DPMS_STATE, WC_DPMS_ON);
+
sc->sc_defaultscreen_descr = (struct wsscreen_descr){
"default",
0, 0,
@@ -263,20 +265,16 @@
rasops_cmap[j + 2]);
j += 3;
}
- wcfb_putpalreg(sc, 0, 0, 0, 0);
- wcfb_putpalreg(sc, 15, 0xff, 0xff, 0xff);
if (is_console) {
vcons_init_screen(&sc->vd, &sc->sc_console_screen, 1,
&defattr);
sc->sc_console_screen.scr_flags |= VCONS_SCREEN_IS_STATIC;
-#if 0
- wcfb_rectfill(sc, 0, 0, sc->sc_width, sc->sc_height,
- ri->ri_devcmap[(defattr >> 16) & 0xff]);
-#else
- /*memset(sc->sc_fbaddr + sc->sc_fb0off, 0, 0x400000);*/
-#endif
+ memset(sc->sc_fb0, ri->ri_devcmap[(defattr >> 16) & 0xff],
+ sc->sc_stride * sc->sc_height);
+ memset(sc->sc_fb1, ri->ri_devcmap[(defattr >> 16) & 0xff],
+ sc->sc_stride * sc->sc_height);
sc->sc_defaultscreen_descr.textops = &ri->ri_ops;
sc->sc_defaultscreen_descr.capabilities = ri->ri_caps;
sc->sc_defaultscreen_descr.nrows = ri->ri_rows;
@@ -289,7 +287,11 @@
* since we're not the console we can postpone the rest
* until someone actually allocates a screen for us
*/
- (*ri->ri_ops.allocattr)(ri, 0, 0, 0, &defattr);
+ memset(sc->sc_fb0, WS_DEFAULT_BG,
+ sc->sc_stride * sc->sc_height);
+ memset(sc->sc_fb1, WS_DEFAULT_BG,
+ sc->sc_stride * sc->sc_height);
+ return;
}
aa.console = is_console;
@@ -350,27 +352,6 @@
}
#endif
- /*
- * XXX this should be generalized, let's just
- * #define PCI_IOAREA_PADDR
- * #define PCI_IOAREA_OFFSET
- * #define PCI_IOAREA_SIZE
- * somewhere in a MD header and compile this code only if all are
- * present
- */
- /*
- * PCI_IOAREA_PADDR is useless, that's what the IO tag is for
- * the address isn't guaranteed to be the same on each host bridge
- * either, never mind the fact that it would be a bus address
- */
-#ifdef PCI_MAGIC_IO_RANGE
- /* allow to map our IO space */
- if ((offset >= PCI_MAGIC_IO_RANGE) &&
- (offset < PCI_MAGIC_IO_RANGE + 0x10000)) {
- return bus_space_mmap(sc->sc_iot, offset - PCI_MAGIC_IO_RANGE,
- 0, prot, BUS_SPACE_MAP_LINEAR);
- }
-#endif
return -1;
}
@@ -443,9 +424,9 @@
{
uint32_t rgb;
- bus_space_write_4(sc->sc_regt, sc->sc_regh, 0x80bc, i);
+ bus_space_write_4(sc->sc_regt, sc->sc_regh, WC_CMAP_INDEX, i);
rgb = (b << 22) | (g << 12) | (r << 2);
- bus_space_write_4(sc->sc_regt, sc->sc_regh, 0x80c0, rgb);
+ bus_space_write_4(sc->sc_regt, sc->sc_regh, WC_CMAP_DATA, rgb);
}
static void
diff -r 1b95e882a08f -r cd3422b7bc05 sys/dev/pci/wcfbreg.h
--- /dev/null Thu Jan 01 00:00:00 1970 +0000
+++ b/sys/dev/pci/wcfbreg.h Wed Mar 10 05:16:17 2010 +0000
@@ -0,0 +1,56 @@
+/* $NetBSD: wcfbreg.h,v 1.1 2010/03/10 05:16:17 macallan Exp $ */
+
+/*-
+ * Copyright (c) 2010 Michael Lorenz
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE NETBSD FOUNDATION, INC. AND CONTRIBUTORS
+ * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED
+ * TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
+ * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE FOUNDATION OR CONTRIBUTORS
+ * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
+ * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
+ * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
+ * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
+ * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
+ * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
+ * POSSIBILITY OF SUCH DAMAGE.
+ */
+
+/*
+ * register definitions for 3Dlabs Wildcat
+ * mostly from OpenBSD's ifb driver
+ */
+
+#ifndef WCFBREG_H
+#define WCFBREG_H
+
+#define WC_RESOLUTION 0x8070
+#define WC_CONFIG 0x8074 /* contains log2(stride) in 0x00ff0000 */
+#define WC_FB8_ADDR0 0x8080
+#define WC_FB8_ADDR1 0x8084
+
+#define WC_CMAP_INDEX 0x80bc
+#define WC_CMAP_DATA 0x80c0
+
+/*
+ * 80e4 DPMS state register
+ * States ``off'' and ``suspend'' need chip reprogramming before video can
+ * be enabled again.
+ */
+#define WC_DPMS_STATE 0x80e4
+ #define WC_DPMS_OFF 0x00000000
+ #define WC_DPMS_SUSPEND 0x00000001
+ #define WC_DPMS_STANDBY 0x00000002
+ #define WC_DPMS_ON 0x00000003
+
+#endif
Home |
Main Index |
Thread Index |
Old Index