powerpc, fbdev: Use NV_CMODE and NV_VMODE only when CONFIG_PPC32 && CONFIG_PPC_PMAC...
authorFinn Thain <fthain@telegraphics.com.au>
Tue, 15 Jan 2019 04:18:56 +0000 (15:18 +1100)
committerGreg Kroah-Hartman <gregkh@linuxfoundation.org>
Tue, 22 Jan 2019 09:21:45 +0000 (10:21 +0100)
This patch addresses inconsistencies in Mac framebuffer drivers and their
use of Kconfig symbols relating to NVRAM, so PPC64 can use CONFIG_NVRAM.

The defined(CONFIG_NVRAM) condition is replaced with the weaker
IS_REACHABLE(CONFIG_NVRAM) condition, like atari_scsi.

Macintosh framebuffer drivers use default settings for color mode and
video mode that are found in NVRAM. On PCI Macs, MacOS stores display
settings in the Name Registry (NR) partition in NVRAM*. On NuBus Macs,
there is no NR partition and MacOS stores display mode settings in PRAM**.

Early-model Macs are the ones most likely to benefit from these settings,
since they are more likely to have a fixed-frequency monitor connected to
the built-in framebuffer device. Moreover, a single NV_CMODE value and
a single NV_VMODE value provide for only one display.

The NV_CMODE and NV_VMODE constants are apparently offsets into the NR
partition for Old World machines. This also suggests that these defaults
are not useful on later models. The NR partition seems to be optional on
New World machines. CONFIG_NVRAM cannot be enabled on PPC64 at present.

It is safe to say that NVRAM support in PowerMac fbdev drivers is only
applicable to CONFIG_PPC32 so make this condition explicit. This means
matroxfb driver won't crash on PPC64 when CONFIG_NVRAM becomes available
there.

For imsttfb, add the missing CONFIG_NVRAM test to prevent a build failure,
since PPC64 does not implement nvram_read_byte(). Also add a missing
machine_is(powermac) check. Change the inconsistent dependency on
CONFIG_PPC and the matching #ifdef tests to CONFIG_PPC_PMAC.

For valkyriefb, to improve clarity and consistency with the other PowerMac
fbdev drivers, test for CONFIG_PPC_PMAC instead of !CONFIG_MAC. Remove a
bogus comment regarding PRAM.

* See GetPreferredConfiguration and SavePreferredConfiguration in
"Designing PCI Cards and Drivers for Power Macintosh Computers".

** See SetDefaultMode and GetDefaultMode in "Designing Cards and Drivers
for the Macintosh Family".

Signed-off-by: Finn Thain <fthain@telegraphics.com.au>
Signed-off-by: Greg Kroah-Hartman <gregkh@linuxfoundation.org>
drivers/video/fbdev/Kconfig
drivers/video/fbdev/controlfb.c
drivers/video/fbdev/imsttfb.c
drivers/video/fbdev/matrox/matroxfb_base.c
drivers/video/fbdev/platinumfb.c
drivers/video/fbdev/valkyriefb.c

index ae7712c9687a63db39fc256bc0e298e00cecc278..58a9590c9db6d377023ebb69ee01fd12d9c33962 100644 (file)
@@ -536,7 +536,7 @@ config FB_IMSTT
        bool "IMS Twin Turbo display support"
        depends on (FB = y) && PCI
        select FB_CFB_IMAGEBLIT
-       select FB_MACMODES if PPC
+       select FB_MACMODES if PPC_PMAC
        help
          The IMS Twin Turbo is a PCI-based frame buffer card bundled with
          many Macintosh and compatible computers.
index 9cb0ef7ac29e92cec7e66cc8c4e7c54bca50cf68..7af8db28bb80872d7f6598b7f1350dc4c2893f00 100644 (file)
@@ -411,35 +411,23 @@ static int __init init_control(struct fb_info_control *p)
        full = p->total_vram == 0x400000;
 
        /* Try to pick a video mode out of NVRAM if we have one. */
