https://bugs.freebsd.org/bugzilla/show_bug.cgi?id=298105

--- Comment #3 from Thomas Goldthorpe <[email protected]> ---

>From a git pull of release/15.1.0-p3, git diff -p format

Note, fixed a typo in vt_early_fb.c that made it into the context diffs in
prior comments.  Also note, vt_early_fb.c is just a bounds fix to bpp, it is
optional to include it as a patch to the system.

diff --git a/sys/amd64/amd64/pmap.c b/sys/amd64/amd64/pmap.c
index 497c85c3f..f7c76dc1b 100644
--- a/sys/amd64/amd64/pmap.c
+++ b/sys/amd64/amd64/pmap.c
@@ -1676,7 +1676,20 @@ nkpt_init(vm_paddr_t addr)
         * before vm_mem_init() and pmap_init(). 20MB for a frame buffer
         * is not uncommon.
         */
-       pt_pages += 32;         /* 64MB additional slop. */
+
+       /*
+        * The 32 that was here was based on sizing of yesteryear.  Thing
+        * is, modern framebuffers can easily be 90MB for the efifb portion.
+        * Lets be generous and give it twice that, or 192MB.  I know I use
90MB
+        * of it at boot on a 5120x2880 (90MB is 8192stride*2880line*4byte)
+        * framebuffer.  This has been manifesting as a trap 12 in early
+        * boot below because of passing the limit of pages allocated here.
+        * Those traps occur in the tmpsize/pmap_kenter_attr() loop when it
+        * hits the invalid space provided above it in the code.
+        *
+        * There are places NKPT are discussed that need new updating too.
+        */
+       pt_pages += 96;         /* 192MB additional slop. */
 #endif
        nkpt = pt_pages;
 }
@@ -9404,10 +9417,21 @@ pmap_mapdev_internal(vm_paddr_t pa, vm_size_t size, int
mode, int flags)
        pa = trunc_page(pa);

        if (!pmap_initialized) {
+               printf("%s: avail: 0x%016lx end: 0x%016lx free: 0x%016lx
(%luMB) req-paddr: 0x%016lx req-size:
%lu\n",__func__,virtual_avail,MAX(KERNBASE + nkpt * NBPDR,
kernel_vm_end),MAX(KERNBASE + nkpt * NBPDR,
kernel_vm_end)-virtual_avail,(MAX(KERNBASE + nkpt * NBPDR,
kernel_vm_end)-virtual_avail)/1024L/1024L,pa,size);
                va = 0;
                for (i = 0; i < PMAP_PREINIT_MAPPING_COUNT; i++) {
                        ppim = pmap_preinit_mapping + i;
                        if (ppim->va == 0) {
+                               /*
+                                * The code past this happily does the
erroneous allocation past virtual addresses
+                                * reserved.  The trap 12 crashes in early boot
seen because of this manifest themselves
+                                * farther in the tmpsize loop doing
pmap_kenter_attr().
+                                *
+                                * Doing a panic() here, but, perhaps this
should return errors to the caller and
+                                * let them deal with it?  That may require too
much other coding, however.
+                                */
+                               if((virtual_avail+size)>=(MAX(KERNBASE + nkpt *
NBPDR, kernel_vm_end)))
+                                       panic("%s: passing end of kernel
virtual addresses allocated", __func__);
                                ppim->pa = pa;
                                ppim->sz = size;
                                ppim->mode = mode;
@@ -9450,11 +9474,17 @@ pmap_mapdev_internal(vm_paddr_t pa, vm_size_t size, int
mode, int flags)
                if (va == 0)
                        panic("%s: Couldn't allocate KVA", __func__);
        }
+
+
        for (tmpsize = 0; tmpsize < size; tmpsize += PAGE_SIZE)
                pmap_kenter_attr(va + tmpsize, pa + tmpsize, mode);
+
        pmap_invalidate_range(kernel_pmap, va, va + tmpsize);
+
+
        if ((flags & MAPDEV_FLUSHCACHE) != 0)
                pmap_invalidate_cache_range(va, va + tmpsize);
+
        return ((void *)(va + offset));
 }

diff --git a/sys/arm64/arm64/pmap.c b/sys/arm64/arm64/pmap.c
index 12ab8750c..be2b50ff4 100644
--- a/sys/arm64/arm64/pmap.c
+++ b/sys/arm64/arm64/pmap.c
@@ -303,7 +303,7 @@ VM_PAGE_TO_PV_LIST_LOCK(vm_page_t m)
 struct pmap kernel_pmap_store;

 /* Used for mapping ACPI memory before VM is initialized */
-#define        PMAP_PREINIT_MAPPING_COUNT      32
+#define        PMAP_PREINIT_MAPPING_COUNT      96
 #define        PMAP_PREINIT_MAPPING_SIZE       (PMAP_PREINIT_MAPPING_COUNT *
L2_SIZE)
 static vm_offset_t preinit_map_va;     /* Start VA of pre-init mapping space
*/
 static int vm_initialized = 0;         /* No need to use pre-init maps when
set */
diff --git a/sys/arm64/include/pte.h b/sys/arm64/include/pte.h
index 464d8c941..846520640 100644
--- a/sys/arm64/include/pte.h
+++ b/sys/arm64/include/pte.h
@@ -211,7 +211,11 @@ typedef    uint64_t        pt_entry_t;             /* page
table entry */
  * A substantial portion of this is to make sure that we can cope with 4K
  * framebuffers in early boot, assuming a common 4K resolution @ 32-bit depth.
  */
