Index: broadcom/bcm283x_platform.c
===================================================================
RCS file: /cvsroot/src/sys/arch/arm/broadcom/bcm283x_platform.c,v
retrieving revision 1.23
diff -p -u -r1.23 bcm283x_platform.c
--- broadcom/bcm283x_platform.c	3 Jan 2019 12:52:40 -0000	1.23
+++ broadcom/bcm283x_platform.c	20 Jan 2019 09:47:06 -0000
@@ -119,8 +119,17 @@ void bcmgenfb_set_ioctl(int(*)(void *, v
 extern void bcmgenfb_ddb_trap_callback(int where);
 static int rpi_ioctl(void *, void *, u_long, void *, int, lwp_t *);
 
+#if defined(__aarch64__)
+extern struct bus_space aarch64_generic_dsb_bs_tag;
+extern struct bus_space aarch64_generic_a4x_dsb_bs_tag;
+#define ARM_GENERIC_BS_TAG aarch64_generic_dsb_bs_tag
+#define ARM_GENERIC_A4X_BS_TAG aarch64_generic_a4x_dsb_bs_tag
+#else
 extern struct bus_space arm_generic_bs_tag;
 extern struct bus_space arm_generic_a4x_bs_tag;
+#define ARM_GENERIC_BS_TAG arm_generic_bs_tag
+#define ARM_GENERIC_A4X_BS_TAG arm_generic_a4x_bs_tag
+#endif
 
 /* Prototypes for all the bus_space structure functions */
 bs_protos(arm_generic);
@@ -153,6 +162,7 @@ bcm2835_bus_to_phys(bus_addr_t ba)
 	    ba < BCM2835_PERIPHERALS_BASE_BUS + BCM2835_PERIPHERALS_SIZE)
 		return BCM2835_PERIPHERALS_BUS_TO_PHYS(ba);
 
+printf("%s: %lx\n",__func__,ba);
 	return ba & ~BCM2835_BUSADDR_CACHE_MASK;
 }
 
@@ -169,6 +179,7 @@ bcm2836_bus_to_phys(bus_addr_t ba)
 	    ba < BCM2836_ARM_LOCAL_BASE + BCM2836_ARM_LOCAL_SIZE)
 		return ba;
 
+printf("%s: %lx\n",__func__,ba);
 	return ba & ~BCM2835_BUSADDR_CACHE_MASK;
 }
 
