socsvn commit: r269650 - in soc2014/astarasikov/head/sys: arm/conf arm/goldfish boot/fdt/dts/arm
astarasikov at FreeBSD.org
astarasikov at FreeBSD.org
Mon Jun 16 21:43:04 UTC 2014
Author: astarasikov
Date: Mon Jun 16 21:43:02 2014
New Revision: 269650
URL: http://svnweb.FreeBSD.org/socsvn/?view=rev&rev=269650
Log:
arm: add GOLDFISH board (Android Emulator)
Added:
soc2014/astarasikov/head/sys/arm/conf/GOLDFISH
soc2014/astarasikov/head/sys/arm/goldfish/
soc2014/astarasikov/head/sys/arm/goldfish/files.goldfish
soc2014/astarasikov/head/sys/arm/goldfish/goldfish_fb.c
soc2014/astarasikov/head/sys/arm/goldfish/goldfish_machdep.c
soc2014/astarasikov/head/sys/arm/goldfish/goldfish_mmc.c
soc2014/astarasikov/head/sys/arm/goldfish/goldfish_nand.c
soc2014/astarasikov/head/sys/arm/goldfish/goldfish_pdev.c
soc2014/astarasikov/head/sys/arm/goldfish/goldfish_pic.c
soc2014/astarasikov/head/sys/arm/goldfish/goldfish_timer.c
soc2014/astarasikov/head/sys/arm/goldfish/goldfish_uart.c
soc2014/astarasikov/head/sys/arm/goldfish/if_smc_fdt.c
soc2014/astarasikov/head/sys/boot/fdt/dts/arm/goldfish.dts
Added: soc2014/astarasikov/head/sys/arm/conf/GOLDFISH
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2014/astarasikov/head/sys/arm/conf/GOLDFISH Mon Jun 16 21:43:02 2014 (r269650)
@@ -0,0 +1,112 @@
+# GOLDFISH - Configuration for QEMU version of Versatile Platform Board
+#
+# For more information on this file, please read the handbook section on
+# Kernel Configuration Files:
+#
+# http://www.FreeBSD.org/doc/en_US.ISO8859-1/books/handbook/kernelconfig-config.html
+#
+# The handbook is also available locally in /usr/share/doc/handbook
+# if you've installed the doc distribution, otherwise always see the
+# FreeBSD World Wide Web server (http://www.FreeBSD.org/) for the
+# latest information.
+#
+# An exhaustive list of options and more detailed explanations of the
+# device lines is also present in the ../../conf/NOTES and NOTES files.
+# If you are in doubt as to the purpose or necessity of a line, check first
+# in NOTES.
+#
+# $FreeBSD: release/10.0.0/sys/arm/conf/GOLDFISH 254902 2013-08-26 10:27:15Z andrew $
+
+ident GOLDFISH
+
+cpu CPU_CORTEXA
+machine arm armv6
+makeoptions ARM_LITTLE_ENDIAN
+
+files "../goldfish/files.goldfish"
+makeoptions MODULES_OVERRIDE=""
+
+options KERNVIRTADDR=0xc0100000
+makeoptions KERNVIRTADDR=0xc0100000
+options KERNPHYSADDR=0x00100000
+makeoptions KERNPHYSADDR=0x00100000
+options PHYSADDR=0x00000000
+options STARTUP_PAGETABLE_ADDR=0x01000000
+options FREEBSD_BOOT_LOADER
+options LINUX_BOOT_ABI
+
+makeoptions DEBUG=-g #Build kernel with gdb(1) debug symbols
+options HZ=100
+
+options SCHED_4BSD #4BSD scheduler
+options INET #InterNETworking
+options FFS #Berkeley Fast Filesystem
+options SOFTUPDATES #Enable FFS soft updates support
+options UFS_ACL #Support for access control lists
+options UFS_DIRHASH #Improve performance on big directories
+device snp
+
+options PSEUDOFS #Pseudo-filesystem framework
+options COMPAT_43 #Compatible with BSD 4.3 [KEEP THIS!]
+options SCSI_DELAY=5000 #Delay (in ms) before probing SCSI
+options KTRACE #ktrace(1) support
+options SYSVSHM #SYSV-style shared memory
+options SYSVMSG #SYSV-style message queues
+options SYSVSEM #SYSV-style semaphores
+options _KPOSIX_PRIORITY_SCHEDULING #Posix P1003_1B real-time extensions
+options KBD_INSTALL_CDEV # install a CDEV entry in /dev
+options ROOTDEVNAME=\"ufs:da0s1a\"
+options VFP # vfp/neon
+
+options PREEMPTION
+
+device bpf
+device loop
+
+# Ethernet
+device ether
+device mii
+device mii_bitbang
+device smc
+device smcphy
+
+# Serial
+device uart
+device pty
+
+# NOTE: serial console is disabled if syscons enabled
+# Comment following lines for headless setup
+device sc
+device kbdmux
+options SC_DFLT_FONT # compile font in
+makeoptions SC_DFLT_FONT=cp437
+
+options KDB
+options DDB #Enable the kernel debugger
+options VERBOSE_SYSINIT
+options DIAGNOSTIC
+#options INVARIANTS #Enable calls of extra sanity checking
+#options INVARIANT_SUPPORT #Extra sanity checks of internal structures, required by INVARIANTS
+
+device md
+device random # Entropy device
+
+# Flattened Device Tree
+options FDT
+options FDT_DTB_STATIC
+makeoptions FDT_DTS_FILE=goldfish.dts
+
+#options MD_ROOT
+#options MD_ROOT_SIZE=5120
+#makeoptions MFS_IMAGE=/root/handhelds/myroot.img
+#options ROOTDEVNAME=\"/dev/md0\"
+
+#boot from NFS
+#options NFSCL
+#options NFSCLIENT
+#options NFS_ROOT
+#options BOOTP_COMPAT
+#options BOOTP
+#options BOOTP_NFSV3
+#options BOOTP_WIRED_TO=smc0
+#options ROOTDEVNAME=\"nfs:192.168.1.51:/srv/nfs3/bsd/\"
Added: soc2014/astarasikov/head/sys/arm/goldfish/files.goldfish
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2014/astarasikov/head/sys/arm/goldfish/files.goldfish Mon Jun 16 21:43:02 2014 (r269650)
@@ -0,0 +1,19 @@
+arm/arm/bus_space_asm_generic.S standard
+arm/arm/bus_space_generic.c standard
+arm/arm/bus_space-v6.c standard
+arm/arm/cpufunc_asm_armv5.S standard
+arm/arm/cpufunc_asm_arm11.S standard
+arm/arm/cpufunc_asm_armv7.S standard
+
+arm/arm/irq_dispatch.S standard
+kern/kern_clocksource.c standard
+
+arm/goldfish/goldfish_fb.c optional sc
+arm/goldfish/goldfish_machdep.c standard
+arm/goldfish/goldfish_mmc.c standard
+arm/goldfish/goldfish_nand.c standard
+arm/goldfish/goldfish_pic.c standard
+arm/goldfish/goldfish_pdev.c standard
+arm/goldfish/goldfish_timer.c standard
+arm/goldfish/goldfish_uart.c standard
+arm/goldfish/if_smc_fdt.c optional smc
Added: soc2014/astarasikov/head/sys/arm/goldfish/goldfish_fb.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2014/astarasikov/head/sys/arm/goldfish/goldfish_fb.c Mon Jun 16 21:43:02 2014 (r269650)
@@ -0,0 +1,683 @@
+/*-
+ * Copyright (c) 2014 Alexander Tarasikov <alexander.tarasikov at gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/malloc.h>
+#include <sys/rman.h>
+#include <sys/timetc.h>
+#include <machine/bus.h>
+#include <machine/intr.h>
+
+#include <sys/fbio.h>
+#include <machine/frame.h>
+#include <sys/consio.h>
+
+#include <dev/fb/fbreg.h>
+#include <dev/syscons/syscons.h>
+
+#include <dev/fdt/fdt_common.h>
+#include <dev/ofw/openfirm.h>
+
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
+/******************************************************************************
+ * virtual MMIO framebuffer device
+ *****************************************************************************/
+enum {
+ FONT_HEIGHT = 16,
+};
+
+enum android_hal_pixel_format {
+ /* default one, unless set explicitely by android's libcopyb it.
+ * they probably do it via qemu socket, because there is no register
+ * to control pixel format in the virtual framebuffer device */
+ HAL_PIXEL_FORMAT_RGB_565 = 4,
+};
+
+enum goldfish_fbio_regs {
+ GOLDFISH_FB_WIDTH = 0x0,
+ GOLDFISH_FB_HEIGHT = 0x4,
+ GOLDFISH_FB_FORMAT = 0x24,
+
+ GOLDFISH_FB_SET_INT_ENABLE = 0x0c,
+ GOLDFISH_FB_SET_BASE = 0x10,
+ GOLDFISH_FB_SET_BLANK = 0x18,
+};
+
+enum goldfish_int_bits {
+ FB_INT_BASE_UPDATE_DONE = 1U << 1,
+};
+
+struct goldfish_fbio_softc {
+ struct resource * li_res;
+ bus_space_tag_t li_bst;
+ bus_space_handle_t li_bsh;
+ struct resource* irq_res;
+ void* intr_hl;
+};
+
+struct video_adapter_softc {
+ /* Videoadpater part */
+ video_adapter_t va;
+
+ intptr_t fb_vaddr;
+ intptr_t fb_paddr;
+ unsigned int fb_size;
+
+ int bpp;
+ int depth;
+ unsigned int height;
+ unsigned int width;
+ unsigned int stride;
+
+ unsigned int xmargin;
+ unsigned int ymargin;
+
+ unsigned char *font;
+ int initialized;
+};
+
+static uint16_t colors[16] = {
+ 0x0000, /* black */
+ 0x001f, /* blue */
+ 0x07e0, /* green */
+ 0x07ff, /* cyan */
+ 0xf800, /* red */
+ 0xf81f, /* magenta */
+ 0x3800, /* brown */
+ 0xc618, /* light grey */
+ 0xc618, /* XXX: dark grey */
+ 0x001f, /* XXX: light blue */
+ 0x07e0, /* XXX: light green */
+ 0x07ff, /* XXX: light cyan */
+ 0xf800, /* XXX: light red */
+ 0xf81f, /* XXX: light magenta */
+ 0xffe0, /* yellow */
+ 0xffff, /* white */
+};
+
+static int goldfish_fbio_probe(device_t);
+static int goldfish_fbio_attach(device_t);
+
+static struct goldfish_fbio_softc *fb_softc = NULL;
+static struct video_adapter_softc va_softc;
+
+#define fb_read_4(reg) \
+ bus_space_read_4(fb_softc->li_bst, fb_softc->li_bsh, reg)
+#define fb_write_4(reg, val) \
+ bus_space_write_4(fb_softc->li_bst, fb_softc->li_bsh, reg, val)
+
+static int goldfish_fbio_probe(device_t dev)
+{
+ if (!ofw_bus_is_compatible(dev, "arm,goldfish-fbio"))
+ return (ENXIO);
+ device_set_desc(dev, "Goldfish Framebuffer");
+
+ return (BUS_PROBE_DEFAULT);
+}
+
+static int
+goldfish_fbio_intr(void *arg)
+{
+ return (FILTER_HANDLED);
+}
+
+#define TT printf("%s: %d\n", __func__, __LINE__)
+
+static int
+goldfish_fbio_attach(device_t dev)
+{
+ struct goldfish_fbio_softc *sc = device_get_softc(dev);
+ int li_rid = 0, irq_rid = 0;
+ size_t fbmem_size = 0;
+ uint32_t format = 0;
+
+ if (fb_softc)
+ return (ENXIO);
+
+ sc->li_res = bus_alloc_resource_any(dev, SYS_RES_MEMORY, &li_rid, RF_ACTIVE);
+ if (!sc->li_res)
+ goto fail;
+
+ sc->irq_res = bus_alloc_resource_any(dev, SYS_RES_IRQ, &irq_rid, RF_ACTIVE);
+ if (!sc->irq_res)
+ goto fail;
+
+ if (bus_setup_intr(dev, sc->irq_res, INTR_TYPE_MISC,
+ goldfish_fbio_intr, NULL, sc, &sc->intr_hl) != 0)
+ goto fail;
+
+ sc->li_bst = rman_get_bustag(sc->li_res);
+ sc->li_bsh = rman_get_bushandle(sc->li_res);
+ fb_softc = sc;
+
+ format = fb_read_4(GOLDFISH_FB_FORMAT);
+ if (format != HAL_PIXEL_FORMAT_RGB_565) {
+ device_printf(dev, "unsupported pixel format %d\n", format);
+ TT;
+ goto fail;
+ }
+
+ va_softc.width = fb_read_4(GOLDFISH_FB_WIDTH);
+ va_softc.height = fb_read_4(GOLDFISH_FB_HEIGHT);
+ va_softc.bpp = 2;
+ va_softc.depth = 8 * va_softc.bpp;
+ va_softc.stride = va_softc.bpp * va_softc.width;
+
+ fbmem_size = round_page(va_softc.width * va_softc.height * va_softc.bpp);
+ va_softc.fb_vaddr = (uint32_t)contigmalloc(fbmem_size, M_DEVBUF, M_ZERO,
+ 0, ~0, PAGE_SIZE, 0);
+ if (!va_softc.fb_vaddr) {
+ TT;
+ goto fail;
+ }
+ va_softc.fb_paddr = vtophys(va_softc.fb_vaddr);
+
+#if 1
+ int err = ENXIO;
+ err = sc_attach_unit(device_get_unit(dev),
+ device_get_flags(dev) | SC_AUTODETECT_KBD);
+ if (err) {
+ device_printf(dev, "failed to attach syscons\n");
+ TT;
+ //goto fail;
+ }
+#endif
+
+ fb_write_4(GOLDFISH_FB_SET_BASE, va_softc.fb_paddr);
+ fb_write_4(GOLDFISH_FB_SET_BLANK, 0);
+ fb_write_4(GOLDFISH_FB_SET_INT_ENABLE, FB_INT_BASE_UPDATE_DONE);
+ memset((void*)va_softc.fb_vaddr, 0xff, fbmem_size);
+
+ return (0);
+
+fail:
+ if (sc->irq_res)
+ bus_release_resource(dev, SYS_RES_IRQ, irq_rid, sc->irq_res);
+
+ if (sc->li_res)
+ bus_release_resource(dev, SYS_RES_MEMORY, li_rid, sc->li_res);
+
+ return (ENXIO);
+}
+
+static device_method_t goldfish_fbio_methods[] = {
+ DEVMETHOD(device_probe, goldfish_fbio_probe),
+ DEVMETHOD(device_attach, goldfish_fbio_attach),
+ DEVMETHOD_END
+};
+
+static driver_t goldfish_fbio_driver = {
+ "goldfish_fbio",
+ goldfish_fbio_methods,
+ sizeof(struct goldfish_fbio_softc),
+};
+
+static devclass_t goldfish_fbio_devclass;
+DRIVER_MODULE(goldfish_fbio, fdtbus, goldfish_fbio_driver, goldfish_fbio_devclass, 0, 0);
+MODULE_DEPEND(goldfish_fbio, syscons, 1, 1, 1);
+
+/******************************************************************************
+ * video_adapter_t implementation
+ *****************************************************************************/
+/*
+ * Video driver routines and glue.
+ */
+static int goldfish_fb_configure(int);
+static vi_probe_t goldfish_fb_probe;
+static vi_init_t goldfish_fb_init;
+static vi_get_info_t goldfish_fb_get_info;
+static vi_query_mode_t goldfish_fb_query_mode;
+static vi_set_mode_t goldfish_fb_set_mode;
+static vi_save_font_t goldfish_fb_save_font;
+static vi_load_font_t goldfish_fb_load_font;
+static vi_show_font_t goldfish_fb_show_font;
+static vi_save_palette_t goldfish_fb_save_palette;
+static vi_load_palette_t goldfish_fb_load_palette;
+static vi_set_border_t goldfish_fb_set_border;
+static vi_save_state_t goldfish_fb_save_state;
+static vi_load_state_t goldfish_fb_load_state;
+static vi_set_win_org_t goldfish_fb_set_win_org;
+static vi_read_hw_cursor_t goldfish_fb_read_hw_cursor;
+static vi_set_hw_cursor_t goldfish_fb_set_hw_cursor;
+static vi_set_hw_cursor_shape_t goldfish_fb_set_hw_cursor_shape;
+static vi_blank_display_t goldfish_fb_blank_display;
+static vi_mmap_t goldfish_fb_mmap;
+static vi_ioctl_t goldfish_fb_ioctl;
+static vi_clear_t goldfish_fb_clear;
+static vi_fill_rect_t goldfish_fb_fill_rect;
+static vi_bitblt_t goldfish_fb_bitblt;
+static vi_diag_t goldfish_fb_diag;
+static vi_save_cursor_palette_t goldfish_fb_save_cursor_palette;
+static vi_load_cursor_palette_t goldfish_fb_load_cursor_palette;
+static vi_copy_t goldfish_fb_copy;
+static vi_putp_t goldfish_fb_putp;
+static vi_putc_t goldfish_fb_putc;
+static vi_puts_t goldfish_fb_puts;
+static vi_putm_t goldfish_fb_putm;
+
+static video_switch_t goldfish_fbvidsw = {
+ .probe = goldfish_fb_probe,
+ .init = goldfish_fb_init,
+ .get_info = goldfish_fb_get_info,
+ .query_mode = goldfish_fb_query_mode,
+ .set_mode = goldfish_fb_set_mode,
+ .save_font = goldfish_fb_save_font,
+ .load_font = goldfish_fb_load_font,
+ .show_font = goldfish_fb_show_font,
+ .save_palette = goldfish_fb_save_palette,
+ .load_palette = goldfish_fb_load_palette,
+ .set_border = goldfish_fb_set_border,
+ .save_state = goldfish_fb_save_state,
+ .load_state = goldfish_fb_load_state,
+ .set_win_org = goldfish_fb_set_win_org,
+ .read_hw_cursor = goldfish_fb_read_hw_cursor,
+ .set_hw_cursor = goldfish_fb_set_hw_cursor,
+ .set_hw_cursor_shape = goldfish_fb_set_hw_cursor_shape,
+ .blank_display = goldfish_fb_blank_display,
+ .mmap = goldfish_fb_mmap,
+ .ioctl = goldfish_fb_ioctl,
+ .clear = goldfish_fb_clear,
+ .fill_rect = goldfish_fb_fill_rect,
+ .bitblt = goldfish_fb_bitblt,
+ .diag = goldfish_fb_diag,
+ .save_cursor_palette = goldfish_fb_save_cursor_palette,
+ .load_cursor_palette = goldfish_fb_load_cursor_palette,
+ .copy = goldfish_fb_copy,
+ .putp = goldfish_fb_putp,
+ .putc = goldfish_fb_putc,
+ .puts = goldfish_fb_puts,
+ .putm = goldfish_fb_putm,
+};
+
+VIDEO_DRIVER(goldfish_fb, goldfish_fbvidsw, goldfish_fb_configure);
+
+extern sc_rndr_sw_t txtrndrsw;
+RENDERER(goldfish_fb, 0, txtrndrsw, gfb_set);
+RENDERER_MODULE(goldfish_fb, gfb_set);
+
+static uint16_t goldfish_fb_static_window[ROW*COL];
+extern u_char dflt_font_16[];
+
+static int
+goldfish_fb_configure(int flags)
+{
+ struct video_adapter_softc *sc;
+
+ sc = &va_softc;
+
+ if (sc->initialized || !fb_softc)
+ return 0;
+
+ goldfish_fb_init(0, &sc->va, 0);
+
+ sc->initialized = 1;
+
+ return (0);
+}
+
+static int
+goldfish_fb_probe(int unit, video_adapter_t **adp, void *arg, int flags)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_init(int unit, video_adapter_t *adp, int flags)
+{
+ struct video_adapter_softc *sc;
+ video_info_t *vi;
+
+ sc = (struct video_adapter_softc *)adp;
+ vi = &adp->va_info;
+
+ vid_init_struct(adp, "goldfish_fb", -1, unit);
+
+ sc->font = dflt_font_16;
+ vi->vi_cheight = FONT_HEIGHT;
+ vi->vi_cwidth = 8;
+ vi->vi_width = sc->width/8;
+ vi->vi_height = sc->height/vi->vi_cheight;
+
+ /*
+ * Clamp width/height to syscons maximums
+ */
+ if (vi->vi_width > COL)
+ vi->vi_width = COL;
+ if (vi->vi_height > ROW)
+ vi->vi_height = ROW;
+
+ sc->xmargin = (sc->width - (vi->vi_width * vi->vi_cwidth)) / 2;
+ sc->ymargin = (sc->height - (vi->vi_height * vi->vi_cheight))/2;
+
+ adp->va_window = (vm_offset_t) goldfish_fb_static_window;
+ adp->va_flags |= V_ADP_FONT | V_ADP_INITIALIZED /* | V_ADP_COLOR | V_ADP_MODECHANGE */;
+ adp->va_line_width = sc->stride;
+ adp->va_buffer_size = sc->fb_size;
+
+ if (vid_register(&sc->va) < 0) {
+ printf("%s: failed to register va\n", __func__);
+ }
+ adp->va_flags |= V_ADP_REGISTERED;
+
+ return (0);
+}
+
+static int
+goldfish_fb_get_info(video_adapter_t *adp, int mode, video_info_t *info)
+{
+
+ bcopy(&adp->va_info, info, sizeof(*info));
+ return (0);
+}
+
+static int
+goldfish_fb_query_mode(video_adapter_t *adp, video_info_t *info)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_set_mode(video_adapter_t *adp, int mode)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_save_font(video_adapter_t *adp, int page, int size, int width,
+ u_char *data, int c, int count)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_load_font(video_adapter_t *adp, int page, int size, int width,
+ u_char *data, int c, int count)
+{
+ struct video_adapter_softc *sc;
+
+ sc = (struct video_adapter_softc *)adp;
+ sc->font = data;
+
+ return (0);
+}
+
+static int
+goldfish_fb_show_font(video_adapter_t *adp, int page)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_save_palette(video_adapter_t *adp, u_char *palette)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_load_palette(video_adapter_t *adp, u_char *palette)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_set_border(video_adapter_t *adp, int border)
+{
+ return (goldfish_fb_blank_display(adp, border));
+}
+
+static int
+goldfish_fb_save_state(video_adapter_t *adp, void *p, size_t size)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_load_state(video_adapter_t *adp, void *p)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_set_win_org(video_adapter_t *adp, off_t offset)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_read_hw_cursor(video_adapter_t *adp, int *col, int *row)
+{
+ *col = *row = 0;
+ return (0);
+}
+
+static int
+goldfish_fb_set_hw_cursor(video_adapter_t *adp, int col, int row)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_set_hw_cursor_shape(video_adapter_t *adp, int base, int height,
+ int celsize, int blink)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_blank_display(video_adapter_t *adp, int mode)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_mmap(video_adapter_t *adp, vm_ooffset_t offset, vm_paddr_t *paddr,
+ int prot, vm_memattr_t *memattr)
+{
+ struct video_adapter_softc *sc;
+
+ sc = (struct video_adapter_softc *)adp;
+
+ /*
+ * This might be a legacy VGA mem request: if so, just point it at the
+ * framebuffer, since it shouldn't be touched
+ */
+ if (offset < sc->stride * sc->height) {
+ *paddr = sc->fb_paddr + offset;
+ return (0);
+ }
+
+ return (EINVAL);
+}
+
+static int
+goldfish_fb_ioctl(video_adapter_t *adp, u_long cmd, caddr_t data)
+{
+ struct video_adapter_softc *sc;
+ struct fbtype *fb;
+
+ sc = (struct video_adapter_softc *)adp;
+
+ switch (cmd) {
+ case FBIOGTYPE:
+ fb = (struct fbtype *)data;
+ fb->fb_type = FBTYPE_PCIMISC;
+ fb->fb_height = sc->height;
+ fb->fb_width = sc->width;
+ fb->fb_depth = sc->depth;
+ if (sc->depth <= 1 || sc->depth > 8)
+ fb->fb_cmsize = 0;
+ else
+ fb->fb_cmsize = 1 << sc->depth;
+ fb->fb_size = sc->fb_size;
+ break;
+ case FBIOSCURSOR:
+ return (ENODEV);
+ default:
+ return (fb_commonioctl(adp, cmd, data));
+ }
+
+ return (0);
+}
+
+static int
+goldfish_fb_clear(video_adapter_t *adp)
+{
+ return (goldfish_fb_blank_display(adp, 0));
+}
+
+static int
+goldfish_fb_fill_rect(video_adapter_t *adp, int val, int x, int y, int cx, int cy)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_bitblt(video_adapter_t *adp, ...)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_diag(video_adapter_t *adp, int level)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_save_cursor_palette(video_adapter_t *adp, u_char *palette)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_load_cursor_palette(video_adapter_t *adp, u_char *palette)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_copy(video_adapter_t *adp, vm_offset_t src, vm_offset_t dst, int n)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_putp(video_adapter_t *adp, vm_offset_t off, uint32_t p, uint32_t a,
+ int size, int bpp, int bit_ltor, int byte_ltor)
+{
+ return (0);
+}
+
+static int
+goldfish_fb_putc(video_adapter_t *adp, vm_offset_t off, uint8_t c, uint8_t a)
+{
+ struct video_adapter_softc *sc;
+ int col, row, bpp;
+ int b, i, j, k;
+ uint8_t *addr;
+ u_char *p;
+ uint32_t fg, bg, color;
+
+ sc = (struct video_adapter_softc *)adp;
+ bpp = sc->bpp;
+
+ if (sc->fb_vaddr == 0)
+ return (0);
+ row = (off / adp->va_info.vi_width) * adp->va_info.vi_cheight;
+ col = (off % adp->va_info.vi_width) * adp->va_info.vi_cwidth;
+ p = sc->font + c * FONT_HEIGHT;
+ addr = (uint8_t *)sc->fb_vaddr
+ + (row + sc->ymargin) * (sc->stride)
+ + bpp * (col + sc->xmargin);
+
+ bg = colors[(a >> 4) & 0x0f];
+ fg = colors[a & 0x0f];
+
+ for (i = 0; i < FONT_HEIGHT; i++) {
+ for (j = 0, k = 7; j < 8; j++, k--) {
+ if ((p[i] & (1 << k)) == 0)
+ color = bg;
+ else
+ color = fg;
+ /* FIXME: BPP maybe different */
+ for (b = 0; b < bpp; b ++)
+ addr[bpp * j + b] =
+ (color >> (b << 3)) & 0xff;
+ }
+
+ addr += (sc->stride);
+ }
+
+ return (0);
+}
+
+static int
+goldfish_fb_puts(video_adapter_t *adp, vm_offset_t off, u_int16_t *s, int len)
+{
+ int i;
+
+ for (i = 0; i < len; i++)
+ goldfish_fb_putc(adp, off + i, s[i] & 0xff, (s[i] & 0xff00) >> 8);
+
+ return (0);
+}
+
+static int
+goldfish_fb_putm(video_adapter_t *adp, int x, int y, uint8_t *pixel_image,
+ uint32_t pixel_mask, int size, int width)
+{
+ return (0);
+}
+
+
+/*
+ * Define a stub keyboard driver in case one hasn't been
+ * compiled into the kernel
+ */
+#include <sys/kbio.h>
+#include <dev/kbd/kbdreg.h>
+
+static int dummy_kbd_configure(int flags);
+
+keyboard_switch_t goldfish_dummysw;
+
+static int
+dummy_kbd_configure(int flags)
+{
+ printf("%s:\n", __func__);
+ return (0);
+}
+KEYBOARD_DRIVER(goldfish_dummy, goldfish_dummysw, dummy_kbd_configure);
Added: soc2014/astarasikov/head/sys/arm/goldfish/goldfish_machdep.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2014/astarasikov/head/sys/arm/goldfish/goldfish_machdep.c Mon Jun 16 21:43:02 2014 (r269650)
@@ -0,0 +1,123 @@
+/*-
+ * Copyright (c) 2014 Alexander Tarasikov <alexander.tarasikov at gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ * 3. All advertising materials mentioning features or use of this software
+ * must display the following acknowledgement:
+ * This product includes software developed by Brini.
+ * 4. The name of the company nor the name of the author may be used to
+ * endorse or promote products derived from this software without specific
+ * prior written permission.
+ *
+ * THIS SOFTWARE IS PROVIDED BY BRINI ``AS IS'' AND ANY EXPRESS OR IMPLIED
+ * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
+ * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
+ * IN NO EVENT SHALL BRINI OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT,
+ * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
+ * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
+ * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include "opt_ddb.h"
+#include "opt_platform.h"
+#include "opt_global.h"
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#define _ARM32_BUS_DMA_PRIVATE
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
+#include <machine/bus.h>
+#include <machine/frame.h> /* For trapframe_t, used in <machine/machdep.h> */
+#include <machine/machdep.h>
+#include <machine/pmap.h>
+
+#include <dev/fdt/fdt_common.h>
+
+/* Start of address space used for bootstrap map */
+#define DEVMAP_BOOTSTRAP_MAP_START 0xF0000000
+
+vm_offset_t
+initarm_lastaddr(void)
+{
+
+ return (DEVMAP_BOOTSTRAP_MAP_START - ARM_NOCACHE_KVA_SIZE);
+}
+
+void
+initarm_gpio_init(void)
+{
+}
+
+void
+initarm_late_init(void)
+{
+}
+
+#define FDT_DEVMAP_MAX (2)
+static struct pmap_devmap fdt_devmap[FDT_DEVMAP_MAX] = {
+ { 0, 0, 0, 0, 0, },
+ { 0, 0, 0, 0, 0, }
+};
+
+/*
+ * Construct pmap_devmap[] with DT-derived config data.
+ */
+int
+platform_devmap_init(void)
+{
+ int i = 0;
+
+ /* Map goldfish virtual peripherals
+ */
+
+ fdt_devmap[i].pd_va = DEVMAP_BOOTSTRAP_MAP_START + 0xf000000;
+ fdt_devmap[i].pd_pa = 0xff000000;
+ fdt_devmap[i].pd_size = 0x100000; /* 1 MB */
+ fdt_devmap[i].pd_prot = VM_PROT_READ | VM_PROT_WRITE;
+ fdt_devmap[i].pd_cache = PTE_DEVICE;
+
+ pmap_devmap_bootstrap_table = &fdt_devmap[0];
+ return (0);
+}
+
+struct arm32_dma_range *
+bus_dma_get_range(void)
+{
+
+ return (NULL);
+}
+
+int
+bus_dma_get_range_nb(void)
+{
+
+ return (0);
+}
+
+void
+cpu_reset()
+{
+ printf("cpu_reset\n");
+ while (1);
+}
+
Added: soc2014/astarasikov/head/sys/arm/goldfish/goldfish_mmc.c
==============================================================================
--- /dev/null 00:00:00 1970 (empty, because file is newly added)
+++ soc2014/astarasikov/head/sys/arm/goldfish/goldfish_mmc.c Mon Jun 16 21:43:02 2014 (r269650)
@@ -0,0 +1,134 @@
+/*-
+ * Copyright (c) 2014 Alexander Tarasikov <alexander.tarasikov at gmail.com>
+ * All rights reserved.
+ *
+ * Redistribution and use in source and binary forms, with or without
+ * modification, are permitted provided that the following conditions
+ * are met:
+ * 1. Redistributions of source code must retain the above copyright
+ * notice, this list of conditions and the following disclaimer.
+ * 2. Redistributions in binary form must reproduce the above copyright
+ * notice, this list of conditions and the following disclaimer in the
+ * documentation and/or other materials provided with the distribution.
+ *
+ * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
+ * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
+ * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
+ * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
+ * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
+ * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
+ * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
+ * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
+ * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
+ * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
+ * SUCH DAMAGE.
+ *
+ */
+
+#include <sys/cdefs.h>
+__FBSDID("$FreeBSD$");
+
+#include <sys/param.h>
+#include <sys/systm.h>
+#include <sys/bus.h>
+#include <sys/kernel.h>
+#include <sys/module.h>
+#include <sys/malloc.h>
+#include <sys/rman.h>
+#include <sys/timetc.h>
+#include <machine/bus.h>
+#include <machine/intr.h>
+
+#include <dev/fdt/fdt_common.h>
+#include <dev/ofw/openfirm.h>
+
+#include <dev/ofw/ofw_bus.h>
+#include <dev/ofw/ofw_bus_subr.h>
+
+struct goldfish_mmc_softc {
*** DIFF OUTPUT TRUNCATED AT 1000 LINES ***
More information about the svn-soc-all
mailing list