Patchwork i810 GFXUMA and Northbridge fixes

login
register
about
Submitter Joseph Smith
Date 2010-06-20 05:59:31
Message ID <4C1DAE43.5080801@settoplinux.org>
Download mbox | patch
Permalink /patch/1530/
State Accepted
Headers show

Comments

Joseph Smith - 2010-06-20 05:59:31
Hello,
This patch implements gfxuma on all supported i810 boards. Also some 
fix-ups to the i810 northbridge.c code.

Abuild tested all i810 boards.
Build and boot tested on soon to come i810e board.

Signed-off by: Joseph Smith <joe@settoplinux.org>
Stefan Reinauer - 2010-06-20 11:37:21
On 6/20/10 7:59 AM, Joseph Smith wrote:
> +	if (CONFIG_VIDEO_MB == 512) {
> +		igd_memory = (CONFIG_VIDEO_MB);
> +		printk(BIOS_DEBUG, "%dKB IGD UMA\n", igd_memory >> 10);
> +	} else {
> +		igd_memory = (CONFIG_VIDEO_MB * 1024);
> +		printk(BIOS_DEBUG, "%dMB IGD UMA\n", igd_memory >> 10);
> +	}
>   
You might want to read the SMRAM register intead of relying on the
setting of the config variable in case an invalid value sneaked in.

Other than that:

Acked-by: Stefan Reinauer <stepan@coresystems.de>
Joseph Smith - 2010-06-20 12:39:39
On 06/20/2010 07:37 AM, Stefan Reinauer wrote:
> On 6/20/10 7:59 AM, Joseph Smith wrote:
>> +	if (CONFIG_VIDEO_MB == 512) {
>> +		igd_memory = (CONFIG_VIDEO_MB);
>> +		printk(BIOS_DEBUG, "%dKB IGD UMA\n", igd_memory>>  10);
>> +	} else {
>> +		igd_memory = (CONFIG_VIDEO_MB * 1024);
>> +		printk(BIOS_DEBUG, "%dMB IGD UMA\n", igd_memory>>  10);
>> +	}
>>
> You might want to read the SMRAM register intead of relying on the
> setting of the config variable in case an invalid value sneaked in.
>
> Other than that:
>
> Acked-by: Stefan Reinauer <stepan@coresystems.de>
>
Ok, I can do that :-)
Joseph Smith - 2010-06-20 19:00:38
On 06/20/2010 07:37 AM, Stefan Reinauer wrote:
> On 6/20/10 7:59 AM, Joseph Smith wrote:
>> +	if (CONFIG_VIDEO_MB == 512) {
>> +		igd_memory = (CONFIG_VIDEO_MB);
>> +		printk(BIOS_DEBUG, "%dKB IGD UMA\n", igd_memory>>  10);
>> +	} else {
>> +		igd_memory = (CONFIG_VIDEO_MB * 1024);
>> +		printk(BIOS_DEBUG, "%dMB IGD UMA\n", igd_memory>>  10);
>> +	}
>>
> You might want to read the SMRAM register intead of relying on the
> setting of the config variable in case an invalid value sneaked in.
>
> Other than that:
>
> Acked-by: Stefan Reinauer <stepan@coresystems.de>
>
Done, thanks. r5635

Patch

Index: src/mainboard/mitac/6513wu/Kconfig
===================================================================
--- src/mainboard/mitac/6513wu/Kconfig	(revision 5634)
+++ src/mainboard/mitac/6513wu/Kconfig	(working copy)
@@ -28,6 +28,8 @@ 
 	select HAVE_PIRQ_TABLE
 	select UDELAY_TSC
 	select BOARD_ROMSIZE_KB_512
+	select HAVE_MAINBOARD_RESOURCES
+	select GFXUMA
 
 config MAINBOARD_DIR
 	string
Index: src/mainboard/mitac/6513wu/mainboard.c
===================================================================
--- src/mainboard/mitac/6513wu/mainboard.c	(revision 5634)
+++ src/mainboard/mitac/6513wu/mainboard.c	(working copy)
@@ -19,8 +19,14 @@ 
  */
 
 #include <device/device.h>
+#include <boot/tables.h>
 #include "chip.h"
 
+int add_mainboard_resources(struct lb_memory *mem)
+{
+	return add_northbridge_resources(mem);
+}
+
 struct chip_operations mainboard_ops = {
 	CHIP_NAME("Mitac 6513WU Mainboard")
 };
