Date: Tue, 22 Oct 2013 20:27:30 +0000 (UTC) From: Aleksandr Rybalko <ray@FreeBSD.org> To: src-committers@freebsd.org, svn-src-user@freebsd.org Subject: svn commit: r256928 - in user/ed/newcons/sys/dev/drm2: . i915 radeon Message-ID: <201310222027.r9MKRU8u031324@svn.freebsd.org>
next in thread | raw e-mail | index | archive | help
Author: ray Date: Tue Oct 22 20:27:30 2013 New Revision: 256928 URL: http://svnweb.freebsd.org/changeset/base/256928 Log: o Update drivers according to fb_info structure changes. o Switch drm_fb_helper to be simple framebuffer provider. Sponsored by: The FreeBSD Foundation Modified: user/ed/newcons/sys/dev/drm2/drm_fb_helper.c user/ed/newcons/sys/dev/drm2/drm_fb_helper.h user/ed/newcons/sys/dev/drm2/drm_os_freebsd.h user/ed/newcons/sys/dev/drm2/i915/intel_fb.c user/ed/newcons/sys/dev/drm2/radeon/radeon_fb.c Modified: user/ed/newcons/sys/dev/drm2/drm_fb_helper.c ============================================================================== --- user/ed/newcons/sys/dev/drm2/drm_fb_helper.c Tue Oct 22 20:10:38 2013 (r256927) +++ user/ed/newcons/sys/dev/drm2/drm_fb_helper.c Tue Oct 22 20:27:30 2013 (r256928) @@ -36,175 +36,36 @@ __FBSDID("$FreeBSD$"); #include <dev/drm2/drm_fb_helper.h> #include <dev/drm2/drm_crtc_helper.h> -#include <dev/vt/vt.h> -#include <dev/vt/colors/vt_termcolors.h> - +#if defined(__FreeBSD__) struct vt_kms_softc { - intptr_t sc_paddr; - intptr_t sc_vaddr; - int sc_depth; - int sc_stride; - int sc_width; - int sc_height; struct drm_fb_helper *fb_helper; struct task fb_mode_task; - uint32_t sc_cmap[16]; }; -static vd_init_t vt_kms_init; -static vd_blank_t vt_kms_blank; -static vd_bitbltchr_t vt_kms_bitbltchr; -static vd_postswitch_t vt_kms_postswitch; +static fb_enter_t vt_kms_postswitch; static void vt_restore_fbdev_mode(void *, int); -static struct vt_driver vt_vt_kms_driver = { - .vd_init = vt_kms_init, - .vd_blank = vt_kms_blank, - .vd_bitbltchr = vt_kms_bitbltchr, - .vd_postswitch = vt_kms_postswitch, -}; - -static void -vt_kms_blank(struct vt_device *vd, term_color_t color) -{ - struct vt_kms_softc *sc = vd->vd_softc; - u_int ofs; - uint32_t c; - - c = sc->sc_cmap[color]; - /* TODO handle difference between depth and bpp. */ - switch (sc->sc_depth) { - case 8: - for (ofs = 0; ofs < (sc->sc_stride * vd->vd_height); ofs++) - *(uint8_t *)(sc->sc_vaddr + ofs) = c & 0xff; - break; - case 16: - /* XXX must be 16bits colormap */ - for (ofs = 0; ofs < (sc->sc_stride * vd->vd_height); ofs++) - *(uint16_t *)(sc->sc_vaddr + 2 * ofs) = c & 0xffff; - break; - case 24: /* */ - case 32: - c = sc->sc_cmap[color]; - for (ofs = 0; ofs < (sc->sc_stride * vd->vd_height); ofs++) - *(uint32_t *)(sc->sc_vaddr + 4 * ofs) = c; - break; - default: - /* panic? */ - break; - } -} - -static void -vt_kms_bitbltchr(struct vt_device *vd, const uint8_t *src, - vt_axis_t top, vt_axis_t left, unsigned int width, unsigned int height, - term_color_t fg, term_color_t bg) -{ - struct vt_kms_softc *sc = vd->vd_softc; - u_long line; - uint32_t fgc, bgc; - int c; - uint8_t b = 0; - - fgc = sc->sc_cmap[fg]; - bgc = sc->sc_cmap[bg]; - - line = (sc->sc_stride * top) + left * sc->sc_depth/8; - for (; height > 0; height--) { - for (c = 0; c < width; c++) { - if (c % 8 == 0) - b = *src++; - else - b <<= 1; - switch(sc->sc_depth) { - case 8: - *(uint8_t *)(sc->sc_vaddr + line + c) = - (b & 0x80 ? fgc : bgc) & 0xff; - break; - /* TODO 16 */ - /* TODO 24 */ - case 32: - *(uint32_t *)(sc->sc_vaddr + line + 4*c) = - (b & 0x80) ? fgc : bgc; - break; - default: - /* panic? */ - break; - } - } - line += sc->sc_stride; - } -} - -static int -vt_kms_init(struct vt_device *vd) -{ - struct vt_kms_softc *sc; - int err; - - sc = vd->vd_softc; - - vd->vd_height = sc->sc_height; - vd->vd_width = sc->sc_width; - - switch (sc->sc_depth) { - case 8: - err = vt_generate_vga_palette(sc->sc_cmap, COLOR_FORMAT_RGB, - 0x7, 5, 0x7, 2, 0x3, 0); - if (err) - return (CN_DEAD); - break; - case 15: - err = vt_generate_vga_palette(sc->sc_cmap, COLOR_FORMAT_RGB, - 0x1f, 10, 0x1f, 5, 0x1f, 0); - if (err) - return (CN_DEAD); - break; - case 16: - err = vt_generate_vga_palette(sc->sc_cmap, COLOR_FORMAT_RGB, - 0x1f, 11, 0x3f, 5, 0x1f, 0); - if (err) - return (CN_DEAD); - break; - case 24: - case 32: /* Ignore alpha. */ - err = vt_generate_vga_palette(sc->sc_cmap, COLOR_FORMAT_RGB, - 0xff, 0, 0xff, 8, 0xff, 16); - if (err) - return (CN_DEAD); - break; - default: - return (CN_DEAD); - } - - /* Clear the screen. */ - vt_kms_blank(vd, TC_BLACK); - - TASK_INIT(&sc->fb_mode_task, 0, vt_restore_fbdev_mode, vd); - - return (CN_INTERNAL); -} - /* Call restore out of vt(9) locks. */ static void vt_restore_fbdev_mode(void *arg, int pending) { struct vt_kms_softc *sc; - struct vt_device *vd; - vd = (struct vt_device *)arg; - sc = vd->vd_softc; + sc = (struct vt_kms_softc *)arg; drm_fb_helper_restore_fbdev_mode(sc->fb_helper); } -static void -vt_kms_postswitch(struct vt_device *vd) +static int +vt_kms_postswitch(void *arg) { struct vt_kms_softc *sc; - sc = vd->vd_softc; + sc = (struct vt_kms_softc *)arg; taskqueue_enqueue_fast(taskqueue_thread, &sc->fb_mode_task); + + return (0); } +#endif static DRM_LIST_HEAD(kernel_fb_helper_list); @@ -1069,6 +930,9 @@ int drm_fb_helper_single_fb_probe(struct struct fb_info *info; struct drm_fb_helper_surface_size sizes; int gamma_size = 0; +#if defined(__FreeBSD__) + struct vt_kms_softc *sc; +#endif memset(&sizes, 0, sizeof(struct drm_fb_helper_surface_size)); sizes.surface_depth = 24; @@ -1145,14 +1009,33 @@ int drm_fb_helper_single_fb_probe(struct if (new_fb < 0) return new_fb; +#if defined(__FreeBSD__) + sc = malloc(sizeof(struct vt_kms_softc), DRM_MEM_KMS, + M_WAITOK | M_ZERO); + sc->fb_helper = fb_helper; + TASK_INIT(&sc->fb_mode_task, 0, vt_restore_fbdev_mode, sc); + info = fb_helper->fbdev; + info->fb_name = device_get_nameunit(fb_helper->dev->device); + info->fb_depth = fb_helper->fb->bits_per_pixel; + info->fb_height = fb_helper->fb->height; + info->fb_width = fb_helper->fb->width; + info->fb_stride = fb_helper->fb->pitches[0]; + info->fb_priv = sc; + info->enter = &vt_kms_postswitch; +#endif + /* set the fb pointer */ for (i = 0; i < fb_helper->crtc_count; i++) { fb_helper->crtc_info[i].mode_set.fb = fb_helper->fb; } -#if 0 +#if defined(__FreeBSD__) + if (new_fb) { + register_framebuffer(info); + } +#else if (new_fb) { info->var.pixclock = 0; if (register_framebuffer(info) < 0) { @@ -1176,27 +1059,6 @@ int drm_fb_helper_single_fb_probe(struct if (new_fb) list_add(&fb_helper->kernel_fb_list, &kernel_fb_helper_list); #endif - - struct vt_kms_softc *sc = (struct vt_kms_softc *)malloc(sizeof(struct vt_kms_softc), M_TEMP, M_WAITOK); - sc->sc_vaddr = info->fb_vbase; - sc->sc_paddr = info->fb_pbase; - - sc->sc_depth = fb_helper->fb->bits_per_pixel; /* XXX: fix depth in VT, bpp is pix size, depth is meaning bits size */ - - sc->sc_height = fb_helper->fb->height; - sc->sc_stride = fb_helper->fb->pitches[0]; - sc->sc_width = fb_helper->fb->width; - /* Save fb_helper (XXX Do we really need it?) */ - sc->fb_helper = fb_helper; - - drm_fb_helper_restore_fbdev_mode(fb_helper); - - vt_allocate(&vt_vt_kms_driver, sc); - - DRM_DEBUG("Attach VT to %dx%d fb: P %#lx V %#lx\n", - fb_helper->fb->width, fb_helper->fb->height, - info->fb_pbase, info->fb_vbase); - return 0; } Modified: user/ed/newcons/sys/dev/drm2/drm_fb_helper.h ============================================================================== --- user/ed/newcons/sys/dev/drm2/drm_fb_helper.h Tue Oct 22 20:10:38 2013 (r256927) +++ user/ed/newcons/sys/dev/drm2/drm_fb_helper.h Tue Oct 22 20:27:30 2013 (r256928) @@ -79,19 +79,6 @@ struct drm_fb_helper_connector { struct drm_connector *connector; }; -/* TODO: move it out as separate FrameBuffer interface. */ -struct fb_info { - vm_offset_t fb_vbase; - vm_paddr_t fb_pbase; - size_t fb_size; - /* TODO fb_read method. */ - /* TODO fb_write method. */ - /* TODO fb_bitblt method. */ - /* TODO fb_blank method. */ - /* TODO H/W cursor methods. */ - /* TODO H/W mouse cursor methods. */ -}; - struct drm_fb_helper { struct drm_framebuffer *fb; struct drm_framebuffer *saved_fb; Modified: user/ed/newcons/sys/dev/drm2/drm_os_freebsd.h ============================================================================== --- user/ed/newcons/sys/dev/drm2/drm_os_freebsd.h Tue Oct 22 20:10:38 2013 (r256927) +++ user/ed/newcons/sys/dev/drm2/drm_os_freebsd.h Tue Oct 22 20:27:30 2013 (r256928) @@ -6,6 +6,8 @@ #include <sys/cdefs.h> __FBSDID("$FreeBSD$"); +#include <sys/fbio.h> + #if _BYTE_ORDER == _BIG_ENDIAN #define __BIG_ENDIAN 4321 #else Modified: user/ed/newcons/sys/dev/drm2/i915/intel_fb.c ============================================================================== --- user/ed/newcons/sys/dev/drm2/i915/intel_fb.c Tue Oct 22 20:10:38 2013 (r256927) +++ user/ed/newcons/sys/dev/drm2/i915/intel_fb.c Tue Oct 22 20:27:30 2013 (r256928) @@ -89,7 +89,9 @@ static int intelfb_create(struct intel_f #else info = malloc(sizeof(struct fb_info), DRM_MEM_KMS, M_WAITOK | M_ZERO); info->fb_size = size; - + info->fb_bpp = sizes->surface_bpp; + info->fb_width = sizes->fb_width; + info->fb_height = sizes->fb_height; info->fb_pbase = dev->agp->base + obj->gtt_offset; info->fb_vbase = (vm_offset_t)pmap_mapdev_attr(info->fb_pbase, size, PAT_WRITE_COMBINING); Modified: user/ed/newcons/sys/dev/drm2/radeon/radeon_fb.c ============================================================================== --- user/ed/newcons/sys/dev/drm2/radeon/radeon_fb.c Tue Oct 22 20:10:38 2013 (r256927) +++ user/ed/newcons/sys/dev/drm2/radeon/radeon_fb.c Tue Oct 22 20:27:30 2013 (r256928) @@ -235,6 +235,9 @@ static int radeonfb_create(struct radeon tmp = radeon_bo_gpu_offset(rbo) - rdev->mc.vram_start; info->fb_size = radeon_bo_size(rbo); + info->fb_bpp = sizes->surface_bpp; + info->fb_width = sizes->surface_width; + info->fb_height = sizes->surface_height; info->fb_pbase = rdev->mc.aper_base + tmp; info->fb_vbase = (vm_offset_t)rbo->kptr;
Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?201310222027.r9MKRU8u031324>