V2 Epia report

ron minnich rminnich at lanl.gov
Fri Oct 10 16:00:00 CEST 2003


My example. 

On the VT8231 south bridge, you need to set some bits very early in the 
game to make sure PCI devices are on or off, as needed by the motherboard. 

So, in via/epia/auto.c, we have this:

static void
enable_mainboard_devices(void) {
  device_t dev;
  /* dev 0 for southbridge */
  
  dev = pci_locate_device(PCI_ID(0x1106,0x8231), 0);
  
  if (dev == PCI_DEV_INVALID) {
    die("Southbridge not found!!!\n");
  }
  pci_write_config8(dev, 0x50, 7);
  pci_write_config8(dev, 0x51, 0xff);
#if 0
  // This early setup switches IDE into compatibility mode before PCI gets 
  // // a chance to assign I/Os
  //         movl    $CONFIG_ADDR(0, 0x89, 0x42), %eax
  //         //      movb    $0x09, %dl
  //                 movb    $0x00, %dl
  //                         PCI_WRITE_CONFIG_BYTE
  //
#endif
  /* we do this here as in V2, we can not yet do raw operations 
   * to pci!
   */
  dev++; /* ICKY */
  pci_write_config8(dev, 0x42, 0);
}

OK, so I have some chip-specific stuff in the mainboard auto.c. Which 
means that other mainboards that use that chip have to use this code. 
First the authors of that code have to find this code. Chip-specific code 
like this should be in the southbridge chip code, not the mainboard code.

How do I want this to work? 

Like this:

in via/vt8231/vt8231.c:
static void 
southbridge_init(struct chip *chip, enum chip_pass pass)
{

  struct southbridge_via_vt8231_config *conf = 
    (struct southbridge_via_vt8231_config *)chip->chip_info;

  switch (pass) {
  case CONF_PASS_PRE_PCI:
    vt8231_pci_enable(conf); /* called BEFORE PCI scan */
    break;
  }

}

I want that vt8231_pci_enable function called BEFORE any PCI config is 
done. But, as things stand, all the functions available in the C code 
depend on the dynamic device tree having been configure. But I need to 
call this function before that happens. The things that the function will 
do are determined in mainboard Config.lb, viz:

northbridge via/vt8601 "vt8601"
	southbridge via/vt8231 "vt8231"
		register "enable_usb" = "0"
		register "enable_native_ide" = "1"
		register "enable_com_ports" = "1"
		register "enable_keyboard" = "0"
		register "enable_nvram" = "1"
	end
end

So, to make sure the PCI scan behave correctly and builds the dynamic tree 
correctly, I need to take actions BEFORE the PCI scan occurs. But the PCI 
functions provided to the C code only work AFTER the PCI scan occurs. 
Hence the problem. 

This problem did not occur in v1.

I'd like the solution to be very simple ... 

ron 




More information about the coreboot mailing list