[SeaBIOS] [PATCH 2/5] pci: activate two-pass pci initialization code

2011-07-11 Thread Gerd Hoffmann
This patch actually enables the two-pass pci initialization and
deactivates the old pci initialization bits.

Signed-off-by: Gerd Hoffmann kra...@redhat.com
---
 src/pciinit.c |   38 ++
 1 files changed, 34 insertions(+), 4 deletions(-)

diff --git a/src/pciinit.c b/src/pciinit.c
index 9314698..a26eb77 100644
--- a/src/pciinit.c
+++ b/src/pciinit.c
@@ -123,6 +123,8 @@ static void pci_set_io_region_addr(u16 bdf, int region_num, 
u32 addr)
  */
 static int pci_bios_allocate_region(u16 bdf, int region_num)
 {
+return 0;
+
 struct pci_region *r;
 u32 ofs = pci_bar(bdf, region_num);
 
@@ -184,6 +186,8 @@ static int pci_bios_allocate_region(u16 bdf, int region_num)
 
 static void pci_bios_allocate_regions(struct pci_device *pci, void *arg)
 {
+return;
+
 int i;
 for (i = 0; i  PCI_NUM_REGIONS; i++) {
 int is_64bit = pci_bios_allocate_region(pci-bdf, i);
@@ -239,6 +243,7 @@ static const struct pci_device_id pci_isa_bridge_tbl[] = {
 #define PCI_PREF_MEMORY_ALIGN   (1UL  20)
 #define PCI_PREF_MEMORY_SHIFT   16
 
+#if 0
 static void pci_bios_init_device_bridge(struct pci_device *pci, void *arg)
 {
 u16 bdf = pci-bdf;
@@ -323,6 +328,7 @@ static void pci_bios_init_device_bridge(struct pci_device 
*pci, void *arg)
 
 pci_config_maskw(bdf, PCI_BRIDGE_CONTROL, 0, PCI_BRIDGE_CTL_SERR);
 }
+#endif
 
 static void storage_ide_init(struct pci_device *pci, void *arg)
 {
@@ -374,9 +380,11 @@ static const struct pci_device_id pci_class_tbl[] = {
 PCI_DEVICE_CLASS(PCI_VENDOR_ID_APPLE, 0x0017, 0xff00, apple_macio_init),
 PCI_DEVICE_CLASS(PCI_VENDOR_ID_APPLE, 0x0022, 0xff00, apple_macio_init),
 
+#if 0
 /* PCI bridge */
 PCI_DEVICE_CLASS(PCI_ANY_ID, PCI_ANY_ID, PCI_CLASS_BRIDGE_PCI,
  pci_bios_init_device_bridge),
+#endif
 
 /* default */
 PCI_DEVICE(PCI_ANY_ID, PCI_ANY_ID, pci_bios_allocate_regions),
@@ -607,6 +615,7 @@ static void pci_bios_check_device(struct pci_bus *bus, 
struct pci_device *dev)
 
 static void pci_bios_map_device(struct pci_bus *bus, struct pci_device *dev)
 {
+u16 bdf = dev-bdf;
 int type, i;
 
 if (dev-class == PCI_CLASS_BRIDGE_PCI) {
@@ -614,13 +623,32 @@ static void pci_bios_map_device(struct pci_bus *bus, 
struct pci_device *dev)
 return;
 }
 struct pci_bus *s = busses + dev-secondary_bus;
+u32 base, limit;
 
 for (type = 0; type  PCI_REGION_TYPE_COUNT; type++) {
 s-r[type].base = pci_bios_bus_get_addr(bus, type, 
s-r[type].size);
 }
 dprintf(1, PCI: init bases bus %d (secondary)\n, dev-secondary_bus);
 pci_bios_init_bus_bases(s);
-/* TODO: commit assignments */
+
+base = s-r[PCI_REGION_TYPE_IO].base;
+limit = base + s-r[PCI_REGION_TYPE_IO].size - 1;
+pci_config_writeb(bdf, PCI_IO_BASE, base  PCI_IO_SHIFT);
+pci_config_writew(bdf, PCI_IO_BASE_UPPER16, 0);
+pci_config_writeb(bdf, PCI_IO_LIMIT, limit  PCI_IO_SHIFT);
+pci_config_writew(bdf, PCI_IO_LIMIT_UPPER16, 0);
+
+base = s-r[PCI_REGION_TYPE_MEM].base;
+limit = base + s-r[PCI_REGION_TYPE_MEM].size - 1;
+pci_config_writew(bdf, PCI_MEMORY_BASE, base  PCI_MEMORY_SHIFT);
+pci_config_writew(bdf, PCI_MEMORY_LIMIT, limit  PCI_MEMORY_SHIFT);
+
+base = s-r[PCI_REGION_TYPE_PREFMEM].base;
+limit = base + s-r[PCI_REGION_TYPE_PREFMEM].size - 1;
+pci_config_writew(bdf, PCI_PREF_MEMORY_BASE, base  
PCI_PREF_MEMORY_SHIFT);
+pci_config_writew(bdf, PCI_PREF_MEMORY_LIMIT, limit  
PCI_PREF_MEMORY_SHIFT);
+pci_config_writel(bdf, PCI_PREF_BASE_UPPER32, 0);
+pci_config_writel(bdf, PCI_PREF_LIMIT_UPPER32, 0);
 
 pci_bios_map_device_in_bus(dev-secondary_bus);
 return;
@@ -637,7 +665,7 @@ static void pci_bios_map_device(struct pci_bus *bus, struct 
pci_device *dev)
 dprintf(1,   bar %d, addr %x, size %x [%s]\n,
 i, addr, dev-bars[i].size,
 dev-bars[i].addr  PCI_BASE_ADDRESS_SPACE_IO ? io : mem);
-/* TODO: commit assignments */
+pci_set_io_region_addr(bdf, i, addr);
 
 if (dev-bars[i].is64) {
 i++;
@@ -758,8 +786,7 @@ pci_setup(void)
 memset(busses, 0, sizeof(*busses) * busses_count);
 pci_bios_check_device_in_bus(0 /* host bus */);
 if (pci_bios_init_root_regions(start, end) != 0) {
-dprintf(1, PCI: out of address space\n);
-/* Hmm, what do now? */
+panic(PCI: out of address space\n);
 }
 
 dprintf(1, === PCI new allocation pass #2 ===\n);
@@ -767,11 +794,14 @@ pci_setup(void)
 pci_bios_init_bus_bases(busses[0]);
 pci_bios_map_device_in_bus(0 /* host bus */);
 
+#if 0
 dprintf(1, === PCI old allocation pass ===\n);
 struct pci_device *pci;
 foreachpci(pci) {
 pci_init_device(pci_isa_bridge_tbl, pci, NULL);
 }
+#endif
+
 pci_bios_init_device_in_bus(0 /* host bus */);
 
 

[SeaBIOS] [PATCH 5/5] pci: set BUILD_PCIMEM_START to 0xe0000000

2011-07-11 Thread Gerd Hoffmann
... and make it match with the declarations in acpi-dsdt.dsl.

Signed-off-by: Gerd Hoffmann kra...@redhat.com
---
 src/config.h |2 +-
 1 files changed, 1 insertions(+), 1 deletions(-)

diff --git a/src/config.h b/src/config.h
index 687cac6..f2fce89 100644
--- a/src/config.h
+++ b/src/config.h
@@ -40,7 +40,7 @@
 #define BUILD_BIOS_TMP_ADDR   0x3
 #define BUILD_MAX_HIGHMEM 0xe000
 
-#define BUILD_PCIMEM_START0xf000
+#define BUILD_PCIMEM_START0xe000
 #define BUILD_PCIMEM_SIZE (BUILD_PCIMEM_END - BUILD_PCIMEM_START)
 #define BUILD_PCIMEM_END  0xfec0/* IOAPIC is mapped at */
 
-- 
1.7.1


___
SeaBIOS mailing list
SeaBIOS@seabios.org
http://www.seabios.org/mailman/listinfo/seabios


[SeaBIOS] [PATCH 0/5] pci: two-pass initialization

2011-07-11 Thread Gerd Hoffmann
  Hi,

Next (and hopefully final) version of the two-pass pci initialization
patches.  Addressed review comments, fixed some bugs, especially the
io range setup for bridges.

cheers,
  Gerd

Gerd Hoffmann (5):
  pci: add two-pass pci initialization code
  pci: activate two-pass pci initialization code
  pci: remove old pci initilaization code
  pci: cleanup config.h
  pci: set BUILD_PCIMEM_START to 0xe000

 Makefile |2 +-
 src/config.h |   16 +--
 src/pci.h|8 +
 src/pci_region.c |   77 
 src/pciinit.c|  509 ++
 src/util.h   |   29 ---
 6 files changed, 335 insertions(+), 306 deletions(-)
 delete mode 100644 src/pci_region.c


___
SeaBIOS mailing list
SeaBIOS@seabios.org
http://www.seabios.org/mailman/listinfo/seabios


[SeaBIOS] [PATCH 3/5] pci: remove old pci initilaization code

2011-07-11 Thread Gerd Hoffmann
Signed-off-by: Gerd Hoffmann kra...@redhat.com
---
 Makefile |2 +-
 src/pci_region.c |   77 -
 src/pciinit.c|  197 --
 src/util.h   |   29 
 4 files changed, 1 insertions(+), 304 deletions(-)
 delete mode 100644 src/pci_region.c

diff --git a/Makefile b/Makefile
index 2786c9e..47828e5 100644
--- a/Makefile
+++ b/Makefile
@@ -20,7 +20,7 @@ SRC16=$(SRCBOTH) system.c disk.c font.c
 SRC32FLAT=$(SRCBOTH) post.c shadow.c memmap.c coreboot.c boot.c \
   acpi.c smm.c mptable.c smbios.c pciinit.c optionroms.c mtrr.c \
   lzmadecode.c bootsplash.c jpeg.c usb-hub.c paravirt.c \
-  pci_region.c biostables.c xen.c bmp.c
+  biostables.c xen.c bmp.c
 SRC32SEG=util.c output.c pci.c pcibios.c apm.c stacks.c
 
 cc-option = $(shell if test -z `$(1) $(2) -S -o /dev/null -xc \
diff --git a/src/pci_region.c b/src/pci_region.c
deleted file mode 100644
index 1d9de71..000
--- a/src/pci_region.c
+++ /dev/null
@@ -1,77 +0,0 @@
-// helper functions to manage pci io/memory/prefetch memory region
-//
-// Copyright (C) 2009 Isaku Yamahata yamahata at valinux co jp
-//
-// This file may be distributed under the terms of the GNU LGPLv3 license.
-//
-//
-
-#include util.h
-
-#define PCI_REGION_DISABLED (-1)
-
-void pci_region_init(struct pci_region *r, u32 first, u32 last)
-{
-r-first = first;
-r-last = last;
-
-r-cur_first = r-first;
-}
-
-// PCI_REGION_DISABLED represents that the region is in special state.
-// its value is chosen such that cur_first can't be PCI_REGION_DISABLED
-// normally.
-// NOTE: the area right below 4G is used for LAPIC, so such area can't
-//   be used for PCI memory.
-u32 pci_region_disable(struct pci_region *r)
-{
-return r-cur_first = PCI_REGION_DISABLED;
-}
-
-static int pci_region_disabled(const struct pci_region *r)
-{
-return r-cur_first == PCI_REGION_DISABLED;
-}
-
-static u32 pci_region_alloc_align(struct pci_region *r, u32 size, u32 align)
-{
-if (pci_region_disabled(r)) {
-return 0;
-}
-
-u32 s = ALIGN(r-cur_first, align);
-if (s  r-last || s  r-cur_first) {
-return 0;
-}
-u32 e = s + size;
-if (e  s || e - 1  r-last) {
-return 0;
-}
-r-cur_first = e;
-return s;
-}
-
-u32 pci_region_alloc(struct pci_region *r, u32 size)
-{
-return pci_region_alloc_align(r, size, size);
-}
-
-u32 pci_region_align(struct pci_region *r, u32 align)
-{
-return pci_region_alloc_align(r, 0, align);
-}
-
-void pci_region_revert(struct pci_region *r, u32 addr)
-{
-r-cur_first = addr;
-}
-
-u32 pci_region_addr(const struct pci_region *r)
-{
-return r-cur_first;
-}
-
-u32 pci_region_size(const struct pci_region *r)
-{
-return r-last - r-first + 1;
-}
diff --git a/src/pciinit.c b/src/pciinit.c
index a26eb77..a0e932b 100644
--- a/src/pciinit.c
+++ b/src/pciinit.c
@@ -18,10 +18,6 @@
 #define PCI_BRIDGE_IO_MIN  0x1000
 #define PCI_BRIDGE_MEM_MIN   0x10
 
-static struct pci_region pci_bios_io_region;
-static struct pci_region pci_bios_mem_region;
-static struct pci_region pci_bios_prefmem_region;
-
 enum pci_region_type {
 PCI_REGION_TYPE_IO,
 PCI_REGION_TYPE_MEM,
@@ -113,88 +109,6 @@ static void pci_set_io_region_addr(u16 bdf, int 
region_num, u32 addr)
 ofs = pci_bar(bdf, region_num);
 
 pci_config_writel(bdf, ofs, addr);
-dprintf(1, region %d: 0x%08x\n, region_num, addr);
-}
-
-/*
- * return value
- *  0: 32bit BAR
- *  non 0: 64bit BAR
- */
-static int pci_bios_allocate_region(u16 bdf, int region_num)
-{
-return 0;
-
-struct pci_region *r;
-u32 ofs = pci_bar(bdf, region_num);
-
-u32 old = pci_config_readl(bdf, ofs);
-u32 mask;
-if (region_num == PCI_ROM_SLOT) {
-mask = PCI_ROM_ADDRESS_MASK;
-pci_config_writel(bdf, ofs, mask);
-} else {
-if (old  PCI_BASE_ADDRESS_SPACE_IO)
-mask = PCI_BASE_ADDRESS_IO_MASK;
-else
-mask = PCI_BASE_ADDRESS_MEM_MASK;
-pci_config_writel(bdf, ofs, ~0);
-}
-u32 val = pci_config_readl(bdf, ofs);
-pci_config_writel(bdf, ofs, old);
-
-u32 size = (~(val  mask)) + 1;
-if (val != 0) {
-const char *type;
-const char *msg;
-if (val  PCI_BASE_ADDRESS_SPACE_IO) {
-r = pci_bios_io_region;
-type = io;
-msg = ;
-} else if ((val  PCI_BASE_ADDRESS_MEM_PREFETCH) 
-   /* keep behaviour on bus = 0 */
-   pci_bdf_to_bus(bdf) != 0 
-   /* If pci_bios_prefmem_addr == 0, keep old behaviour */
-   pci_region_addr(pci_bios_prefmem_region) != 0) {
-r = pci_bios_prefmem_region;
-type = prefmem;
-msg = decrease BUILD_PCIMEM_SIZE and recompile. size %x;
-} else {
-r = pci_bios_mem_region;
-type = mem;
-msg = increase BUILD_PCIMEM_SIZE and 

[SeaBIOS] [PATCH 4/5] pci: cleanup config.h

2011-07-11 Thread Gerd Hoffmann
Signed-off-by: Gerd Hoffmann kra...@redhat.com
---
 src/config.h  |   14 --
 src/pciinit.c |2 +-
 2 files changed, 1 insertions(+), 15 deletions(-)

diff --git a/src/config.h b/src/config.h
index e6e07c9..687cac6 100644
--- a/src/config.h
+++ b/src/config.h
@@ -40,23 +40,9 @@
 #define BUILD_BIOS_TMP_ADDR   0x3
 #define BUILD_MAX_HIGHMEM 0xe000
 
-// Support old pci mem assignment behaviour
-//#define CONFIG_OLD_PCIMEM_ASSIGNMENT1
-#if CONFIG_OLD_PCIMEM_ASSIGNMENT
 #define BUILD_PCIMEM_START0xf000
 #define BUILD_PCIMEM_SIZE (BUILD_PCIMEM_END - BUILD_PCIMEM_START)
 #define BUILD_PCIMEM_END  0xfec0/* IOAPIC is mapped at */
-#define BUILD_PCIPREFMEM_START0
-#define BUILD_PCIPREFMEM_SIZE 0
-#define BUILD_PCIPREFMEM_END  0
-#else
-#define BUILD_PCIMEM_START0xf000
-#define BUILD_PCIMEM_SIZE 0x0800/* half- of pci window */
-#define BUILD_PCIMEM_END  (BUILD_PCIMEM_START + BUILD_PCIMEM_SIZE)
-#define BUILD_PCIPREFMEM_STARTBUILD_PCIMEM_END
-#define BUILD_PCIPREFMEM_SIZE (BUILD_PCIPREFMEM_END - 
BUILD_PCIPREFMEM_START)
-#define BUILD_PCIPREFMEM_END  0xfec0/* IOAPIC is mapped at */
-#endif
 
 #define BUILD_APIC_ADDR   0xfee0
 #define BUILD_IOAPIC_ADDR 0xfec0
diff --git a/src/pciinit.c b/src/pciinit.c
index a0e932b..6331fdf 100644
--- a/src/pciinit.c
+++ b/src/pciinit.c
@@ -584,7 +584,7 @@ pci_setup(void)
 dprintf(3, pci setup\n);
 
 u32 start = BUILD_PCIMEM_START;
-u32 end   = BUILD_IOAPIC_ADDR;
+u32 end   = BUILD_PCIMEM_END;
 
 dprintf(1, === PCI bus  bridge init ===\n);
 pci_bios_init_bus();
-- 
1.7.1


___
SeaBIOS mailing list
SeaBIOS@seabios.org
http://www.seabios.org/mailman/listinfo/seabios


Re: [SeaBIOS] [PATCH 5/5] pci: set BUILD_PCIMEM_START to 0xe0000000

2011-07-11 Thread Kevin O'Connor
On Mon, Jul 11, 2011 at 09:20:32AM +0200, Gerd Hoffmann wrote:
 ... and make it match with the declarations in acpi-dsdt.dsl.
 
 Signed-off-by: Gerd Hoffmann kra...@redhat.com
 ---
  src/config.h |2 +-
  1 files changed, 1 insertions(+), 1 deletions(-)
 
 diff --git a/src/config.h b/src/config.h
 index 687cac6..f2fce89 100644
 --- a/src/config.h
 +++ b/src/config.h
 @@ -40,7 +40,7 @@
  #define BUILD_BIOS_TMP_ADDR   0x3
  #define BUILD_MAX_HIGHMEM 0xe000
  
 -#define BUILD_PCIMEM_START0xf000
 +#define BUILD_PCIMEM_START0xe000

I thought there was some dependency on 0xe000 in the VGA BIOS.
Has that been cleared up now?

The patch series looks good to me.

-Kevin

___
SeaBIOS mailing list
SeaBIOS@seabios.org
http://www.seabios.org/mailman/listinfo/seabios


Re: [SeaBIOS] [PATCH 5/5] pci: set BUILD_PCIMEM_START to 0xe0000000

2011-07-11 Thread Gerd Hoffmann

  Hi,


-#define BUILD_PCIMEM_START0xf000
+#define BUILD_PCIMEM_START0xe000


I thought there was some dependency on 0xe000 in the VGA BIOS.
Has that been cleared up now?


Yes, the magic bochs vga lfb @ 0xe000 is gone in recent qemu 
(version 0.14 + newer).  The vgabios looks up the framebuffer bar 
address in pci config space instead of depending on the hardcoded address.


And even when combining this with old qemu this is quite unlikely to 
actually cause trouble as the code tries to move the pci bars as high as 
possible.  On a typical qemu configuration the lowest address used is 
0xfc00.


cheers,
  Gerd


___
SeaBIOS mailing list
SeaBIOS@seabios.org
http://www.seabios.org/mailman/listinfo/seabios


Re: [SeaBIOS] SeaBIOS error with Juniper FreeBSD kernel

2011-07-11 Thread Brandon Bennett
 Are all versions based on FreeBSD 4.11?
 Are newer versions still affected?

Newer versions should be based on 6.1 but there are a lot of changes.
I haven't had a chance to test with something newer yet.

-Brandon

___
SeaBIOS mailing list
SeaBIOS@seabios.org
http://www.seabios.org/mailman/listinfo/seabios