-#ifdef CONFIG_NVRAM
-       if (default_cmode == CMODE_NVRAM) {
+       cmode = default_cmode;
+       if (IS_REACHABLE(CONFIG_NVRAM) && cmode == CMODE_NVRAM)
                cmode = nvram_read_byte(NV_CMODE);
-               if(cmode < CMODE_8 || cmode > CMODE_32)
-                       cmode = CMODE_8;
-       } else
-#endif
-               cmode=default_cmode;
-#ifdef CONFIG_NVRAM
-       if (default_vmode == VMODE_NVRAM) {
+       if (cmode < CMODE_8 || cmode > CMODE_32)
+               cmode = CMODE_8;
+
+       vmode = default_vmode;
+       if (IS_REACHABLE(CONFIG_NVRAM) && vmode == VMODE_NVRAM)
                vmode = nvram_read_byte(NV_VMODE);
-               if (vmode < 1 || vmode > VMODE_MAX ||
-                   control_mac_modes[vmode - 1].m[full] < cmode) {
-                       sense = read_control_sense(p);
-                       printk("Monitor sense value = 0x%x, ", sense);
-                       vmode = mac_map_monitor_sense(sense);
-                       if (control_mac_modes[vmode - 1].m[full] < cmode)
-                               vmode = VMODE_640_480_60;
-               }
-       } else
-#endif
-       {
-               vmode=default_vmode;
-               if (control_mac_modes[vmode - 1].m[full] < cmode) {
-                       if (cmode > CMODE_8)
-                               cmode--;
-                       else
-                               vmode = VMODE_640_480_60;
-               }
+       if (vmode < 1 || vmode > VMODE_MAX ||
+           control_mac_modes[vmode - 1].m[full] < cmode) {
+               sense = read_control_sense(p);
+               printk(KERN_CONT "Monitor sense value = 0x%x, ", sense);
+               vmode = mac_map_monitor_sense(sense);
+               if (control_mac_modes[vmode - 1].m[full] < 0)
+                       vmode = VMODE_640_480_60;
+               cmode = min(cmode, control_mac_modes[vmode - 1].m[full]);
        }
 
        /* Initialize info structure */
index 901ca4ed10e9c923c9e332d8b20523a121270b4f..5d9670daf60ec18fee03e8c896d1f92617606048 100644 (file)
@@ -30,9 +30,8 @@
 #include <asm/io.h>
 #include <linux/uaccess.h>
 
-#if defined(CONFIG_PPC)
+#if defined(CONFIG_PPC_PMAC)
 #include <linux/nvram.h>
-#include <asm/prom.h>
 #include "macmodes.h"
 #endif
 
@@ -327,14 +326,13 @@ enum {
        TVP = 1
 };
 
-#define USE_NV_MODES           1
 #define INIT_BPP               8
 #define INIT_XRES              640
 #define INIT_YRES              480
 
 static int inverse = 0;
 static char fontname[40] __initdata = { 0 };
-#if defined(CONFIG_PPC)
+#if defined(CONFIG_PPC_PMAC)
 static signed char init_vmode = -1, init_cmode = -1;
 #endif
 
@@ -1390,8 +1388,8 @@ static void init_imstt(struct fb_info *info)
                }
        }
 
-#if USE_NV_MODES && defined(CONFIG_PPC32)
-       {
+#if defined(CONFIG_PPC_PMAC) && defined(CONFIG_PPC32)
+       if (IS_REACHABLE(CONFIG_NVRAM) && machine_is(powermac)) {
                int vmode = init_vmode, cmode = init_cmode;
 
                if (vmode == -1) {
@@ -1409,12 +1407,13 @@ static void init_imstt(struct fb_info *info)
                        info->var.yres = info->var.yres_virtual = INIT_YRES;
                        info->var.bits_per_pixel = INIT_BPP;
                }
-       }
-#else
-       info->var.xres = info->var.xres_virtual = INIT_XRES;
-       info->var.yres = info->var.yres_virtual = INIT_YRES;
-       info->var.bits_per_pixel = INIT_BPP;
+       } else
 #endif
+       {
+               info->var.xres = info->var.xres_virtual = INIT_XRES;
+               info->var.yres = info->var.yres_virtual = INIT_YRES;
+               info->var.bits_per_pixel = INIT_BPP;
+       }
 
        if ((info->var.xres * info->var.yres) * (info->var.bits_per_pixel >> 3) > info->fix.smem_len
            || !(compute_imstt_regvals(par, info->var.xres, info->var.yres))) {
@@ -1565,7 +1564,7 @@ imsttfb_setup(char *options)
                        inverse = 1;
                        fb_invert_cmaps();
                }
