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"