Index: src/mainboard/nec/powermate2000/Kconfig
===================================================================
--- src/mainboard/nec/powermate2000/Kconfig	(revision 5634)
+++ src/mainboard/nec/powermate2000/Kconfig	(working copy)
@@ -28,6 +28,8 @@ 
 	select HAVE_PIRQ_TABLE
 	select UDELAY_TSC
 	select BOARD_ROMSIZE_KB_512
+	select HAVE_MAINBOARD_RESOURCES
+	select GFXUMA
 
 config MAINBOARD_DIR
 	string
Index: src/mainboard/nec/powermate2000/mainboard.c
===================================================================
--- src/mainboard/nec/powermate2000/mainboard.c	(revision 5634)
+++ src/mainboard/nec/powermate2000/mainboard.c	(working copy)
@@ -19,8 +19,14 @@ 
  */
 
 #include <device/device.h>
+#include <boot/tables.h>
 #include "chip.h"
 
+int add_mainboard_resources(struct lb_memory *mem)
+{
+	return add_northbridge_resources(mem);
+}
+
 struct chip_operations mainboard_ops = {
 	CHIP_NAME("NEC PowerMate 2000 Mainboard")
 };
Index: src/mainboard/hp/e_vectra_p2706t/Kconfig
===================================================================
--- src/mainboard/hp/e_vectra_p2706t/Kconfig	(revision 5634)
+++ src/mainboard/hp/e_vectra_p2706t/Kconfig	(working copy)
@@ -31,6 +31,8 @@ 
 	select HAVE_PIRQ_TABLE
 	select UDELAY_TSC
 	select BOARD_ROMSIZE_KB_512
+	select HAVE_MAINBOARD_RESOURCES
+	select GFXUMA
 
 config MAINBOARD_DIR
 	string
Index: src/mainboard/hp/e_vectra_p2706t/mainboard.c
===================================================================
--- src/mainboard/hp/e_vectra_p2706t/mainboard.c	(revision 5634)
+++ src/mainboard/hp/e_vectra_p2706t/mainboard.c	(working copy)
@@ -19,8 +19,14 @@ 
  */
 
 #include <device/device.h>
+#include <boot/tables.h>
 #include "chip.h"
 
+int add_mainboard_resources(struct lb_memory *mem)
+{
+	return add_northbridge_resources(mem);
+}
+
 struct chip_operations mainboard_ops = {
 	CHIP_NAME("HP e-Vectra P2706T Mainboard")
 };
Index: src/mainboard/ecs/p6iwp-fe/Kconfig
===================================================================
--- src/mainboard/ecs/p6iwp-fe/Kconfig	(revision 5634)
+++ src/mainboard/ecs/p6iwp-fe/Kconfig	(working copy)
@@ -29,6 +29,8 @@ 
 	select HAVE_PIRQ_TABLE
 	select UDELAY_TSC
 	select BOARD_ROMSIZE_KB_512
+	select HAVE_MAINBOARD_RESOURCES
+	select GFXUMA
 
 config MAINBOARD_DIR
 	string
Index: src/mainboard/ecs/p6iwp-fe/mainboard.c
===================================================================
--- src/mainboard/ecs/p6iwp-fe/mainboard.c	(revision 5634)
+++ src/mainboard/ecs/p6iwp-fe/mainboard.c	(working copy)
@@ -19,8 +19,14 @@ 
  */
 
 #include <device/device.h>
+#include <boot/tables.h>
 #include "chip.h"
 
+int add_mainboard_resources(struct lb_memory *mem)
+{
+	return add_northbridge_resources(mem);
+}
+
 struct chip_operations mainboard_ops = {
 	CHIP_NAME("ECS P6IWP-Fe Mainboard")
 };
Index: src/mainboard/msi/ms6178/Kconfig
===================================================================
--- src/mainboard/msi/ms6178/Kconfig	(revision 5634)
+++ src/mainboard/msi/ms6178/Kconfig	(working copy)
@@ -27,6 +27,8 @@ 
 	select ROMCC
 	select HAVE_PIRQ_TABLE
 	select BOARD_ROMSIZE_KB_512
+	select HAVE_MAINBOARD_RESOURCES
+	select GFXUMA
 
 config MAINBOARD_DIR
 	string
Index: src/mainboard/msi/ms6178/mainboard.c
===================================================================
--- src/mainboard/msi/ms6178/mainboard.c	(revision 5634)
+++ src/mainboard/msi/ms6178/mainboard.c	(working copy)
@@ -19,8 +19,14 @@ 
  */
 
 #include <device/device.h>
