On 02/20/15 02:15, Shawn Webb wrote:
On Thursday, February 19, 2015 07:04:50 PM Shawn Webb wrote:
On Sunday, February 15, 2015 11:14:47 PM Hans Petter Selasky wrote:
Hi,

I've added support for USB display link adapters to FreeBSD-11-current,
but the kernel panics once "vt_fb_attach(info)" is called from
"fbd_register(struct fb_info* info)" when the USB device is plugged or
udl.ko is loaded. Is this a known issue?

REF: https://svnweb.freebsd.org/base/head/sys/dev/usb/video/udl.c

--HPS

I just bought a DisplayLink adapter that's compatible. Compiling a new
kernel with device udl brings this error:


Hi,

You need to also build the "sys/modules/videomode" and install and kldload.

Does your device need a power supply?

Can you plug the device through an external USB HUB after boot?

Also you need some VT patches, before it will attach to VT which I can send you. See attachment.

Beware the unplugging the device is not supported. It will crash / panic which needs to be resolved.

--HPS
diff --git a/sys/dev/fb/fbd.c b/sys/dev/fb/fbd.c
index f9b4d8e..11cb30e 100644
--- a/sys/dev/fb/fbd.c
+++ b/sys/dev/fb/fbd.c
@@ -51,6 +51,9 @@ __FBSDID("$FreeBSD$");
 #include <dev/vt/vt.h>
 #include <dev/vt/hw/fb/vt_fb.h>
 
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
 #include "fb_if.h"
 
 LIST_HEAD(fb_list_head_t, fb_list_entry) fb_list_head =
@@ -167,14 +170,21 @@ fb_mmap(struct cdev *dev, vm_ooffset_t offset, vm_paddr_t *paddr, int nprot,
 
 	info = dev->si_drv1;
 
-	if ((info->fb_flags & FB_FLAG_NOMMAP) || info->fb_pbase == 0)
+	if (info->fb_flags & FB_FLAG_NOMMAP)
 		return (ENODEV);
-
-	if (offset < info->fb_size) {
+	if (offset >= info->fb_size)
+		return (EINVAL);
+	if (info->fb_pbase == 0) {
+		/*
+		 * If there is no physical address
+		 * assume there is a virtual address
+		 * which is mappable:
+		 */
+		*paddr = vtophys((uint8_t *)info->fb_vbase + offset);
+	} else {
 		*paddr = info->fb_pbase + offset;
-		return (0);
 	}
-	return (EINVAL);
+	return (0);
 }
 
 static int
@@ -354,5 +364,6 @@ devclass_t	fbd_devclass;
 
 DRIVER_MODULE(fbd, fb, fbd_driver, fbd_devclass, 0, 0);
 DRIVER_MODULE(fbd, drmn, fbd_driver, fbd_devclass, 0, 0);
+DRIVER_MODULE(fbd, udl, fbd_driver, fbd_devclass, 0, 0);
 MODULE_VERSION(fbd, 1);
 
diff --git a/sys/dev/vt/hw/fb/vt_fb.c b/sys/dev/vt/hw/fb/vt_fb.c
index 5a0fe4f..bd1b881 100644
--- a/sys/dev/vt/hw/fb/vt_fb.c
+++ b/sys/dev/vt/hw/fb/vt_fb.c
@@ -37,10 +37,14 @@ __FBSDID("$FreeBSD$");
 #include <sys/malloc.h>
 #include <sys/queue.h>
 #include <sys/fbio.h>
+
 #include <dev/vt/vt.h>
 #include <dev/vt/hw/fb/vt_fb.h>
 #include <dev/vt/colors/vt_termcolors.h>
 
+#include <vm/vm.h>
+#include <vm/pmap.h>
+
 static struct vt_driver vt_fb_driver = {
 	.vd_name = "fb",
 	.vd_init = vt_fb_init,
@@ -135,7 +139,7 @@ vt_fb_mmap(struct vt_device *vd, vm_ooffset_t offset, vm_paddr_t *paddr,
 		return (ENODEV);
 
 	if (offset >= 0 && offset < info->fb_size) {
-		*paddr = info->fb_pbase + offset;
+		*paddr = vtophys(info->fb_vbase + offset);
 	#ifdef VM_MEMATTR_WRITE_COMBINING
 		*memattr = VM_MEMATTR_WRITE_COMBINING;
 	#endif
@@ -423,7 +427,7 @@ vt_fb_init(struct vt_device *vd)
 	if (info->fb_size == 0)
 		return (CN_DEAD);
 
-	if (info->fb_pbase == 0)
+	if (info->fb_pbase == 0 && info->fb_vbase == 0)
 		info->fb_flags |= FB_FLAG_NOMMAP;
 
 	if (info->fb_cmsize <= 0) {
_______________________________________________
freebsd-current@freebsd.org mailing list
http://lists.freebsd.org/mailman/listinfo/freebsd-current
To unsubscribe, send any mail to "freebsd-current-unsubscr...@freebsd.org"

Reply via email to