[coreboot] flashrom: Handling of mainboard selection

Luc Verhaegen libv at skynet.be
Mon Feb 18 17:16:20 CET 2008


On Mon, Feb 18, 2008 at 04:37:59PM +0200, Mart Raudsepp wrote:
> 
> Luc Verhaegen pointed out that if subsystem IDs are NULL, then the entry
> already isn't considered in the auto-detection logic.
> I must have misread the logic and assume that even then the first match
> is just picked.
> 
> So now the attached patch ditches the extra flag adding and just adds
> board enable for DBE61 and DBE62 without specifying PCI subsytem IDs;
> and also documents that logic to avoid further confusion.
> 
> 
> Mart Raudsepp,
> Software Engineer,
> Artec Design LLC

> commit d42e4c4b6d8ce75429c1899613b704c940c96534
> Author: Mart Raudsepp <mart.raudsepp at artecdesign.ee>
> Date:   Mon Feb 18 16:35:17 2008 +0200
> 
>     flashrom: Add board_enable for Artec Group DBE61 and DBE62
>     
>     Also add a comment about NULL subsystem IDs leaving the board entry out of auto-detection logic.
>     
>     Signed-off-by: Mart Raudsepp <mart.raudsepp at artecdesign.ee>
> 
> diff --git a/board_enable.c b/board_enable.c
> index 907774d..da5043f 100644
> --- a/board_enable.c
> +++ b/board_enable.c
> @@ -28,6 +28,7 @@
>  #include <pci/pci.h>
>  #include <stdint.h>
>  #include <string.h>
> +#include <fcntl.h>
>  #include "flash.h"
>  
>  /*
> @@ -368,12 +369,77 @@ static int board_acorp_6a815epd(const char *name)
>  }
>  
>  /**
> + * Suited for Artec Group DBE61 and DBE62.
> + */
> +static int board_artecgroup_dbe6x(const char *name)
> +{
> +#define DBE6x_MSR_DIVIL_BALL_OPTS	0x51400015
> +#define DBE6x_PRI_BOOT_LOC_SHIFT	(2)
> +#define DBE6x_BOOT_OP_LATCHED_SHIFT	(8)
> +#define DBE6x_SEC_BOOT_LOC_SHIFT	(10)
> +#define DBE6x_PRI_BOOT_LOC		(3 << DBE6x_PRI_BOOT_LOC_SHIFT)
> +#define DBE6x_BOOT_OP_LATCHED		(3 << DBE6x_BOOT_OP_LATCHED_SHIFT)
> +#define DBE6x_SEC_BOOT_LOC		(3 << DBE6x_SEC_BOOT_LOC_SHIFT)
> +#define DBE6x_BOOT_LOC_FLASH		(2)
> +#define DBE6x_BOOT_LOC_FWHUB		(3)
> +
> +	unsigned long msr[2];
> +	int msr_fd;
> +	unsigned long boot_loc;
> +
> +	msr_fd = open("/dev/cpu/0/msr", O_RDWR);
> +	if (msr_fd == -1) {
> +		perror("open /dev/cpu/0/msr");
> +		return -1;
> +	}
> +
> +	if (lseek(msr_fd, DBE6x_MSR_DIVIL_BALL_OPTS, SEEK_SET) == -1) {
> +		perror("lseek");
> +		close(msr_fd);
> +		return -1;
> +	}
> +
> +	if (read(msr_fd, (void*) msr, 8) != 8) {
> +		perror("read");
> +		close(msr_fd);
> +		return -1;
> +	}
> +
> +	if ((msr[0] & (DBE6x_BOOT_OP_LATCHED)) ==
> +	    (DBE6x_BOOT_LOC_FWHUB << DBE6x_BOOT_OP_LATCHED_SHIFT))
> +		boot_loc = DBE6x_BOOT_LOC_FWHUB;
> +	else
> +		boot_loc = DBE6x_BOOT_LOC_FLASH;
> +
> +	msr[0] &= ~(DBE6x_PRI_BOOT_LOC | DBE6x_SEC_BOOT_LOC);
> +	msr[0] |= ((boot_loc << DBE6x_PRI_BOOT_LOC_SHIFT) |
> +	    (boot_loc << DBE6x_SEC_BOOT_LOC_SHIFT));
> +
> +	if (lseek(msr_fd, DBE6x_MSR_DIVIL_BALL_OPTS, SEEK_SET) == -1) {
> +		perror("lseek");
> +		close(msr_fd);
> +		return -1;
> +	}
> +
> +	if (write(msr_fd, (void*) msr, 8) != 8) {
> +		perror("write");
> +		close(msr_fd);
> +		return -1;
> +	}
> +
> +	close(msr_fd);
> +	return 0;
> +}
> +
> +/**
>   * We use 2 sets of IDs here, you're free to choose which is which. This
>   * is to provide a very high degree of certainty when matching a board on
>   * the basis of subsystem/card IDs. As not every vendor handles
>   * subsystem/card IDs in a sane manner.
>   *
>   * Keep the second set NULLed if it should be ignored.
> + *
> + * Keep the subsystem IDs NULLed if they don't identify the board fully.
>   */
>  struct board_pciid_enable {
>  	/* Any device, but make it sensible, like the ISA bridge. */
> @@ -427,6 +493,10 @@ struct board_pciid_enable board_pciid_enables[] = {
>  	 "epox", "ep-bx3", "EPoX EP-BX3", board_epox_ep_bx3},
>  	{0x8086, 0x1130, 0x0000, 0x0000, 0x105a, 0x0d30, 0x105a, 0x4d33,
>  	 "acorp", "6a815epd", "Acorp 6A815EPD", board_acorp_6a815epd},
> +	{0x1022, 0x2090, 0x0000, 0x0000, 0x1022, 0x2080, 0x0000, 0x0000,
> +	 "artecgroup", "dbe61", "Artec Group DBE61", board_artecgroup_dbe6x},
> +	{0x1022, 0x2090, 0x0000, 0x0000, 0x1022, 0x2080, 0x0000, 0x0000,
> +	 "artecgroup", "dbe62", "Artec Group DBE62", board_artecgroup_dbe6x},
>  	{0, 0, 0, 0, 0, 0, 0, 0, NULL, NULL}	/* Keep this */
>  };
>  

Acked-by: Luc Verhaegen <libv at skynet.be>




More information about the coreboot mailing list