+#include <boot/tables.h>
 #include "chip.h"
 
+int add_mainboard_resources(struct lb_memory *mem)
+{
+	return add_northbridge_resources(mem);
+}
+
 struct chip_operations mainboard_ops = {
 	CHIP_NAME("MSI MS-6178 Mainboard")
 };
Index: src/mainboard/asus/mew-am/Kconfig
===================================================================
--- src/mainboard/asus/mew-am/Kconfig	(revision 5634)
+++ src/mainboard/asus/mew-am/Kconfig	(working copy)
@@ -28,6 +28,8 @@ 
 	select HAVE_PIRQ_TABLE
 	select UDELAY_TSC
 	select BOARD_ROMSIZE_KB_512
+	select HAVE_MAINBOARD_RESOURCES
+	select GFXUMA
 
 config MAINBOARD_DIR
 	string
Index: src/mainboard/asus/mew-am/mainboard.c
===================================================================
--- src/mainboard/asus/mew-am/mainboard.c	(revision 5634)
+++ src/mainboard/asus/mew-am/mainboard.c	(working copy)
@@ -19,8 +19,14 @@ 
  */
 
 #include <device/device.h>
+#include <boot/tables.h>
 #include "chip.h"
 
+int add_mainboard_resources(struct lb_memory *mem)
+{
+	return add_northbridge_resources(mem);
+}
+
 struct chip_operations mainboard_ops = {
 	CHIP_NAME("ASUS MEW-AM Mainboard")
 };
Index: src/mainboard/asus/mew-vm/Kconfig
===================================================================
--- src/mainboard/asus/mew-vm/Kconfig	(revision 5634)
+++ src/mainboard/asus/mew-vm/Kconfig	(working copy)
@@ -28,6 +28,8 @@ 
 	select HAVE_PIRQ_TABLE
 	select UDELAY_TSC
 	select BOARD_ROMSIZE_KB_512
+	select HAVE_MAINBOARD_RESOURCES
+	select GFXUMA
 
 config MAINBOARD_DIR
 	string
Index: src/mainboard/asus/mew-vm/mainboard.c
===================================================================
--- src/mainboard/asus/mew-vm/mainboard.c	(revision 5634)
+++ src/mainboard/asus/mew-vm/mainboard.c	(working copy)
@@ -1,6 +1,12 @@ 
 #include <device/device.h>
+#include <boot/tables.h>
 #include "chip.h"
 
+int add_mainboard_resources(struct lb_memory *mem)
+{
+	return add_northbridge_resources(mem);
+}
+
 struct chip_operations mainboard_ops = {
 	CHIP_NAME("ASUS MEW-VM Mainboard")
 };
Index: src/northbridge/intel/i82810/northbridge.c
===================================================================
--- src/northbridge/intel/i82810/northbridge.c	(revision 5634)
+++ src/northbridge/intel/i82810/northbridge.c	(working copy)
@@ -2,6 +2,7 @@ 
  * This file is part of the coreboot project.
  *
  * Copyright (C) 2007 Corey Osgood <corey@slightlyhackish.com>
+ * Copyright (C) 2010 Joseph Smith <joe@settoplinux.org>
  *
  * This program is free software; you can redistribute it and/or modify
  * it under the terms of the GNU General Public License as published by
@@ -29,6 +30,7 @@ 
 #include <bitops.h>
 #include <cpu/cpu.h>
 #include "chip.h"
+#include <boot/tables.h>
 #include "northbridge.h"
 #include "i82810.h"
 
@@ -100,6 +102,18 @@ 
 	return tolm;
 }
 
+/* IGD UMA memory */
+uint64_t uma_memory_base=0, uma_memory_size=0;
+
+int add_northbridge_resources(struct lb_memory *mem)
+{
+	printk(BIOS_DEBUG, "Adding IGD UMA memory area\n");
+	lb_add_memory_range(mem, LB_MEM_RESERVED,
+		uma_memory_base, uma_memory_size);
+
+	return 0;
+}
+
 /* Table which returns the RAM size in MB when fed the DRP[7:4] or [3:0] value.
  * Note that 2 is a value which the DRP should never be programmed to.
  * Some size values appear twice, due to single-sided vs dual-sided banks.
@@ -118,66 +132,56 @@ 
 {
 	device_t mc_dev;
 	uint32_t pci_tolm;
+	int igd_memory = 0;
 
 	pci_tolm = find_pci_tolm(dev->link_list);
 	mc_dev = dev->link_list->children;
+	if (!mc_dev)
+		return;
 
-	if (mc_dev) {
-		/* Figure out which areas are/should be occupied by RAM.
-		 * This is all computed in kilobytes and converted to/from
-		 * the memory controller right at the edges.
-		 * Having different variables in different units is
-		 * too confusing to get right.  Kilobytes are good up to
-		 * 4 Terabytes of RAM...
-		 */
-		unsigned long tomk, tolmk;
-		int idx;
-		int drp_value;
+	unsigned long tomk, tolmk;
+	int idx, drp_value;
 
