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;