@@ -178,7 +189,7 @@ bcm2835_bs_map(void *t, bus_addr_t ba, b
 {
 	const paddr_t pa = bcm2835_bus_to_phys(ba);
 
-	return bus_space_map(&arm_generic_bs_tag, pa, size, flag, bshp);
+	return bus_space_map(&ARM_GENERIC_BS_TAG, pa, size, flag, bshp);
 }
 
 paddr_t
@@ -186,7 +197,7 @@ bcm2835_bs_mmap(void *t, bus_addr_t ba, 
 {
 	const paddr_t pa = bcm2835_bus_to_phys(ba);
 
-	return bus_space_mmap(&arm_generic_bs_tag, pa, offset, prot, flags);
+	return bus_space_mmap(&ARM_GENERIC_BS_TAG, pa, offset, prot, flags);
 }
 
 paddr_t
@@ -202,7 +213,7 @@ bcm2836_bs_map(void *t, bus_addr_t ba, b
 {
 	const paddr_t pa = bcm2836_bus_to_phys(ba);
 
-	return bus_space_map(&arm_generic_bs_tag, pa, size, flag, bshp);
+	return bus_space_map(&ARM_GENERIC_BS_TAG, pa, size, flag, bshp);
 }
 
 paddr_t
@@ -210,7 +221,7 @@ bcm2836_bs_mmap(void *t, bus_addr_t ba, 
 {
 	const paddr_t pa = bcm2836_bus_to_phys(ba);
 
-	return bus_space_mmap(&arm_generic_bs_tag, pa, offset, prot, flags);
+	return bus_space_mmap(&ARM_GENERIC_BS_TAG, pa, offset, prot, flags);
 }
 
 paddr_t
@@ -257,13 +268,14 @@ bcm2836_platform_devmap(void)
 	static const struct pmap_devmap devmap[] = {
 		DEVMAP_ENTRY(BCM2836_PERIPHERALS_VBASE, BCM2836_PERIPHERALS_BASE,
 		    BCM2835_PERIPHERALS_SIZE),	/* 16Mb */
-
+#if 1
 		DEVMAP_ENTRY(BCM2836_ARM_LOCAL_VBASE, BCM2836_ARM_LOCAL_BASE,
 		    BCM2836_ARM_LOCAL_SIZE),
+#endif
 #if defined(MULTIPROCESSOR) && defined(__aarch64__)
 		/* for fdt cpu spin-table */
-		DEVMAP_ENTRY(BCM2836_ARM_SMP_VBASE, BCM2836_ARM_SMP_BASE,
-		    BCM2836_ARM_SMP_SIZE),
+		DEVMAP_ENTRY_PAGES(BCM2836_ARM_SMP_VBASE, BCM2836_ARM_SMP_BASE,
+		BCM2836_ARM_SMP_SIZE),
 #endif
 		DEVMAP_ENTRY_END
 	};
@@ -1080,6 +1092,87 @@ rpi_ioctl(void *v, void *vs, u_long cmd,
 
 #endif
 
+static struct rpi_info {
+        int model, pcbrev, memsize, manufacturer, processor, warranty;
+} revtbl[] = {
+	{ -1, },
+	{ -1, },
+	{ RPI_MODEL_B, 1, RPI_MEMSIZE_256, -1, },
+	{ RPI_MODEL_B, 1, RPI_MEMSIZE_256, -1, },
+	{ RPI_MODEL_B, 2, RPI_MEMSIZE_256, RPI_MANUF_SONY, },
+	{ RPI_MODEL_B, 2, RPI_MEMSIZE_256, RPI_MANUF_QISDA, },
+	{ RPI_MODEL_B, 2, RPI_MEMSIZE_256, RPI_MANUF_EGOMAN, },
+	{ RPI_MODEL_A, 2, RPI_MEMSIZE_256, RPI_MANUF_EGOMAN, },
+	{ RPI_MODEL_A, 2, RPI_MEMSIZE_256, RPI_MANUF_SONY, },
+	{ RPI_MODEL_A, 2, RPI_MEMSIZE_256, RPI_MANUF_QISDA, },
+	{ -1, },
+	{ -1, },
+	{ -1, },
+	{ RPI_MODEL_B,       2, RPI_MEMSIZE_512, RPI_MANUF_EGOMAN, },
+	{ RPI_MODEL_B,       2, RPI_MEMSIZE_512, RPI_MANUF_SONY, },
+	{ RPI_MODEL_B,       2, RPI_MEMSIZE_512, RPI_MANUF_QISDA, },
+	{ RPI_MODEL_B_PLUS,  1, RPI_MEMSIZE_512, RPI_MANUF_SONY, },
+	{ RPI_MODEL_COMPUTE, 1, RPI_MEMSIZE_512, RPI_MANUF_SONY, },
+	{ RPI_MODEL_A_PLUS,  1, RPI_MEMSIZE_256, RPI_MANUF_SONY, },
+	{ RPI_MODEL_B_PLUS,  1, RPI_MEMSIZE_512, RPI_MANUF_EMBEST, },
+	{ RPI_MODEL_COMPUTE, 1, RPI_MEMSIZE_512, RPI_MANUF_SONY, },
+	{ RPI_MODEL_A_PLUS,  1, RPI_MEMSIZE_256, RPI_MANUF_SONY, }
+};
+
+static void
+rev2info(unsigned rev, struct rpi_info *info)
+{
+
+	if (rev & VCPROP_REV_ENCFLAG) {
+		info->pcbrev       = __SHIFTOUT(rev, VCPROP_REV_PCBREV),
+		info->model        = __SHIFTOUT(rev, VCPROP_REV_MODEL),
+		info->processor    = __SHIFTOUT(rev, VCPROP_REV_PROCESSOR),
+		info->manufacturer = __SHIFTOUT(rev, VCPROP_REV_MANUF),
+		info->memsize      = __SHIFTOUT(rev, VCPROP_REV_MEMSIZE),
+		info->warranty     = __SHIFTOUT(rev, VCPROP_REV_WARRANTY);
+	} else if (rev < __arraycount(revtbl)) {
+		info->pcbrev       = revtbl[rev].pcbrev;
+		info->model        = revtbl[rev].model;
+		info->processor    = RPI_PROCESSOR_BCM2835;
+		info->manufacturer = revtbl[rev].manufacturer;
+		info->memsize      = revtbl[rev].memsize;
+		info->warranty     = __SHIFTOUT(rev, VCPROP_REV_WARRANTY);
+	} else {
+		info->pcbrev       = -1;
+		info->model        = -1;
+		info->processor    = -1;
+		info->manufacturer = -1;
+		info->memsize      = -1;
+		info->warranty     = __SHIFTOUT(rev, VCPROP_REV_WARRANTY);
+	}
+}
+
+static int
+rpi_boardinfo_helper(SYSCTLFN_ARGS)
+{
+	struct rpi_info info;
+	char buf[100];
+	int error;
+
+	rev2info(vb.vbt_boardrev.rev, &info);
+
+	snprintf(buf, sizeof(buf),
+		"pcbrev:%d model:%d processor:%d manufacturer:%d"
+		" memsize:%d warrantyvoid:%d",
+		info.pcbrev,
+		info.model,
+		info.processor,
+		info.manufacturer,
+		info.memsize,
+		info.warranty);
+
+	if (oldp && (error = copyoutstr(buf, oldp, sizeof(buf), NULL)) != 0)
+		return error;
+
+	*oldlenp = strlen(buf)+1;
+	return 0;
+}
+
 SYSCTL_SETUP(sysctl_machdep_rpi, "sysctl machdep subtree setup (rpi)")
 {
 	sysctl_createv(clog, 0, NULL, NULL,
@@ -1105,6 +1198,12 @@ SYSCTL_SETUP(sysctl_machdep_rpi, "sysctl
 	    CTLFLAG_PERMANENT|CTLFLAG_READONLY|CTLFLAG_HEX|CTLFLAG_PRIVATE,
 	    CTLTYPE_QUAD, "serial", NULL, NULL, 0,
 	    &vb.vbt_serial.sn, 0, CTL_MACHDEP, CTL_CREATE, CTL_EOL);
+
+	sysctl_createv(clog, 0, NULL, NULL,
+	    CTLFLAG_PERMANENT|CTLFLAG_READONLY,
+	    CTLTYPE_STRING, "board_info", "RPI Board Information",
+	    rpi_boardinfo_helper, 0,
+	    NULL, 0, CTL_MACHDEP, CTL_CREATE, CTL_EOL);
 }
 
 #if defined(SOC_BCM2835)
@@ -1112,8 +1211,8 @@ static void
 bcm2835_platform_bootstrap(void)
 {
 
-	bcm2835_bs_tag = arm_generic_bs_tag;
-	bcm2835_a4x_bs_tag = arm_generic_a4x_bs_tag;
+	bcm2835_bs_tag = ARM_GENERIC_BS_TAG;
+	bcm2835_a4x_bs_tag = ARM_GENERIC_A4X_BS_TAG;
 
 	bcm2835_bs_tag.bs_map = bcm2835_bs_map;
 	bcm2835_bs_tag.bs_mmap = bcm2835_bs_mmap;
@@ -1133,8 +1232,8 @@ static void
 bcm2836_platform_bootstrap(void)
 {
 
-	bcm2836_bs_tag = arm_generic_bs_tag;
-	bcm2836_a4x_bs_tag = arm_generic_a4x_bs_tag;
+	bcm2836_bs_tag = ARM_GENERIC_BS_TAG;
+	bcm2836_a4x_bs_tag = ARM_GENERIC_A4X_BS_TAG;
 
 	bcm2836_bs_tag.bs_map = bcm2836_bs_map;
 	bcm2836_bs_tag.bs_mmap = bcm2836_bs_mmap;
