blob: 6bf891c87516d0eea1096622ef4cae28d36e8c2b [file] [log] [blame]
/*
* This file is part of the coreboot project.
*
* Copyright (C) 2014 Siemens AG
*
* 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
* the Free Software Foundation; version 2 of the License.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*/
#ifndef _MODHWINFO_H_
#define _MODHWINFO_H_
#include <types.h>
#define LEN_MAGIC_NUM 8
#define LEN_MLFB 20
#define LEN_SERIAL_NUM 16
#define LEN_HW_REVISION 2
#define LEN_MAC_ADDRESS 6
#define LEN_SPD 128
#define NUMBER_OF_MAC_ADDR 4
#define LEN_EDID 128
#define LEN_MAIN_HWINFO 509
#define LEN_SHORT_INFO 289
#define LEN_EDID_INFO 181
#define NEXT_OFFSET_HWINFO 476
#define NEXT_OFFSET_SIB 260
#define NEXT_OFFSET_EDID 176
#define HWI_LEN_OFFSET 12
/* Define some masks and values */
#define SIB_HWINIT_IDX 0x0e
#define SIB_COLOR_6BIT 0x00
#define SIB_COLOR_8BIT 0x01
#define SIB_COLOR_10BIT 0x02
#define SIB_DISP_CON_IDX 0x16
#define SIB_LVDS_SINGLE_LANE 0x00
#define SIB_LVDS_DUAL_LANE 0x05
struct PhysDevStruc {
u8 bustype;
u8 devfn;
u16 bus;
} __attribute__ ((packed));
struct hwinfo {
// Offset 0x0
char magicNumber[LEN_MAGIC_NUM];
// Offset 0x08
u8 versionID[4];
// Offset 0x0c
u16 length;
// Offset 0x0e
char BGR_Name[128];
//Offset 0x8e
char MLFB[LEN_MLFB];
// Offset 0xa2
u8 uniqueNumber[16];
// Offset 0xb2
u8 fill_1[12];
// Offset 0xbe
u8 hwRevision[LEN_HW_REVISION];
//Offset 0xc0
u8 macAddress1[LEN_MAC_ADDRESS];
u8 numOfAuxMacAddr1;
u8 fill_2;
//Offset 0xc8
u8 macAddress2[LEN_MAC_ADDRESS];
u8 numOfAuxMacAddr2;
u8 fill_3;
//Offset 0xd0
u8 macAddress3[LEN_MAC_ADDRESS];
u8 numOfAuxMacAddr3;
u8 fill_4;
//Offset 0xd8
u8 macAddress4[LEN_MAC_ADDRESS];
u8 numOfAuxMacAddr4;
u8 fill_5;
// Offset 0xe0
u8 SPD[LEN_SPD];
// Offset 0x160
u8 fill_6[88];
// Offset 0x1b8
u32 featureFlags;
// Offset 0x1bc
u8 fill_7[4];
// Offset 0x1c0
u32 biosFlags;
// Offset 0x1c4
u8 fill_8[8];
//Offset 0x1cc
struct PhysDevStruc etherDev[NUMBER_OF_MAC_ADDR];
// Offset 0x1dc
s32 nextInfoOffset;
// Offset 0x1e0
u8 fill_9[4];
// Offset 0x1e4
u32 portRTC;
// Offset 0x1e8
u8 typeRTC;
// Offset 0x1e9
u8 fill_10[20];
} __attribute__ ((packed));
struct shortinfo {
// Offset 0x0
char magicNumber[LEN_MAGIC_NUM];
// Offset 0x08
u8 versionID[4];
// Offset 0x0c
u16 length;
// Offset 0x0e
char BGR_Name[128];
//Offset 0x8e
char MLFB[LEN_MLFB];
// Offset 0xa2
u8 uniqueNumber[26];
// Offset 0xbc
u8 fill_1[12];
//Offset 0xc8
u8 hwRevision[2];
// Offset 0xca
u8 fill_2[18];
// Offset 0xdc
u8 panelFeatures[32];
// Offset 0xfc
u8 fill_3[8];
// Offset 0x104
s32 nextInfoOffset;
// Offset 0x108
u8 fill_4[25];
} __attribute__ ((packed));
struct edidinfo {
// Offset 0x0
char magicNumber[LEN_MAGIC_NUM];
// Offset 0x08
u8 versionID[4];
// Offset 0x0c
u16 length;
// Offset 0x0e
u8 fill_1[2];
// Offset 0x10
u8 edid[LEN_EDID];
// Offset 0x90
u8 fill_2[32];
// Offset 0xb0
s32 nextInfoOffset;
// Offset 0xb4
u8 fill_3;
} __attribute__ ((packed));
u8* get_first_linked_block(char *filename, u8 **starting_adr);
struct hwinfo* get_hwinfo(char *filename);
struct shortinfo* get_shortinfo(char *filename);
struct edidinfo* get_edidinfo(char *filename);
enum cb_err mainboard_get_mac_address(u16 bus, u8 devfn, u8 mac[6]);
#endif /* _MODHWINFO_H_ */