Ühel kenal päeval, E, 2008-02-18 kell 15:44, kirjutas Mart Raudsepp:
> > * Add a field to the struct (either treated as boolean, or a flag),
> > that
> > tells the logic if this entry should be considered in the
> > auto-detection
> > logic or skipped
> > Pros:
> > * can skip boards from PCI based auto-detection logic, requiring
> > user specifying it;
> > * has safeguards still in place (in this specific case will allow
> > to
> > claim it's a DBE61 only on Geode based products)
> > Potential cons: extra struct field
>
> As there have been no replies on mailing list on this, I went ahead and
> made a simple patch for the above quoted approach. I remember that using
> an extra field was found to be the preferred approach by several people
> on IRC as well.
>
> Attached you will find that patch, plus an accordingly modified
> DBE61/DBE62 board enable patch.
>
> Comments or Acks? :)
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 <[EMAIL PROTECTED]>
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 <[EMAIL PROTECTED]>
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 */
};
--
coreboot mailing list
[email protected]
http://www.coreboot.org/mailman/listinfo/coreboot