-#if defined(CONFIG_PPC)
+#if defined(CONFIG_PPC_PMAC)
                else if (!strncmp(this_opt, "vmode:", 6)) {
                        int vmode = simple_strtoul(this_opt+6, NULL, 0);
                        if (vmode > 0 && vmode <= VMODE_MAX)
index 0a4e5bad33f4881fff1ece30aeecae530736a465..d11b5e6210edb4c8823eaf2d3e48e8114dbac38e 100644 (file)
@@ -1872,10 +1872,11 @@ static int initMatrox2(struct matrox_fb_info *minfo, struct board *b)
 #ifndef MODULE
        if (machine_is(powermac)) {
                struct fb_var_screeninfo var;
+
                if (default_vmode <= 0 || default_vmode > VMODE_MAX)
                        default_vmode = VMODE_640_480_60;
-#ifdef CONFIG_NVRAM
-               if (default_cmode == CMODE_NVRAM)
+#if defined(CONFIG_PPC32)
+               if (IS_REACHABLE(CONFIG_NVRAM) && default_cmode == CMODE_NVRAM)
                        default_cmode = nvram_read_byte(NV_CMODE);
 #endif
                if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
index bf6b7fb83cf472d173de7ba79851426e4b738cea..76f299375a00ea9e1deb290bea07e962ac8ab8ff 100644 (file)
@@ -345,23 +345,18 @@ static int platinum_init_fb(struct fb_info *info)
 
        sense = read_platinum_sense(pinfo);
        printk(KERN_INFO "platinumfb: Monitor sense value = 0x%x, ", sense);
-       if (default_vmode == VMODE_NVRAM) {
-#ifdef CONFIG_NVRAM
+
+       if (IS_REACHABLE(CONFIG_NVRAM) && default_vmode == VMODE_NVRAM)
                default_vmode = nvram_read_byte(NV_VMODE);
-               if (default_vmode <= 0 || default_vmode > VMODE_MAX ||
-                   !platinum_reg_init[default_vmode-1])
-#endif
-                       default_vmode = VMODE_CHOOSE;
-       }
-       if (default_vmode == VMODE_CHOOSE) {
+       if (default_vmode <= 0 || default_vmode > VMODE_MAX ||
+           !platinum_reg_init[default_vmode - 1]) {
                default_vmode = mac_map_monitor_sense(sense);
+               if (!platinum_reg_init[default_vmode - 1])
+                       default_vmode = VMODE_640_480_60;
        }
-       if (default_vmode <= 0 || default_vmode > VMODE_MAX)
-               default_vmode = VMODE_640_480_60;
-#ifdef CONFIG_NVRAM
-       if (default_cmode == CMODE_NVRAM)
+
+       if (IS_REACHABLE(CONFIG_NVRAM) && default_cmode == CMODE_NVRAM)
                default_cmode = nvram_read_byte(NV_CMODE);
-#endif
        if (default_cmode < CMODE_8 || default_cmode > CMODE_32)
                default_cmode = CMODE_8;
        /*
index d51c3a8009cb50ef39145c8eca00f7eb295b6b79..e04fde9c1fcdeaca9300c365d8d39a76cb463071 100644 (file)
 #include "macmodes.h"
 #include "valkyriefb.h"
 
-#ifdef CONFIG_MAC
-/* We don't yet have functions to read the PRAM... perhaps we can
-   adapt them from the PPC code? */
-static int default_vmode = VMODE_CHOOSE;
-static int default_cmode = CMODE_8;
-#else
 static int default_vmode = VMODE_NVRAM;
 static int default_cmode = CMODE_NVRAM;
-#endif
 
 struct fb_par_valkyrie {
        int     vmode, cmode;
@@ -283,24 +276,21 @@ static void __init valkyrie_choose_mode(struct fb_info_valkyrie *p)
        printk(KERN_INFO "Monitor sense value = 0x%x\n", p->sense);
 
        /* Try to pick a video mode out of NVRAM if we have one. */
-#if !defined(CONFIG_MAC) && defined(CONFIG_NVRAM)
-       if (default_vmode == VMODE_NVRAM) {
+#ifdef CONFIG_PPC_PMAC
+       if (IS_REACHABLE(CONFIG_NVRAM) && default_vmode == VMODE_NVRAM)
                default_vmode = nvram_read_byte(NV_VMODE);
-               if (default_vmode <= 0
-                || default_vmode > VMODE_MAX
-                || !valkyrie_reg_init[default_vmode - 1])
-                       default_vmode = VMODE_CHOOSE;
-       }
 #endif
-       if (default_vmode == VMODE_CHOOSE)
+       if (default_vmode <= 0 || default_vmode > VMODE_MAX ||
+           !valkyrie_reg_init[default_vmode - 1]) {
                default_vmode = mac_map_monitor_sense(p->sense);
-       if (!valkyrie_reg_init[default_vmode - 1])
-               default_vmode = VMODE_640_480_67;
-#if !defined(CONFIG_MAC) && defined(CONFIG_NVRAM)
-       if (default_cmode == CMODE_NVRAM)
+               if (!valkyrie_reg_init[default_vmode - 1])
+                       default_vmode = VMODE_640_480_67;
+       }
+
+#ifdef CONFIG_PPC_PMAC
+       if (IS_REACHABLE(CONFIG_NVRAM) && default_cmode == CMODE_NVRAM)
                default_cmode = nvram_read_byte(NV_CMODE);
 #endif
-
        /*
         * Reduce the pixel size if we don't have enough VRAM or bandwidth.
         */