| 109 | } |
| 110 | |
| 111 | static int |
| 112 | bcm_fb_setup_fbd(struct bcmsc_softc *sc) |
| 113 | { |
| 114 | struct bcm2835_fb_config fb; |
| 115 | device_t fbd; |
| 116 | int err; |
| 117 | |
| 118 | err = bcm_fb_init(sc, &fb); |
| 119 | if (err) |
| 120 | return (err); |
| 121 | |
| 122 | memset(&sc->info, 0, sizeof(sc->info)); |
| 123 | sc->info.fb_name = device_get_nameunit(sc->dev); |
| 124 | |
| 125 | sc->info.fb_vbase = (intptr_t)pmap_mapdev(fb.base, fb.size); |
| 126 | sc->info.fb_pbase = fb.base; |
| 127 | sc->info.fb_size = fb.size; |
| 128 | sc->info.fb_bpp = sc->info.fb_depth = fb.bpp; |
| 129 | sc->info.fb_stride = fb.pitch; |
| 130 | sc->info.fb_width = fb.xres; |
| 131 | sc->info.fb_height = fb.yres; |
| 132 | #ifdef VM_MEMATTR_WRITE_COMBINING |
| 133 | sc->info.fb_flags = FB_FLAG_MEMATTR; |
| 134 | sc->info.fb_memattr = VM_MEMATTR_WRITE_COMBINING; |
| 135 | #endif |
| 136 | |
| 137 | if (sc->fbswap) { |
| 138 | switch (sc->info.fb_bpp) { |
| 139 | case 24: |
| 140 | vt_generate_cons_palette(sc->info.fb_cmap, |
| 141 | COLOR_FORMAT_RGB, 0xff, 0, 0xff, 8, 0xff, 16); |
| 142 | sc->info.fb_cmsize = 16; |
| 143 | break; |
| 144 | case 32: |
| 145 | vt_generate_cons_palette(sc->info.fb_cmap, |
| 146 | COLOR_FORMAT_RGB, 0xff, 16, 0xff, 8, 0xff, 0); |
| 147 | sc->info.fb_cmsize = 16; |
| 148 | break; |
| 149 | } |
| 150 | } |
| 151 | |
| 152 | fbd = device_add_child(sc->dev, "fbd", device_get_unit(sc->dev)); |
| 153 | if (fbd == NULL) { |
| 154 | device_printf(sc->dev, "Failed to add fbd child\n"); |
| 155 | pmap_unmapdev(sc->info.fb_vbase, sc->info.fb_size); |
| 156 | return (ENXIO); |
| 157 | } else if (device_probe_and_attach(fbd) != 0) { |
| 158 | device_printf(sc->dev, "Failed to attach fbd device\n"); |
| 159 | device_delete_child(sc->dev, fbd); |
| 160 | pmap_unmapdev(sc->info.fb_vbase, sc->info.fb_size); |
| 161 | return (ENXIO); |
| 162 | } |
| 163 | |
| 164 | device_printf(sc->dev, "%dx%d(%dx%d@%d,%d) %dbpp\n", fb.xres, fb.yres, |
| 165 | fb.vxres, fb.vyres, fb.xoffset, fb.yoffset, fb.bpp); |
| 166 | device_printf(sc->dev, |
| 167 | "fbswap: %d, pitch %d, base 0x%08x, screen_size %d\n", |
| 168 | sc->fbswap, fb.pitch, fb.base, fb.size); |
no test coverage detected