Module Name:    src
Committed By:   macallan
Date:           Sun Nov 18 06:28:39 UTC 2018

Modified Files:
        src/sys/arch/arm/xscale: i80321_space.c

Log Message:
- support *_mmap()
- support BUS_SPACE_MAP_PREFETCHABLE for memory spaces
- fill in *_stream methods if needed
With this Xorg with wsfb works on iyonix. The nv driver still crashes ( and
needs options INSECURE ), something seems to be wrong with accessing IO space.
But, progress.


To generate a diff of this commit:
cvs rdiff -u -r1.15 -r1.16 src/sys/arch/arm/xscale/i80321_space.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/arch/arm/xscale/i80321_space.c
diff -u src/sys/arch/arm/xscale/i80321_space.c:1.15 src/sys/arch/arm/xscale/i80321_space.c:1.16
--- src/sys/arch/arm/xscale/i80321_space.c:1.15	Fri Mar 16 17:56:32 2018
+++ src/sys/arch/arm/xscale/i80321_space.c	Sun Nov 18 06:28:39 2018
@@ -1,4 +1,4 @@
-/*	$NetBSD: i80321_space.c,v 1.15 2018/03/16 17:56:32 ryo Exp $	*/
+/*	$NetBSD: i80321_space.c,v 1.16 2018/11/18 06:28:39 macallan Exp $	*/
 
 /*
  * Copyright (c) 2001, 2002 Wasabi Systems, Inc.
@@ -40,7 +40,7 @@
  */
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: i80321_space.c,v 1.15 2018/03/16 17:56:32 ryo Exp $");
+__KERNEL_RCSID(0, "$NetBSD: i80321_space.c,v 1.16 2018/11/18 06:28:39 macallan Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -94,36 +94,84 @@ const struct bus_space i80321_bs_tag_tem
 	.bs_r_4 = generic_bs_r_4,
 	.bs_r_8 = bs_notimpl_bs_r_8,
 
+#ifdef __BUS_SPACE_HAS_STREAM_METHODS
+	/* read (single, stream) */
+	.bs_r_1_s = generic_bs_r_1,
+	.bs_r_2_s = generic_armv4_bs_r_2,
+	.bs_r_4_s = generic_bs_r_4,
+	.bs_r_8_s = bs_notimpl_bs_r_8,
+#endif
+
 	/* read multiple */
 	.bs_rm_1 = generic_bs_rm_1,
 	.bs_rm_2 = generic_armv4_bs_rm_2,
 	.bs_rm_4 = generic_bs_rm_4,
 	.bs_rm_8 = bs_notimpl_bs_rm_8,
 
+#ifdef __BUS_SPACE_HAS_STREAM_METHODS
+	/* read multiple, stream */
+	.bs_rm_1_s = generic_bs_rm_1,
+	.bs_rm_2_s = generic_armv4_bs_rm_2,
+	.bs_rm_4_s = generic_bs_rm_4,
+	.bs_rm_8_s = bs_notimpl_bs_rm_8,
+#endif
+
 	/* read region */
 	.bs_rr_1 = generic_bs_rr_1,
 	.bs_rr_2 = generic_armv4_bs_rr_2,
 	.bs_rr_4 = generic_bs_rr_4,
 	.bs_rr_8 = bs_notimpl_bs_rr_8,
 
+#ifdef __BUS_SPACE_HAS_STREAM_METHODS
+	/* read region, stream */
+	.bs_rr_1_s = generic_bs_rr_1,
+	.bs_rr_2_s = generic_armv4_bs_rr_2,
+	.bs_rr_4_s = generic_bs_rr_4,
+	.bs_rr_8_s = bs_notimpl_bs_rr_8,
+#endif
+
 	/* write (single) */
 	.bs_w_1 = generic_bs_w_1,
 	.bs_w_2 = generic_armv4_bs_w_2,
 	.bs_w_4 = generic_bs_w_4,
 	.bs_w_8 = bs_notimpl_bs_w_8,
 
+#ifdef __BUS_SPACE_HAS_STREAM_METHODS
+	/* write (single, stream) */
+	.bs_w_1_s = generic_bs_w_1,
+	.bs_w_2_s = generic_armv4_bs_w_2,
+	.bs_w_4_s = generic_bs_w_4,
+	.bs_w_8_s = bs_notimpl_bs_w_8,
+#endif
+
 	/* write multiple */
 	.bs_wm_1 = generic_bs_wm_1,
 	.bs_wm_2 = generic_armv4_bs_wm_2,
 	.bs_wm_4 = generic_bs_wm_4,
 	.bs_wm_8 = bs_notimpl_bs_wm_8,
 
+#ifdef __BUS_SPACE_HAS_STREAM_METHODS
+	/* write multiple, stream */
+	.bs_wm_1_s = generic_bs_wm_1,
+	.bs_wm_2_s = generic_armv4_bs_wm_2,
+	.bs_wm_4_s = generic_bs_wm_4,
+	.bs_wm_8_s = bs_notimpl_bs_wm_8,
+#endif
+
 	/* write region */
 	.bs_wr_1 = generic_bs_wr_1,
 	.bs_wr_2 = generic_armv4_bs_wr_2,
 	.bs_wr_4 = generic_bs_wr_4,
 	.bs_wr_8 = bs_notimpl_bs_wr_8,
 
+#ifdef __BUS_SPACE_HAS_STREAM_METHODS
+	/* write region, stream */
+	.bs_wr_1_s = generic_bs_wr_1,
+	.bs_wr_2_s = generic_armv4_bs_wr_2,
+	.bs_wr_4_s = generic_bs_wr_4,
+	.bs_wr_8_s = bs_notimpl_bs_wr_8,
+#endif
+
 	/* set multiple */
 	.bs_sm_1 = bs_notimpl_bs_sm_1,
 	.bs_sm_2 = bs_notimpl_bs_sm_2,
@@ -164,6 +212,7 @@ i80321_io_bs_init(bus_space_tag_t bs, vo
 	bs->bs_free = i80321_io_bs_free;
 
 	bs->bs_vaddr = i80321_io_bs_vaddr;
+	bs->bs_mmap = i80321_io_bs_mmap;
 }
 
 void
@@ -177,7 +226,6 @@ i80321_mem_bs_init(bus_space_tag_t bs, v
 	bs->bs_unmap = i80321_mem_bs_unmap;
 	bs->bs_alloc = i80321_mem_bs_alloc;
 	bs->bs_free = i80321_mem_bs_free;
-
 	bs->bs_mmap = i80321_mem_bs_mmap;
 }
 
@@ -245,6 +293,25 @@ i80321_io_bs_map(void *t, bus_addr_t bpa
 	return (0);
 }
 
+paddr_t
+i80321_io_bs_mmap(void *t, bus_addr_t addr, off_t off, int prot, int flags)
+{
+	struct i80321_softc *sc = t;
+	paddr_t bpa = addr + off, winpaddr, busbase;
+
+	if (bpa >= sc->sc_ioout_xlate &&
+	    bpa < (sc->sc_ioout_xlate + VERDE_OUT_XLATE_IO_WIN_SIZE)) {
+		busbase = sc->sc_ioout_xlate;
+		winpaddr = VERDE_OUT_XLATE_IO_WIN0_BASE;		
+	} else
+		return (EINVAL);
+
+	if ((bpa) >= (busbase + VERDE_OUT_XLATE_IO_WIN_SIZE))
+		return (EINVAL);
+
+	return (arm_btop(winpaddr + (bpa - busbase)));
+}
+
 void
 i80321_io_bs_unmap(void *t, bus_space_handle_t bsh, bus_size_t size)
 {
@@ -334,7 +401,9 @@ i80321_mem_bs_map(void *t, bus_addr_t bp
 	for (; pa < endpa; pa += PAGE_SIZE, va += PAGE_SIZE) {
 		pmap_enter(pmap_kernel(), va, pa,
 		    VM_PROT_READ | VM_PROT_WRITE,
-		    VM_PROT_READ | VM_PROT_WRITE | PMAP_WIRED);
+		    VM_PROT_READ | VM_PROT_WRITE | PMAP_WIRED |
+		    ((flags & BUS_SPACE_MAP_PREFETCHABLE) ?
+		       ARM_MMAP_WRITECOMBINE : 0));
 	}
 	pmap_update(pmap_kernel());
 
@@ -375,7 +444,40 @@ i80321_mem_bs_free(void *t, bus_space_ha
 paddr_t
 i80321_mem_bs_mmap(void *t, bus_addr_t addr, off_t off, int prot, int flags)
 {
+#ifndef I80321_USE_DIRECT_WIN
+	struct i80321_softc *sc = t;
+#endif
+	uint32_t busbase;
+	paddr_t pa, physbase, bpa = addr + off, pflags = 0;
 
-	/* XXX */
-	return (-1);
+#ifdef I80321_USE_DIRECT_WIN
+	if (
+#if VERDE_OUT_DIRECT_WIN_BASE != 0
+	    bpa >= (VERDE_OUT_DIRECT_WIN_BASE) &&
+#endif
+	    bpa < (VERDE_OUT_DIRECT_WIN_BASE + VERDE_OUT_DIRECT_WIN_SIZE)) {
+		busbase = VERDE_OUT_DIRECT_WIN_BASE;
+		physbase = VERDE_OUT_DIRECT_WIN_BASE;
+	} else
+		return (EINVAL);
+	if (bpa >= (VERDE_OUT_DIRECT_WIN_BASE +
+	    VERDE_OUT_DIRECT_WIN_SIZE))
+		return (EINVAL);
+#else
+	if (bpa >= sc->sc_owin[0].owin_xlate_lo &&
+	    bpa < (sc->sc_owin[0].owin_xlate_lo +
+		   VERDE_OUT_XLATE_MEM_WIN_SIZE)) {
+		busbase = sc->sc_owin[0].owin_xlate_lo;
+		physbase = sc->sc_iwin[1].iwin_xlate;
+	} else
+		return (EINVAL);
+	if (bpa >= (busbase + VERDE_OUT_XLATE_MEM_WIN_SIZE))
+		return (EINVAL);
+#endif
+
+	pa = trunc_page((bpa - busbase) + physbase);
+	if (flags & BUS_SPACE_MAP_PREFETCHABLE) {
+		pflags = ARM_MMAP_WRITECOMBINE;
+	}
+	return (arm_btop(pa) | pflags);
 }

Reply via email to