struct dmi_entry { unsigned char type; unsigned char length; unsigned short handle; } __attribute__((packed)); enum { DMI_MEMORY_ARRAY = 16, DMI_MEMORY_DEVICE = 17, DMI_MEMORY_ARRAY_ADDR = 19, DMI_MEMORY_MAPPED_ADDR = 20, }; struct dmi_memdev_addr { struct dmi_entry header; unsigned start_addr; unsigned end_addr; unsigned short dev_handle; unsigned short memarray_handle; unsigned char row; unsigned char interleave_pos; unsigned char interleave_depth; } __attribute__((packed)); struct dmi_memdev { struct dmi_entry header; unsigned short array_handle; unsigned short memerr_handle; unsigned short total_width; unsigned short data_width; unsigned short size; unsigned char form_factor; unsigned char device_set; unsigned char device_locator; unsigned char bank_locator; unsigned char memory_type; unsigned short type_details; unsigned short speed; unsigned char manufacturer; unsigned char serial_number; unsigned char asset_tag; unsigned char part_number; } __attribute__((packed)); struct dmi_memarray { struct dmi_entry header; unsigned char location; unsigned char use; unsigned char error_correction; unsigned int maximum_capacity; unsigned short error_handle; short num_devices; } __attribute__((packed)); struct dmi_memarray_addr { struct dmi_entry header; unsigned int start_addr; unsigned int end_addr; unsigned short array_handle; unsigned partition_width; } __attribute__((packed)); int opendmi(void); void dmi_decodeaddr(unsigned long long addr); int dmi_sanity_check(void); unsigned dmi_dimm_size(unsigned short size, char *unit); struct dmi_memdev **dmi_find_addr(unsigned long long addr); void dmi_set_verbosity(int v); char *dmi_getstring(struct dmi_entry *e, unsigned number); extern void checkdmi(void); void closedmi(void); /* valid after opendmi: */ extern struct dmi_memdev **dmi_dimms; extern struct dmi_memdev_addr **dmi_ranges; extern struct dmi_memarray **dmi_arrays; extern struct dmi_memarray_addr **dmi_array_ranges; extern int dmi_forced; extern int do_dmi;