From 2bd43f170ebf0d2fbcb211e68b251c1b9306de0f Mon Sep 17 00:00:00 2001 From: Miod Vallat Date: Mon, 18 Dec 2006 18:57:27 +0000 Subject: Change sti attachment to pass an array of base addresses for the sti regions, instead of using the rom mapping for region #0 and the device mapping for region #1. This will allow sti devices on which regions may be relative to different origins to attach (to be used very soon). ok mickey@ --- sys/dev/ic/sti.c | 23 ++++++++++++----------- sys/dev/ic/stivar.h | 9 +++++---- 2 files changed, 17 insertions(+), 15 deletions(-) (limited to 'sys/dev') diff --git a/sys/dev/ic/sti.c b/sys/dev/ic/sti.c index 1afdcd29872..5f462c44794 100644 --- a/sys/dev/ic/sti.c +++ b/sys/dev/ic/sti.c @@ -1,4 +1,4 @@ -/* $OpenBSD: sti.c,v 1.48 2006/12/16 15:52:30 miod Exp $ */ +/* $OpenBSD: sti.c,v 1.49 2006/12/18 18:57:26 miod Exp $ */ /* * Copyright (c) 2000-2003 Michael Shalayeff @@ -121,7 +121,7 @@ int sti_setcment(struct sti_screen *scr, u_int i, u_char r, u_char g, u_char b); int sti_fetchfonts(struct sti_screen *scr, struct sti_inqconfout *cfg, u_int32_t addr); void sti_screen_setup(struct sti_screen *scr, bus_space_tag_t iot, - bus_space_tag_t memt, bus_space_handle_t romh, bus_addr_t base, + bus_space_tag_t memt, bus_space_handle_t romh, bus_addr_t *bases, u_int codebase); void @@ -140,14 +140,14 @@ sti_attach_common(sc, codebase) bzero(scr, sizeof(struct sti_screen)); sc->sc_scr = scr; - sti_screen_setup(scr, sc->iot, sc->memt, sc->romh, sc->base, + sti_screen_setup(scr, sc->iot, sc->memt, sc->romh, sc->bases, codebase); sti_describe(sc); } void sti_screen_setup(struct sti_screen *scr, bus_space_tag_t iot, - bus_space_tag_t memt, bus_space_handle_t romh, bus_addr_t base, + bus_space_tag_t memt, bus_space_handle_t romh, bus_addr_t *bases, u_int codebase) { struct sti_inqconfout cfg; @@ -161,6 +161,7 @@ sti_screen_setup(struct sti_screen *scr, bus_space_tag_t iot, scr->iot = iot; scr->memt = memt; scr->romh = romh; + scr->bases = bases; scr->scr_devtype = bus_space_read_1(memt, romh, 3); /* { extern int pmapdebug; pmapdebug = 0xfffff; } */ @@ -335,10 +336,9 @@ sti_screen_setup(struct sti_screen *scr, bus_space_tag_t iot, else *(u_int *)&r = bus_space_read_4(memt, romh, i), i += 4; - *p = (p == cc->regions? romh : base) + - (r.offset << PGSHIFT); + *p = bases[p - cc->regions] + (r.offset << PGSHIFT); #ifdef STIDEBUG - printf("%x @ 0x%x%s%s%s%s\n", + printf("%08x @ 0x%08x%s%s%s%s\n", r.length << PGSHIFT, *p, r.sys_only? " sys" : "", r.cache? " cache" : "", r.btlb? " btlb" : "", r.last? " last" : ""); @@ -1105,7 +1105,7 @@ sti_clear(struct sti_screen *scr) } int -sti_cnattach(struct sti_screen *scr, bus_space_tag_t iot, bus_addr_t base, +sti_cnattach(struct sti_screen *scr, bus_space_tag_t iot, bus_addr_t *bases, u_int codebase) { bus_space_handle_t ioh; @@ -1113,7 +1113,7 @@ sti_cnattach(struct sti_screen *scr, bus_space_tag_t iot, bus_addr_t base, int error; long defattr; - if ((error = bus_space_map(iot, base, PAGE_SIZE, 0, &ioh)) != 0) + if ((error = bus_space_map(iot, bases[0], PAGE_SIZE, 0, &ioh)) != 0) return (error); /* @@ -1123,10 +1123,11 @@ sti_cnattach(struct sti_screen *scr, bus_space_tag_t iot, bus_addr_t base, bus_space_unmap(iot, ioh, PAGE_SIZE); - if ((error = bus_space_map(iot, base, romend, 0, &ioh)) != 0) + if ((error = bus_space_map(iot, bases[0], romend, 0, &ioh)) != 0) return (error); - sti_screen_setup(scr, iot, iot, ioh, base, codebase); + bases[0] = ioh; + sti_screen_setup(scr, iot, iot, ioh, bases, codebase); sti_alloc_attr(scr, 0, 0, 0, &defattr); wsdisplay_cnattach(&sti_default_screen, scr, 0, 0, defattr); diff --git a/sys/dev/ic/stivar.h b/sys/dev/ic/stivar.h index 6f246d50af5..3b4e1d5ed52 100644 --- a/sys/dev/ic/stivar.h +++ b/sys/dev/ic/stivar.h @@ -1,4 +1,4 @@ -/* $OpenBSD: stivar.h,v 1.19 2006/08/22 21:04:32 miod Exp $ */ +/* $OpenBSD: stivar.h,v 1.20 2006/12/18 18:57:26 miod Exp $ */ /* * Copyright (c) 2000-2003 Michael Shalayeff @@ -34,7 +34,8 @@ struct sti_screen { bus_space_tag_t iot, memt; bus_space_handle_t romh; - bus_addr_t base, fbaddr; + bus_addr_t *bases; + bus_addr_t fbaddr; bus_size_t fblen; int scr_bpp; @@ -84,7 +85,7 @@ struct sti_softc { bus_space_tag_t iot, memt; bus_space_handle_t romh; - bus_addr_t base; + bus_addr_t bases[STI_REGION_MAX]; struct sti_screen *sc_scr; u_int sc_wsmode; @@ -92,7 +93,7 @@ struct sti_softc { void sti_attach_common(struct sti_softc *sc, u_int codebase); void sti_clear(struct sti_screen *); -int sti_cnattach(struct sti_screen *, bus_space_tag_t, bus_addr_t, u_int); +int sti_cnattach(struct sti_screen *, bus_space_tag_t, bus_addr_t *, u_int); void sti_describe(struct sti_softc *); void sti_end_attach(void *); u_int sti_rom_size(bus_space_tag_t, bus_space_handle_t); -- cgit v1.2.3