Source-Changes-HG archive
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index][Old Index]
[src/trunk]: src/sys/arch/amiga/pci Add empb(4) functions to switch memory wi...
details: https://anonhg.NetBSD.org/src/rev/06d811516614
branches: trunk
changeset: 779512:06d811516614
user: rkujawa <rkujawa%NetBSD.org@localhost>
date: Thu May 31 21:29:02 2012 +0000
description:
Add empb(4) functions to switch memory window position.
diffstat:
sys/arch/amiga/pci/emmem.c | 4 +-
sys/arch/amiga/pci/empb.c | 102 +++++++++++++++++++++++++++++++++++-------
sys/arch/amiga/pci/empbreg.h | 6 ++-
3 files changed, 92 insertions(+), 20 deletions(-)
diffs (214 lines):
diff -r b69d5e0eb3b9 -r 06d811516614 sys/arch/amiga/pci/emmem.c
--- a/sys/arch/amiga/pci/emmem.c Thu May 31 21:02:02 2012 +0000
+++ b/sys/arch/amiga/pci/emmem.c Thu May 31 21:29:02 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: emmem.c,v 1.1 2012/05/30 18:01:51 rkujawa Exp $ */
+/* $NetBSD: emmem.c,v 1.2 2012/05/31 21:29:02 rkujawa Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -90,7 +90,7 @@
zap = aux;
sc->sc_dev = self;
- sc->sc_base = zap->pa;
+ sc->sc_base = zap->va;
sc->sc_size = zap->size;
aprint_normal(": ELBOX Mediator PCI memory window, %d kB\n",
diff -r b69d5e0eb3b9 -r 06d811516614 sys/arch/amiga/pci/empb.c
--- a/sys/arch/amiga/pci/empb.c Thu May 31 21:02:02 2012 +0000
+++ b/sys/arch/amiga/pci/empb.c Thu May 31 21:29:02 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: empb.c,v 1.1 2012/05/30 18:01:51 rkujawa Exp $ */
+/* $NetBSD: empb.c,v 1.2 2012/05/31 21:29:02 rkujawa Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -58,11 +58,14 @@
#include "opt_pci.h"
-/* #define EMPB_DEBUG 1 */
+#define EMPB_DEBUG 1
#define PCI_CONF_LOCK(s) (s) = splhigh()
#define PCI_CONF_UNLOCK(s) splx((s))
+#define WINDOW_LOCK(s) (s) = splhigh()
+#define WINDOW_UNLOCK(s) splx((s))
+
struct empb_softc {
device_t sc_dev;
@@ -75,8 +78,10 @@
bus_space_handle_t pci_confio_h;
uint8_t pci_confio_mode;
- struct bus_space_tag pci_mem_window;
- uint32_t pci_mem_window_size;
+ struct bus_space_tag pci_mem_win;
+ uint32_t pci_mem_win_size;
+ bus_addr_t pci_mem_win_pos;
+ uint16_t pci_mem_win_mask;
struct amiga_pci_chipset apc;
@@ -84,10 +89,12 @@
static int empb_match(struct device *, struct cfdata *, void *);
static void empb_attach(struct device *, struct device *, void *);
+
static void empb_callback(device_t self);
-/*static bool empb_find_mem(struct empb_softc *sc);*/
-void empb_switch_bridge(struct empb_softc *sc, uint8_t mode);
+static void empb_find_mem(struct empb_softc *sc);
+static void empb_switch_bridge(struct empb_softc *sc, uint8_t mode);
+static void empb_switch_window(struct empb_softc *sc, bus_addr_t address);
pcireg_t empb_pci_conf_read(pci_chipset_tag_t, pcitag_t, int);
void empb_pci_conf_write(pci_chipset_tag_t, pcitag_t, int, pcireg_t);
@@ -211,6 +218,16 @@
aprint_error_dev(self,
"couldn't map Mediator setup space\n");
+ empb_find_mem(sc);
+ if (sc->pci_mem_win_size == 0)
+ aprint_error_dev(self,
+ "couldn't find memory space, check your WINDOW jumper\n");
+
+ /* just a test */
+ empb_switch_window(sc, 0x80000000);
+ empb_switch_window(sc, 0x82F00000);
+ empb_switch_window(sc, 0x82000000);
+
/* Initialize the PCI chipset tag. */
sc->apc.pc_conf_v = (void*) pc;
sc->apc.pc_bus_maxdevs = empb_pci_bus_maxdevs;
@@ -236,10 +253,10 @@
pba.pba_pc = pc;
pba.pba_flags = PCI_FLAGS_IO_OKAY;
- /*if(sc->pci_mem_window_size > 0) {
- pba.pba_memt = &(sc->pci_mem_window);
+ if(sc->pci_mem_win_size > 0) {
+ pba.pba_memt = &(sc->pci_mem_win);
pba.pba_flags |= PCI_FLAGS_MEM_OKAY;
- } else */
+ } else
pba.pba_memt = NULL;
pba.pba_bus = 0;
@@ -251,7 +268,7 @@
/*
* Switch between configuration space and I/O space.
*/
-void
+static void
empb_switch_bridge(struct empb_softc *sc, uint8_t mode)
{
bus_space_write_1(sc->setup_area_t, sc->setup_area_h,
@@ -262,24 +279,75 @@
/*
* Try to find a (optional) memory window board.
*/
-/*bool
+static void
empb_find_mem(struct empb_softc *sc)
{
device_t memdev;
struct emmem_softc *mem_sc;
memdev = device_find_by_xname("emmem0");
+ sc->pci_mem_win_size = 0;
- if(memdev == NULL)
- return false;
+ if(memdev == NULL) {
+ return;
+ }
mem_sc = device_private(memdev);
- sc->pci_mem_window.base = (bus_addr_t) mem_sc->sc_base;
- sc->pci_mem_window.absm = &amiga_bus_stride_1;
+ sc->pci_mem_win.base = (bus_addr_t) mem_sc->sc_base;
+ sc->pci_mem_win.absm = &amiga_bus_stride_1;
+
+ sc->pci_mem_win_size = mem_sc->sc_size;
+
+ if(sc->pci_mem_win_size == 8*1024*1024)
+ sc->pci_mem_win_mask = EMPB_WINDOW_MASK_8M;
+ else if(sc->pci_mem_win_size == 4*1024*1024)
+ sc->pci_mem_win_mask = EMPB_WINDOW_MASK_4M;
+ else /* disable anyway */
+ sc->pci_mem_win_size = 0;
+
+#ifdef EMPB_DEBUG
+ aprint_normal("empb: found %x b window at %p, switch mask %x\n",
+ sc->pci_mem_win_size, (void*) sc->pci_mem_win.base,
+ sc->pci_mem_win_mask);
+#endif /* EMPB_DEBUG */
+
+}
- sc->pci_mem_window_size = mem_sc->sc_size;
-}*/
+/*
+ * Switch memory window position.
+ */
+static void
+empb_switch_window(struct empb_softc *sc, bus_addr_t address)
+{
+ int s;
+ uint16_t win_reg;
+
+ WINDOW_LOCK(s);
+
+ win_reg = bswap16((address >> EMPB_WINDOW_SHIFT)
+ & sc->pci_mem_win_mask);
+
+#ifdef EMPB_DEBUG
+ aprint_normal("empb: access to %p window switch to %x (@%p)\n",
+ (void*) address, win_reg, (void*) sc->setup_area_h);
+#endif /* EMPB_DEBUG */
+
+ bus_space_write_2(sc->setup_area_t, sc->setup_area_h,
+ EMPB_SETUP_WINDOW_OFF, win_reg);
+
+ /* store window pos, like: sc->pci_mem_win_pos = win_reg ? */
+
+ win_reg = bus_space_read_2(sc->setup_area_t, sc->setup_area_h,
+ EMPB_SETUP_WINDOW_OFF);
+
+ WINDOW_UNLOCK(s);
+
+#ifdef EMPB_DEBUG
+ aprint_normal("empb: window reg now %x\n", win_reg);
+#endif /* EMPB_DEBUG */
+}
+
pcireg_t
empb_pci_conf_read(pci_chipset_tag_t pc, pcitag_t tag, int reg)
diff -r b69d5e0eb3b9 -r 06d811516614 sys/arch/amiga/pci/empbreg.h
--- a/sys/arch/amiga/pci/empbreg.h Thu May 31 21:02:02 2012 +0000
+++ b/sys/arch/amiga/pci/empbreg.h Thu May 31 21:29:02 2012 +0000
@@ -1,4 +1,4 @@
-/* $NetBSD: empbreg.h,v 1.1 2012/05/30 18:01:51 rkujawa Exp $ */
+/* $NetBSD: empbreg.h,v 1.2 2012/05/31 21:29:02 rkujawa Exp $ */
/*-
* Copyright (c) 2012 The NetBSD Foundation, Inc.
@@ -78,6 +78,10 @@
#define EMPB_CONF_DEV_STRIDE 0x800 /* offset between PCI devices */
#define EMPB_CONF_FUNC_STRIDE 0x100 /* XXX: offset between PCI funcs */
+#define EMPB_WINDOW_SHIFT 0x10
+#define EMPB_WINDOW_MASK_8M 0xFF80
+#define EMPB_WINDOW_MASK_4M 0xFFC0
+
/* All PCI interrupt lines are wired to INT2? */
#define EMPB_INT 2 // XXX: wild guess
Home |
Main Index |
Thread Index |
Old Index