The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/powerpc/ps3/ps3_syscons.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /*-
    2  * Copyright (c) 2011-2014 Nathan Whitehorn
    3  * All rights reserved.
    4  *
    5  * Redistribution and use in source and binary forms, with or without
    6  * modification, are permitted provided that the following conditions
    7  * are met:
    8  * 1. Redistributions of source code must retain the above copyright
    9  *    notice, this list of conditions and the following disclaimer.
   10  * 2. Redistributions in binary form must reproduce the above copyright
   11  *    notice, this list of conditions and the following disclaimer in the
   12  *    documentation and/or other materials provided with the distribution.
   13  *
   14  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
   15  * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
   16  * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
   17  * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
   18  * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
   19  * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
   20  * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
   21  * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
   22  * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
   23  * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
   24  * SUCH DAMAGE.
   25  */
   26 
   27 #include <sys/cdefs.h>
   28 __FBSDID("$FreeBSD: releng/11.2/sys/powerpc/ps3/ps3_syscons.c 331722 2018-03-29 02:50:57Z eadler $");
   29 
   30 #include <sys/param.h>
   31 #include <sys/systm.h>
   32 #include <sys/kernel.h>
   33 #include <sys/sysctl.h>
   34 #include <sys/limits.h>
   35 #include <sys/conf.h>
   36 #include <sys/cons.h>
   37 #include <sys/fbio.h>
   38 
   39 #include <vm/vm.h>
   40 #include <vm/pmap.h>
   41 
   42 #include <machine/platform.h>
   43 
   44 #include <dev/ofw/openfirm.h>
   45 #include <dev/vt/vt.h>
   46 #include <dev/vt/hw/fb/vt_fb.h>
   47 #include <dev/vt/colors/vt_termcolors.h>
   48 
   49 #include "ps3-hvcall.h"
   50 
   51 #define L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_MODE_SET        0x0100
   52 #define L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC            0x0101
   53 #define  L1GPU_DISPLAY_SYNC_HSYNC                       1
   54 #define  L1GPU_DISPLAY_SYNC_VSYNC                       2
   55 #define L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP            0x0102
   56 
   57 static vd_init_t ps3fb_init;
   58 static vd_probe_t ps3fb_probe;
   59 void ps3fb_remap(void);
   60 
   61 struct ps3fb_softc {
   62         struct fb_info  fb_info;
   63 
   64         uint64_t        sc_fbhandle;
   65         uint64_t        sc_fbcontext;
   66         uint64_t        sc_dma_control;
   67         uint64_t        sc_driver_info;
   68         uint64_t        sc_reports;
   69         uint64_t        sc_reports_size;
   70 };
   71 
   72 static struct vt_driver vt_ps3fb_driver = {
   73         .vd_name = "ps3fb",
   74         .vd_probe = ps3fb_probe,
   75         .vd_init = ps3fb_init,
   76         .vd_blank = vt_fb_blank,
   77         .vd_bitblt_text = vt_fb_bitblt_text,
   78         .vd_bitblt_bmp = vt_fb_bitblt_bitmap,
   79         .vd_drawrect = vt_fb_drawrect,
   80         .vd_setpixel = vt_fb_setpixel,
   81         .vd_fb_ioctl = vt_fb_ioctl,
   82         .vd_fb_mmap = vt_fb_mmap,
   83         /* Better than VGA, but still generic driver. */
   84         .vd_priority = VD_PRIORITY_GENERIC + 1,
   85 };
   86 
   87 VT_DRIVER_DECLARE(vt_ps3fb, vt_ps3fb_driver);
   88 static struct ps3fb_softc ps3fb_softc;
   89 
   90 static int
   91 ps3fb_probe(struct vt_device *vd)
   92 {
   93         struct ps3fb_softc *sc;
   94         int disable;
   95         char compatible[64];
   96         phandle_t root;
   97 
   98         disable = 0;
   99         TUNABLE_INT_FETCH("hw.syscons.disable", &disable);
  100         if (disable != 0)
  101                 return (0);
  102 
  103         sc = &ps3fb_softc;
  104 
  105         TUNABLE_STR_FETCH("hw.platform", compatible, sizeof(compatible));
  106         if (strcmp(compatible, "ps3") == 0)
  107                 return (CN_INTERNAL);
  108 
  109         root = OF_finddevice("/");
  110         if (OF_getprop(root, "compatible", compatible, sizeof(compatible)) <= 0)
  111                 return (CN_DEAD);
  112         
  113         if (strncmp(compatible, "sony,ps3", sizeof(compatible)) != 0)
  114                 return (CN_DEAD);
  115 
  116         return (CN_INTERNAL);
  117 }
  118 
  119 void
  120 ps3fb_remap(void)
  121 {
  122         struct ps3fb_softc *sc;
  123         vm_offset_t va, fb_paddr;
  124 
  125         sc = &ps3fb_softc;
  126 
  127         lv1_gpu_close();
  128         lv1_gpu_open(0);
  129 
  130         lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_MODE_SET,
  131             0,0,0,0);
  132         lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_MODE_SET,
  133             0,0,1,0);
  134         lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC,
  135             0,L1GPU_DISPLAY_SYNC_VSYNC,0,0);
  136         lv1_gpu_context_attribute(0, L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_SYNC,
  137             1,L1GPU_DISPLAY_SYNC_VSYNC,0,0);
  138         lv1_gpu_memory_allocate(roundup2(sc->fb_info.fb_size, 1024*1024),
  139             0, 0, 0, 0, &sc->sc_fbhandle, &fb_paddr);
  140         lv1_gpu_context_allocate(sc->sc_fbhandle, 0, &sc->sc_fbcontext,
  141             &sc->sc_dma_control, &sc->sc_driver_info, &sc->sc_reports,
  142             &sc->sc_reports_size);
  143 
  144         lv1_gpu_context_attribute(sc->sc_fbcontext,
  145             L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 0, 0, 0, 0);
  146         lv1_gpu_context_attribute(sc->sc_fbcontext,
  147             L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 1, 0, 0, 0);
  148 
  149         sc->fb_info.fb_pbase = fb_paddr;
  150         for (va = 0; va < sc->fb_info.fb_size; va += PAGE_SIZE)
  151                 pmap_kenter_attr(0x10000000 + va, fb_paddr + va,
  152                     VM_MEMATTR_WRITE_COMBINING);
  153         sc->fb_info.fb_flags &= ~FB_FLAG_NOWRITE;
  154 }
  155 
  156 static int
  157 ps3fb_init(struct vt_device *vd)
  158 {
  159         struct ps3fb_softc *sc;
  160 
  161         /* Init softc */
  162         vd->vd_softc = sc = &ps3fb_softc;
  163 
  164         /* XXX: get from HV repository */
  165         sc->fb_info.fb_depth = 32;
  166         sc->fb_info.fb_height = 480;
  167         sc->fb_info.fb_width = 720;
  168         TUNABLE_INT_FETCH("hw.ps3fb.height", &sc->fb_info.fb_height);
  169         TUNABLE_INT_FETCH("hw.ps3fb.width", &sc->fb_info.fb_width);
  170         sc->fb_info.fb_stride = sc->fb_info.fb_width*4;
  171         sc->fb_info.fb_size = sc->fb_info.fb_height * sc->fb_info.fb_stride;
  172         sc->fb_info.fb_bpp = sc->fb_info.fb_stride / sc->fb_info.fb_width * 8;
  173 
  174         /*
  175          * Arbitrarily choose address for the framebuffer
  176          */
  177 
  178         sc->fb_info.fb_vbase = 0x10000000;
  179         sc->fb_info.fb_flags |= FB_FLAG_NOWRITE; /* Not available yet */
  180         sc->fb_info.fb_cmsize = 16;
  181 
  182         /* 32-bit VGA palette */
  183         vt_generate_cons_palette(sc->fb_info.fb_cmap, COLOR_FORMAT_RGB,
  184             255, 0, 255, 8, 255, 16);
  185 
  186         /* Set correct graphics context */
  187         lv1_gpu_context_attribute(sc->sc_fbcontext,
  188             L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 0, 0, 0, 0);
  189         lv1_gpu_context_attribute(sc->sc_fbcontext,
  190             L1GPU_CONTEXT_ATTRIBUTE_DISPLAY_FLIP, 1, 0, 0, 0);
  191 
  192         vt_fb_init(vd);
  193 
  194         return (CN_INTERNAL);
  195 }
  196 

Cache object: 73790440ba4b4132d5c789ef3512524c


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.