Module Name: src
Committed By: macallan
Date: Wed Sep 5 23:19:13 UTC 2012
Modified Files:
src/sys/dev/pci: pm2fb.c
Log Message:
fix horizontal scrolling in 8bit, while there use an R3G3B2 palette
To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/dev/pci/pm2fb.c
Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.
Modified files:
Index: src/sys/dev/pci/pm2fb.c
diff -u src/sys/dev/pci/pm2fb.c:1.15 src/sys/dev/pci/pm2fb.c:1.16
--- src/sys/dev/pci/pm2fb.c:1.15 Wed Sep 5 01:48:39 2012
+++ src/sys/dev/pci/pm2fb.c Wed Sep 5 23:19:13 2012
@@ -1,4 +1,4 @@
-/* $NetBSD: pm2fb.c,v 1.15 2012/09/05 01:48:39 macallan Exp $ */
+/* $NetBSD: pm2fb.c,v 1.16 2012/09/05 23:19:13 macallan Exp $ */
/*
* Copyright (c) 2009 Michael Lorenz
@@ -31,7 +31,7 @@
*/
#include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: pm2fb.c,v 1.15 2012/09/05 01:48:39 macallan Exp $");
+__KERNEL_RCSID(0, "$NetBSD: pm2fb.c,v 1.16 2012/09/05 23:19:13 macallan Exp $");
#include <sys/param.h>
#include <sys/systm.h>
@@ -239,15 +239,17 @@ pm2fb_attach(device_t parent, device_t s
prop_dictionary_t dict;
unsigned long defattr;
bool is_console;
- int i, j;
- uint32_t flags;
+ int i, j;
+ uint32_t flags;
+ uint8_t cmap[768];
sc->sc_pc = pa->pa_pc;
sc->sc_pcitag = pa->pa_tag;
sc->sc_memt = pa->pa_memt;
sc->sc_iot = pa->pa_iot;
sc->sc_dev = self;
- sc->sc_is_pm2 = (PCI_PRODUCT(pa->pa_id) == PCI_PRODUCT_3DLABS_PERMEDIA2);
+ sc->sc_is_pm2 = (PCI_PRODUCT(pa->pa_id) ==
+ PCI_PRODUCT_3DLABS_PERMEDIA2);
pci_aprint_devinfo(pa, NULL);
/* fill in parameters from properties */
@@ -321,16 +323,6 @@ pm2fb_attach(device_t parent, device_t s
ri = &sc->sc_console_screen.scr_ri;
- j = 0;
- for (i = 0; i < 256; i++) {
- sc->sc_cmap_red[i] = rasops_cmap[j];
- sc->sc_cmap_green[i] = rasops_cmap[j + 1];
- sc->sc_cmap_blue[i] = rasops_cmap[j + 2];
- pm2fb_putpalreg(sc, i, rasops_cmap[j], rasops_cmap[j + 1],
- rasops_cmap[j + 2]);
- j += 3;
- }
-
if (is_console) {
vcons_init_screen(&sc->vd, &sc->sc_console_screen, 1,
&defattr);
@@ -348,10 +340,21 @@ pm2fb_attach(device_t parent, device_t s
} else {
if (sc->sc_console_screen.scr_ri.ri_rows == 0) {
/* do some minimal setup to avoid weirdnesses later */
- vcons_init_screen(&sc->vd, &sc->sc_console_screen, 1, &defattr);
+ vcons_init_screen(&sc->vd, &sc->sc_console_screen, 1,
+ &defattr);
}
}
+ j = 0;
+ rasops_get_cmap(ri, cmap, sizeof(cmap));
+ for (i = 0; i < 256; i++) {
+ sc->sc_cmap_red[i] = cmap[j];
+ sc->sc_cmap_green[i] = cmap[j + 1];
+ sc->sc_cmap_blue[i] = cmap[j + 2];
+ pm2fb_putpalreg(sc, i, cmap[j], cmap[j + 1], cmap[j + 2]);
+ j += 3;
+ }
+
aa.console = is_console;
aa.scrdata = &sc->sc_screenlist;
aa.accessops = &pm2fb_accessops;
@@ -447,7 +450,8 @@ pm2fb_mmap(void *v, void *vs, off_t offs
* restrict all other mappings to processes with superuser privileges
* or the kernel itself
*/
- if (kauth_authorize_machdep(kauth_cred_get(), KAUTH_MACHDEP_UNMANAGEDMEM,
+ if (kauth_authorize_machdep(kauth_cred_get(),
+ KAUTH_MACHDEP_UNMANAGEDMEM,
NULL, NULL, NULL, NULL) != 0) {
aprint_normal("%s: mmap() rejected.\n",
device_xname(sc->sc_dev));
@@ -492,6 +496,8 @@ pm2fb_init_screen(void *cookie, struct v
ri->ri_height = sc->sc_height;
ri->ri_stride = sc->sc_stride;
ri->ri_flg = RI_CENTER;
+ if (sc->sc_depth == 8)
+ ri->ri_flg |= RI_8BIT_IS_RGB /*| RI_ENABLE_ALPHA*/;
rasops_init(ri, 0, 0);
ri->ri_caps = WSSCREEN_WSCOLORS;
@@ -743,6 +749,7 @@ pm2fb_bitblt(struct pm2fb_softc *sc, int
bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_DDA_MODE, 0);
bus_space_write_4(sc->sc_memt, sc->sc_regh, PM2_RE_MODE, 0);
if (sc->sc_depth == 8) {
+ int adjust;
/*
* use packed mode for some extra speed
* this copies 32bit quantities even in 8 bit mode, so we need
@@ -766,9 +773,10 @@ pm2fb_bitblt(struct pm2fb_softc *sc, int
rxd = xd >> 2;
rwi = wi >> 2;
/* adjust for non-aligned x */
+ adjust = (xs & 3) - (xd & 3);
bus_space_write_4(sc->sc_memt, sc->sc_regh,
PM2_RE_PACKEDDATA_LIMIT,
- (xd << 16) | (xd + wi) | (((xd - xs) & 3) << 29));
+ (xd << 16) | (xd + wi) | (adjust << 29));
} else {
/* we're in 16 or 32bit mode */
if (rop == 3) {