On Tue, Feb 02, 2016 at 03:56:13AM -0500, James Hastings wrote:
> On 2/2/16, Jonathan Gray <j...@jsg.id.au> wrote:
> >
> > The bios may have to be fetched from the acpi VFCT table for the uefi case.
> >
> > Here's a quick attempt at trying to avoid the crash at least:
> >
> 
> Different panic this time.

Thanks.  Here is a version modified to have a better check for efi.
Still may need some things shuffled around to deal with the root hook.

Index: radeon.h
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/radeon/radeon.h,v
retrieving revision 1.17
diff -u -p -r1.17 radeon.h
--- radeon.h    27 Sep 2015 11:09:26 -0000      1.17
+++ radeon.h    2 Feb 2016 07:33:39 -0000
@@ -1554,6 +1554,7 @@ struct radeon_device {
        struct drm_device               *ddev;
        struct pci_dev                  *pdev;
 
+       struct pci_attach_args          *pa;
        pci_chipset_tag_t               pc;
        pcitag_t                        pa_tag;
        pci_intr_handle_t               intrh;
@@ -1595,6 +1596,7 @@ struct radeon_device {
        /* BIOS */
        uint8_t                         *bios;
        bool                            is_atom_bios;
+       int                             uefi;
        uint16_t                        bios_header_start;
        struct radeon_bo                *stollen_vga_memory;
        /* Register mmio */
Index: radeon_bios.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/radeon/radeon_bios.c,v
retrieving revision 1.6
diff -u -p -r1.6 radeon_bios.c
--- radeon_bios.c       12 Apr 2015 12:14:30 -0000      1.6
+++ radeon_bios.c       2 Feb 2016 07:34:17 -0000
@@ -51,8 +51,10 @@ radeon_read_platform_bios(struct radeon_
        bus_size_t size = 256 * 1024; /* ??? */
        uint8_t *found = NULL;
        int i;
-       
-       
+
+       if (rdev->uefi)
+               return false;
+
        if (!(rdev->flags & RADEON_IS_IGP))
                if (!radeon_card_posted(rdev))
                        return false;
Index: radeon_kms.c
===================================================================
RCS file: /cvs/src/sys/dev/pci/drm/radeon/radeon_kms.c,v
retrieving revision 1.46
diff -u -p -r1.46 radeon_kms.c
--- radeon_kms.c        6 Jan 2016 19:56:08 -0000       1.46
+++ radeon_kms.c        2 Feb 2016 09:16:40 -0000
@@ -41,6 +41,15 @@
 extern int vga_console_attached;
 #endif
 
+#ifdef __amd64__
+#include "efifb.h"
+#endif
+
+#if NEFIFB > 0
+#include <machine/biosvar.h>
+#include <machine/efifbvar.h>
+#endif
+
 #define DRIVER_NAME            "radeon"
 #define DRIVER_DESC            "ATI Radeon"
 #define DRIVER_DATE            "20080613"
@@ -481,6 +490,7 @@ radeondrm_attach_kms(struct device *pare
        id_entry = drm_find_description(PCI_VENDOR(pa->pa_id),
            PCI_PRODUCT(pa->pa_id), radeondrm_pciidlist);
        rdev->flags = id_entry->driver_data;
+       rdev->pa = pa;
        rdev->pc = pa->pa_pc;
        rdev->pa_tag = pa->pa_tag;
        rdev->iot = pa->pa_iot;
@@ -501,6 +511,15 @@ radeondrm_attach_kms(struct device *pare
                vga_console_attached = 1;
 #endif
        }
+#if NEFIFB > 0
+       if (efifb_is_console(pa))
+               rdev->console = 1;
+       if (bios_efiinfo != NULL)
+               rdev->uefi = 1;
+#else
+       rdev->uefi = 0;
+#endif
+
 #endif
 
 #define RADEON_PCI_MEM         0x10
@@ -713,6 +732,12 @@ radeondrm_attachhook(struct device *self
 #ifdef __sparc64__
        fbwscons_setcolormap(&rdev->sf, radeondrm_setcolor);
 #endif
+
+#if NEFIFB > 0
+       if (efifb_is_console(rdev->pa))
+               efifb_cndetach();
+#endif
+
        drm_modeset_lock_all(rdev->ddev);
        drm_fb_helper_restore_fbdev_mode((void *)rdev->mode_info.rfbdev);
        drm_modeset_unlock_all(rdev->ddev);

Reply via email to