Various license header consistency fixes (trivial).
[coreboot.git] / src / southbridge / via / k8t890 / k8t890_dram.c
index b32e5f870e7f3898d9f75c2cbd841c1c2f3b7907..84a41a46b8ed8f1e86efbe6ce385403fa071bbc9 100644 (file)
@@ -4,8 +4,8 @@
  * Copyright (C) 2007 Rudolf Marek <r.marek@assembler.cz>
  *
  * This program is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License v2 as published by
- * the Free Software Foundation.
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; version 2 of the License.
  *
  * This program is distributed in the hope that it will be useful,
  * but WITHOUT ANY WARRANTY; without even the implied warranty of
@@ -23,6 +23,7 @@
 #include <console/console.h>
 #include <cpu/x86/msr.h>
 #include <cpu/amd/mtrr.h>
+#include <pc80/mc146818rtc.h>
 #include <bitops.h>
 #include "k8t890.h"
 
@@ -91,7 +92,7 @@ static void get_memres(void *gp, struct device *dev, struct resource *res)
                (proposed_base < ((uint64_t) 0xffffffff) )) {
                resmax = res;
        }
-#if CONFIG_HAVE_HIGH_TABLES==1
+#if CONFIG_WRITE_HIGH_TABLES==1
 /* in arch/i386/boot/tables.c */
 extern uint64_t high_tables_base, high_tables_size;
 
@@ -104,18 +105,52 @@ extern uint64_t high_tables_base, high_tables_size;
 #endif
 }
 
+/*
+ *
+ */
+int
+k8m890_host_fb_size_get(void)
+{
+       struct device *dev = dev_find_device(PCI_VENDOR_ID_VIA,
+                                            PCI_DEVICE_ID_VIA_K8M890CE_3, 0);
+       unsigned char tmp;
+
+       tmp = pci_read_config8(dev, 0xA1);
+       tmp >>= 4;
+       if (tmp & 0x08)
+               return 4 << (tmp & 7);
+       else
+               return 0;
+}
 
 static void dram_init_fb(struct device *dev)
 {
        /* Important bits:
         * Enable the internal GFX bit 7 of reg 0xa1 plus in same reg:
-        * bits 6:4 X fbuffer size will be  2^(X+2) or 100 = 64MB, 101 = 128MB 
+        * bits 6:4 X fbuffer size will be  2^(X+2) or 100 = 64MB, 101 = 128MB
         * bits 3:0 BASE [31:28]
         * reg 0xa0 bits 7:1 BASE [27:21] bit0 enable CPU access
         */
        u8 tmp;
        uint64_t proposed_base;
-       unsigned int fbsize = (K8M890_FBSIZEMB * 1024 * 1024);
+       unsigned int fbbits = 0;
+       unsigned int fbsize;
+       int ret;
+
+
+       ret = get_option(&fbbits, "videoram_size");
+       if (ret) {
+               printk_warning("Failed to get videoram size (error %d), using default.\n", ret);
+               fbbits = 5;
+       }
+
+       if ((fbbits < 1) || (fbbits > 7)) {
+               printk_warning("Invalid videoram size (%d), using default.\n",
+                              4 << fbbits);
+               fbbits = 5;
+       }
+
+       fbsize = 4 << (fbbits + 20);
 
        resmax = NULL;
        search_global_resources(
@@ -131,13 +166,13 @@ static void dram_init_fb(struct device *dev)
        proposed_base = resmax->base + resmax->size - fbsize;
        resmax->size -= fbsize;
 
-       printk_debug("VIA FB proposed base: %llx\n", proposed_base);
+       printk_info("K8M890: Using a %dMB framebuffer.\n", 4 << fbbits);
 
        /* Step 1: enable UMA but no FB */
        pci_write_config8(dev, 0xa1, 0x80);
 
        /* Step 2: enough is just the FB size, the CPU accessible address is not needed */
-       tmp = ((log2(K8M890_FBSIZEMB) - 2) << 4) | 0x80;
+       tmp = (fbbits << 4) | 0x80;
        pci_write_config8(dev, 0xa1, tmp);
 
        /* TODO K8 needs some UMA fine tuning too maybe call some generic routine here? */