Module Name: src Committed By: riastradh Date: Wed Jan 15 13:53:42 UTC 2014
Modified Files: src/sys/external/bsd/drm2/conf [riastradh-drm2]: files.drm2 src/sys/external/bsd/drm2/i915drm [riastradh-drm2]: i915_pci.c Log Message: Clean up the still-not-yet-functional genfb attachment cruft a bit. To generate a diff of this commit: cvs rdiff -u -r1.1.2.4 -r1.1.2.5 src/sys/external/bsd/drm2/conf/files.drm2 cvs rdiff -u -r1.1.2.5 -r1.1.2.6 src/sys/external/bsd/drm2/i915drm/i915_pci.c Please note that diffs are not public domain; they are subject to the copyright notices on the relevant files.
Modified files: Index: src/sys/external/bsd/drm2/conf/files.drm2 diff -u src/sys/external/bsd/drm2/conf/files.drm2:1.1.2.4 src/sys/external/bsd/drm2/conf/files.drm2:1.1.2.5 --- src/sys/external/bsd/drm2/conf/files.drm2:1.1.2.4 Wed Jul 24 03:56:49 2013 +++ src/sys/external/bsd/drm2/conf/files.drm2 Wed Jan 15 13:53:42 2014 @@ -1,4 +1,4 @@ -# $NetBSD: files.drm2,v 1.1.2.4 2013/07/24 03:56:49 riastradh Exp $ +# $NetBSD: files.drm2,v 1.1.2.5 2014/01/15 13:53:42 riastradh Exp $ define drm2base define drm2pci @@ -22,7 +22,7 @@ makeoptions drm2base CPPFLAGS+="-DMTRR" makeoptions i915drm CPPFLAGS+="-I$S/external/bsd/drm2/dist/drm/i915" -device i915drm: drm2base, drm2pci, drmbus +device i915drm: drm2base, drm2pci, drmbus, wsemuldisplaydev attach i915drm at pci #file external/bsd/drm2/dist/drm/ati_pcigart.c drm2base Index: src/sys/external/bsd/drm2/i915drm/i915_pci.c diff -u src/sys/external/bsd/drm2/i915drm/i915_pci.c:1.1.2.5 src/sys/external/bsd/drm2/i915drm/i915_pci.c:1.1.2.6 --- src/sys/external/bsd/drm2/i915drm/i915_pci.c:1.1.2.5 Mon Dec 30 04:51:43 2013 +++ src/sys/external/bsd/drm2/i915drm/i915_pci.c Wed Jan 15 13:53:42 2014 @@ -1,4 +1,4 @@ -/* $NetBSD: i915_pci.c,v 1.1.2.5 2013/12/30 04:51:43 riastradh Exp $ */ +/* $NetBSD: i915_pci.c,v 1.1.2.6 2014/01/15 13:53:42 riastradh Exp $ */ /*- * Copyright (c) 2013 The NetBSD Foundation, Inc. @@ -30,7 +30,7 @@ */ #include <sys/cdefs.h> -__KERNEL_RCSID(0, "$NetBSD: i915_pci.c,v 1.1.2.5 2013/12/30 04:51:43 riastradh Exp $"); +__KERNEL_RCSID(0, "$NetBSD: i915_pci.c,v 1.1.2.6 2014/01/15 13:53:42 riastradh Exp $"); #include <sys/types.h> #include <sys/systm.h> @@ -39,7 +39,12 @@ __KERNEL_RCSID(0, "$NetBSD: i915_pci.c,v #include <dev/pci/pcireg.h> #include <dev/pci/pcivar.h> -#if 0 /* XXX genfb */ +#ifndef i915drm_genfb +#define i915drm_genfb 0 +#endif + +#if i915drm_genfb /* XXX genfb */ +#include <dev/cons.h> /* cn_tab */ #include <dev/pci/wsdisplay_pci.h> #include <dev/wsfb/genfbvar.h> #endif @@ -54,9 +59,10 @@ struct i915drm_softc { struct pci_dev sc_pci_dev; struct drm_i915_gem_object *sc_fb_obj; bus_space_handle_t sc_fb_bsh; -#if 0 /* XXX genfb */ +#if i915drm_genfb /* XXX genfb */ struct genfb_softc sc_genfb; #endif + struct list_head sc_fb_list; /* XXX Kludge! */ }; static int i915drm_match(device_t, cfdata_t, void *); @@ -68,8 +74,11 @@ static int i915drm_detach_framebuffer(de static int i915drm_fb_probe(struct drm_fb_helper *, struct drm_fb_helper_surface_size *); +static int i915drm_fb_create_handle(struct drm_framebuffer *, + struct drm_file *, unsigned int *); +static void i915drm_fb_destroy(struct drm_framebuffer *); -#if 0 /* XXX genfb */ +#if i915drm_genfb /* XXX genfb */ static int i915drm_genfb_ioctl(void *, void *, unsigned long, void *, int, struct lwp *); static paddr_t i915drm_genfb_mmap(void *, void *, off_t, int); @@ -201,12 +210,12 @@ i915drm_attach_framebuffer(device_t self struct drm_i915_private *const dev_priv = dev->dev_private; int ret; - aprint_debug_dev(self, "attach framebuffer\n"); + INIT_LIST_HEAD(&sc->sc_fb_list); + dev_priv->fbdev = kmem_zalloc(sizeof(*dev_priv->fbdev), KM_SLEEP); struct drm_fb_helper *const fb_helper = &dev_priv->fbdev->helper; - aprint_debug_dev(self, "drm_fb_helper_init\n"); fb_helper->funcs = &i915drm_fb_helper_funcs; ret = drm_fb_helper_init(dev, fb_helper, dev_priv->num_pipe, INTELFB_CONN_LIMIT); @@ -216,9 +225,7 @@ i915drm_attach_framebuffer(device_t self goto fail0; } - aprint_debug_dev(self, "drm_fb_helper_single_add_all_connectors\n"); drm_fb_helper_single_add_all_connectors(fb_helper); - aprint_debug_dev(self, "drm_fb_helper_initial_config\n"); drm_fb_helper_initial_config(fb_helper, 32 /* XXX ? */); /* Success! */ @@ -264,6 +271,11 @@ i915drm_detach_framebuffer(device_t self return 0; } +static const struct drm_framebuffer_funcs i915drm_fb_funcs = { + .create_handle = &i915drm_fb_create_handle, + .destroy = &i915drm_fb_destroy, +}; + static int i915drm_fb_probe(struct drm_fb_helper *fb_helper, struct drm_fb_helper_surface_size *sizes) @@ -272,7 +284,7 @@ i915drm_fb_probe(struct drm_fb_helper *f struct drm_i915_private *const dev_priv = dev->dev_private; struct i915drm_softc *const sc = container_of(dev, struct i915drm_softc, sc_drm_dev); -#if 0 /* XXX genfb */ +#if i915drm_genfb /* XXX genfb */ const prop_dictionary_t dict = device_properties(sc->sc_dev); static const struct genfb_ops zero_genfb_ops; struct genfb_ops genfb_ops = zero_genfb_ops; @@ -283,9 +295,11 @@ i915drm_fb_probe(struct drm_fb_helper *f int ret; aprint_debug_dev(sc->sc_dev, "probe framebuffer" - ": %"PRIu32" by %"PRIu32"\n", + ": %"PRIu32" by %"PRIu32", bpp %"PRIu32" depth %"PRIu32"\n", sizes->surface_width, - sizes->surface_height); + sizes->surface_height, + sizes->surface_bpp, + sizes->surface_depth); if (fb_helper->fb != NULL) { aprint_debug_dev(sc->sc_dev, "already have a framebuffer" @@ -337,20 +351,25 @@ i915drm_fb_probe(struct drm_fb_helper *f } /* - * XXX Kludge: The intel_framebuffer abstraction `steals' a - * reference to the object. intel_framebuffer_init doesn't add - * a reference, but when the drm_framebuffer inside is - * destroyed, it will drop a reference. + * XXX Kludge: drm_framebuffer_remove assumes that the + * framebuffer has been put on a userspace list by + * drm_mode_addfb and tries to list_del it. This is not the + * case, so pretend we are on a list. */ - drm_gem_object_reference(&sc->sc_fb_obj->base); + list_add(&dev_priv->fbdev->ifb.base.filp_head, &sc->sc_fb_list); + + /* + * XXX Kludge: The intel_framebuffer abstraction sets up a + * destruction routine that frees the wrong pointer, under the + * assumption (which is invalid even upstream) that all + * intel_framebuffer structures are allocated in + * intel_framebuffer_create. + */ + dev_priv->fbdev->ifb.base.funcs = &i915drm_fb_funcs; fb_helper->fb = &dev_priv->fbdev->ifb.base; mutex_unlock(&dev->struct_mutex); - aprint_error_dev(sc->sc_dev, "GTT base 0x%"PRIxMAX - ", GTT offset 0x%"PRIxMAX"\n", - (uintmax_t)dev_priv->mm.gtt_base_addr, - (uintmax_t)sc->sc_fb_obj->gtt_offset); /* XXX errno NetBSD->Linux */ ret = -bus_space_map(dev->bst, (dev_priv->mm.gtt_base_addr + sc->sc_fb_obj->gtt_offset), @@ -363,41 +382,12 @@ i915drm_fb_probe(struct drm_fb_helper *f goto fail3; } - if (0) - goto fail4; - - aprint_error_dev(sc->sc_dev, "write crap to the framebuffer\n"); - { - bus_size_t i; - - for (i = 0; i < size; i++) - bus_space_write_1(dev->bst, sc->sc_fb_bsh, i, - ((i % 4) == 0? 0x53 : - (i % 4) == 1? 0x00 : - (i % 4) == 2? 0x35 : - 0xff)); - } -#if 0 - (void)memset(bus_space_vaddr(dev->bst, sc->sc_fb_bsh), 0x53, size/4); - (void)kpause("drmfbxxx", false, hz, NULL); - (void)memset((char *)bus_space_vaddr(dev->bst, sc->sc_fb_bsh) + size/4, - 0x00, size/4); - (void)kpause("drmfbxxx", false, hz, NULL); - (void)memset((char *)bus_space_vaddr(dev->bst, sc->sc_fb_bsh) + size/2, - 0x35, size/4); - (void)kpause("drmfbxxx", false, hz, NULL); - (void)memset((char *)bus_space_vaddr(dev->bst, sc->sc_fb_bsh) + size/2 - + size/4, 0xff, size/4); -#endif - -#if 0 /* XXX genfb */ - prop_dictionary_set_uint32(dict, "is_console", 1); /* XXX */ +#if i915drm_genfb /* XXX genfb */ + prop_dictionary_set_bool(dict, "is_console", 0); /* XXX */ prop_dictionary_set_uint32(dict, "width", mode_cmd.width); prop_dictionary_set_uint32(dict, "height", mode_cmd.height); - prop_dictionary_set_uint8(dict, "depth", sizes->surface_depth); -#if 0 /* XXX fb stride/linebytes? */ - prop_dictionary_set_uint16(dict, "linebytes", ...); -#endif + prop_dictionary_set_uint8(dict, "depth", sizes->surface_bpp); + prop_dictionary_set_uint16(dict, "linebytes", mode_cmd.pitches[0]); prop_dictionary_set_uint32(dict, "address", 0); /* XXX >32-bit */ prop_dictionary_set_uint64(dict, "virtual_address", (uint64_t)bus_space_vaddr(dev->bst, sc->sc_fb_bsh)); @@ -419,7 +409,8 @@ i915drm_fb_probe(struct drm_fb_helper *f /* Success! */ return 1; -fail4: bus_space_unmap(dev->bst, sc->sc_fb_bsh, size); +fail4: __unused + bus_space_unmap(dev->bst, sc->sc_fb_bsh, size); fb_helper->fb = NULL; fail3: drm_framebuffer_unreference(&dev_priv->fbdev->ifb.base); fail2: i915_gem_object_unpin(sc->sc_fb_obj); @@ -429,7 +420,23 @@ fail0: KASSERT(ret < 0); return ret; } -#if 0 /* XXX genfb */ +static void +i915drm_fb_destroy(struct drm_framebuffer *fb) +{ + + drm_framebuffer_cleanup(fb); +} + +static int +i915drm_fb_create_handle(struct drm_framebuffer *fb, struct drm_file *file, + unsigned int *handle) +{ + + return drm_gem_handle_create(file, + &to_intel_framebuffer(fb)->obj->base, handle); +} + +#if i915drm_genfb /* XXX genfb */ static int i915drm_genfb_ioctl(void *v, void *vs, unsigned long cmd, void *data, int flag, struct lwp *l)