-#define        PMAP_MAPDEV_EARLY_SIZE  (L2_SIZE * 20)
+/*
+ * Framebuffers of 5k and 8k now easily possible with 32 bit depth
+ * Be sure these can work.
+ */
+#define        PMAP_MAPDEV_EARLY_SIZE  (L2_SIZE * 60)

 #if PAGE_SIZE == PAGE_SIZE_4K
 #define        L0_ENTRIES_SHIFT 9
diff --git a/sys/dev/vt/hw/fb/vt_early_fb.c b/sys/dev/vt/hw/fb/vt_early_fb.c
index 9d66f5cd1..358bdaf98 100644
--- a/sys/dev/vt/hw/fb/vt_early_fb.c
+++ b/sys/dev/vt/hw/fb/vt_early_fb.c
@@ -282,6 +282,14 @@ vt_efb_init(struct vt_device *vd)

        /* Get pixel storage size. */
        info->fb_bpp = info->fb_stride / info->fb_width * 8;
+       
+       /*
+        * XXX: above compuation fails with big strides on large framebuffers
+        * an 8192 stride on 5120 line gives 32768/5120*8 => 5*8 => 40 bits
+        */
+
+       if((info->fb_bpp)>32)
+               info->fb_bpp = 32;

 #ifdef FDT
        vt_efb_initialize(info, node);
diff --git a/sys/dev/vt/vt.h b/sys/dev/vt/vt.h
index 4abe99e4a..5a46db6dc 100644
--- a/sys/dev/vt/vt.h
+++ b/sys/dev/vt/vt.h
@@ -222,10 +222,15 @@ struct vt_buf {
        term_char_t             **vb_rows;      /* (u) Array of rows */
 };

+/*
+ * Modern machine console debugging has much more to scroll through, 500 ->
5000
+ * covers most of it
+ */
+
 #ifdef SC_HISTORY_SIZE
 #define        VBF_DEFAULT_HISTORY_SIZE        SC_HISTORY_SIZE
 #else
-#define        VBF_DEFAULT_HISTORY_SIZE        500
+#define        VBF_DEFAULT_HISTORY_SIZE        5000
 #endif

 void vtbuf_lock(struct vt_buf *);
@@ -413,11 +418,15 @@ void vt_upgrade(struct vt_device *vd);
 #define        PIXEL_WIDTH(w)  ((w) / 8)
 #define        PIXEL_HEIGHT(h) ((h) / 16)

+/*
+ * Modern framebuffers are much larger than 4096x2048, they could be 8192
landscape or portrait
+ */
+
 #ifndef VT_FB_MAX_WIDTH
-#define        VT_FB_MAX_WIDTH 4096
+#define        VT_FB_MAX_WIDTH 8192
 #endif
 #ifndef VT_FB_MAX_HEIGHT
-#define        VT_FB_MAX_HEIGHT        2400
+#define        VT_FB_MAX_HEIGHT 8192
 #endif

 /* name argument is not used yet. */

-- 
You are receiving this mail because:
You are the assignee for the bug.

Reply via email to