-		/* First get the value for DIMM 0. */
-		drp_value = pci_read_config8(mc_dev, DRP);
-		/* Translate it to MB and add to tomk. */
-		tomk = (unsigned long)(translate_i82810_to_mb[drp_value & 0xf]);
-		/* Now do the same for DIMM 1. */
-		drp_value = drp_value >> 4;	// >>= 4; //? mess with later
-		tomk += (unsigned long)(translate_i82810_to_mb[drp_value]);
+	if (CONFIG_VIDEO_MB == 512) {
+		igd_memory = (CONFIG_VIDEO_MB);
+		printk(BIOS_DEBUG, "%dKB IGD UMA\n", igd_memory >> 10);
+	} else {
+		igd_memory = (CONFIG_VIDEO_MB * 1024);
+		printk(BIOS_DEBUG, "%dMB IGD UMA\n", igd_memory >> 10);
+	}
 
-		printk(BIOS_DEBUG, "Setting RAM size to %ld MB\n", tomk);
+	/* Get the value for DIMM 0 and translate it to MB. */
+	drp_value = pci_read_config8(mc_dev, DRP);
+	tomk = (unsigned long)(translate_i82810_to_mb[drp_value & 0x0f]);
+	/* Get the value for DIMM 1 and translate it to MB. */
+	drp_value = drp_value >> 4;
+	tomk += (unsigned long)(translate_i82810_to_mb[drp_value]);
+	/* Convert tomk from MB to KB. */
+	tomk = tomk << 10;
+	tomk -= igd_memory;
 
-		/* Convert tomk from MB to KB. */
-		tomk = tomk << 10;
+	/* For reserving UMA memory in the memory map */
+	uma_memory_base = tomk * 1024ULL;
+	uma_memory_size = igd_memory * 1024ULL;
+	printk(BIOS_DEBUG, "Available memory: %ldKB\n", tomk);
 
-#if CONFIG_VIDEO_MB
-		/* Check for VGA reserved memory. */
-		if (CONFIG_VIDEO_MB == 512) {
-			tomk -= 512;
-			printk(BIOS_DEBUG, "Allocating %s RAM for VGA\n", "512KB");
-		} else if (CONFIG_VIDEO_MB == 1) {
-			tomk -= 1024 ;
-			printk(BIOS_DEBUG, "Allocating %s RAM for VGA\n", "1MB");
-		} else {
-			printk(BIOS_DEBUG, "Allocating %s RAM for VGA\n", "0MB");
-		}
-#endif
+	/* Compute the top of low memory. */
+	tolmk = pci_tolm >> 10;
+	if (tolmk >= tomk) {
+		/* The PCI hole does does not overlap the memory. */
+		tolmk = tomk;
+	}
 
-		/* Compute the top of Low memory. */
-		tolmk = pci_tolm >> 10;
-		if (tolmk >= tomk) {
-			/* The PCI hole does does not overlap the memory. */
-			tolmk = tomk;
-		}
+	/* Report the memory regions. */
+	idx = 10;
+	ram_resource(dev, idx++, 0, 640);
+	ram_resource(dev, idx++, 768, tolmk - 768);
 
-		/* Report the memory regions. */
-		idx = 10;
-		ram_resource(dev, idx++, 0, 640);
-		ram_resource(dev, idx++, 768, tolmk - 768);
-
 #if CONFIG_WRITE_HIGH_TABLES==1
-		/* Leave some space for ACPI, PIRQ and MP tables */
-		high_tables_base = (tomk - HIGH_TABLES_SIZE) * 1024;
-		high_tables_size = HIGH_TABLES_SIZE * 1024;
+	/* Leave some space for ACPI, PIRQ and MP tables */
+	high_tables_base = (tomk - HIGH_TABLES_SIZE) * 1024;
+	high_tables_size = HIGH_TABLES_SIZE * 1024;
 #endif
-	}
 	assign_resources(dev->link_list);
 }