This commit was manufactured by cvs2svn to create tag
[opensuse:hwinfo.git] / src / hd / hd.h
1 #ifndef _HD_H
2 #define _HD_H
3
4 #ifdef __cplusplus
5 extern "C" {
6 #endif
7
8
9 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
10  *
11  *                      libhd data structures
12  *
13  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
14  */
15
16 #define HD_VERSION      8
17
18 /*
19  * debug flags
20  */
21 #define HD_DEB_SHOW_LOG         (1 <<  0)
22 #define HD_DEB_PROGRESS         (1 <<  1)
23 #define HD_DEB_CREATION         (1 <<  2)
24 #define HD_DEB_DRIVER_INFO      (1 <<  3)
25 #define HD_DEB_PCI              (1 <<  4)
26 #define HD_DEB_ISAPNP           (1 <<  5)
27 #define HD_DEB_CDROM            (1 <<  6)
28 #define HD_DEB_NET              (1 <<  7)
29 #define HD_DEB_FLOPPY           (1 <<  8)
30 #define HD_DEB_MISC             (1 <<  9)
31 #define HD_DEB_SERIAL           (1 << 10)
32 #define HD_DEB_MONITOR          (1 << 11)
33 #define HD_DEB_CPU              (1 << 12)
34 #define HD_DEB_BIOS             (1 << 13)
35 #define HD_DEB_MOUSE            (1 << 14)
36 #define HD_DEB_IDE              (1 << 15)
37 #define HD_DEB_SCSI             (1 << 16)
38 #define HD_DEB_USB              (1 << 17)
39 #define HD_DEB_ADB              (1 << 18)
40 #define HD_DEB_MODEM            (1 << 19)
41 #define HD_DEB_PARALLEL         (1 << 20)
42 #define HD_DEB_ISA              (1 << 21)
43 #define HD_DEB_BOOT             (1 << 22)
44 #define HD_DEB_HDDB             (1 << 23)
45
46 #include <stdio.h>
47 #include <inttypes.h>
48 #include <termios.h>
49
50 /*
51  * libhd's directory
52  */
53 #define HARDWARE_DIR            "/var/lib/hardware"
54 #define HARDWARE_UNIQUE_KEYS    HARDWARE_DIR "/unique-keys"
55
56 /**
57  * \defgroup idmacros Id macros
58  * Macros to handle device and vendor ids.
59  *
60  * Example: to check if an id is a pci id and get its value,
61  * do something like this:
62  * \code
63  * if(ID_TAG(hd->dev) == TAG_PCI) {
64  *   pci_id = ID_VALUE(hd->dev)
65  * }
66  * \endcode
67  *@{
68  */
69
70 #define TAG_PCI         1       /**< PCI ids. */
71 #define TAG_EISA        2       /**< EISA ids (monitors, ISA-PnP, modems, mice etc). */
72 #define TAG_USB         3       /**< USB ids. */
73 #define TAG_SPECIAL     4       /**< Internally used ids. */
74 #define TAG_PCMCIA      5       /**< PCMCIA ids. */
75
76 /**
77  * Get the real id value.
78  */
79 #define ID_VALUE(id)            ((id) & 0xffff)
80
81 /**
82  * Get the tag value.
83  */
84 #define ID_TAG(id)              (((id) >> 16) & 0xf)
85
86 /**
87  * Combine tag and id value.
88  */
89 #define MAKE_ID(tag, id_val)    ((tag << 16) | (id_val))
90
91 /*@}*/
92
93 /*
94  * flags to control the probing.
95  */
96 typedef enum probe_feature {
97   pr_memory = 1, pr_pci, pr_isapnp, pr_net, pr_floppy, pr_misc,
98   pr_misc_serial, pr_misc_par, pr_misc_floppy, pr_serial, pr_cpu, pr_bios,
99   pr_monitor, pr_mouse, pr_scsi, pr_usb, pr_usb_mods, pr_adb, pr_modem,
100   pr_modem_usb, pr_parallel, pr_parallel_lp, pr_parallel_zip, pr_isa,
101   pr_isa_isdn, pr_isdn, pr_kbd, pr_prom, pr_sbus, pr_int, pr_braille,
102   pr_braille_alva, pr_braille_fhp, pr_braille_ht, pr_ignx11, pr_sys,
103   pr_bios_vbe, pr_isapnp_old, pr_isapnp_new, pr_isapnp_mod, pr_braille_baum,
104   pr_manual, pr_fb, pr_veth, pr_pppoe, pr_scan, pr_pcmcia, pr_fork,
105   pr_parallel_imm, pr_s390, pr_cpuemu, pr_sysfs, pr_s390disks, pr_udev,
106   pr_block, pr_block_cdrom, pr_block_part, pr_edd, pr_edd_mod, pr_bios_ddc,
107   pr_bios_fb, pr_bios_mode, pr_input, pr_block_mods, pr_bios_vesa,
108   pr_max, pr_lxrc, pr_dsl, pr_default, pr_all           /* pr_all must be last */
109 } hd_probe_feature_t;
110
111 /*
112  * list types for hd_list()
113  *
114  * if you want to modify this: cf. manual.c::hw_items[]
115  *
116  * Note: hw_tv _must_ be < hw_display!
117  */
118 typedef enum hw_item {
119   hw_sys = 1, hw_cpu, hw_keyboard, hw_braille, hw_mouse, hw_joystick,
120   hw_printer, hw_scanner, hw_chipcard, hw_monitor, hw_tv, hw_display,
121   hw_framebuffer, hw_camera, hw_sound, hw_storage_ctrl, hw_network_ctrl,
122   hw_isdn, hw_modem, hw_network, hw_disk, hw_partition, hw_cdrom, hw_floppy,
123   hw_manual, hw_usb_ctrl, hw_usb, hw_bios, hw_pci, hw_isapnp, hw_bridge,
124   hw_hub, hw_scsi, hw_ide, hw_memory, hw_dvb, hw_pcmcia, hw_pcmcia_ctrl,
125   hw_ieee1394, hw_ieee1394_ctrl, hw_hotplug, hw_hotplug_ctrl, hw_zip, hw_pppoe,
126   hw_wlan, hw_redasd, hw_dsl, hw_block, hw_tape, hw_vbe, /* append new entries here */
127   hw_unknown, hw_all                                    /* hw_all must be last */
128 } hd_hw_item_t;
129
130 /*
131  * device base classes and bus types
132  *
133  */
134
135 /* base class values (superset of PCI classes) */
136 typedef enum base_classes {
137   /* these *must* match standard PCI class numbers */
138   bc_none, bc_storage, bc_network, bc_display, bc_multimedia,
139   bc_memory, bc_bridge, bc_comm, bc_system, bc_input, bc_docking,
140   bc_processor, bc_serial, bc_wireless, bc_i2o, bc_other = 0xff,
141
142   // add our own classes here (starting at 0x100 as PCI values are 8 bit)
143   bc_monitor = 0x100, bc_internal, bc_modem, bc_isdn, bc_ps2, bc_mouse,
144   bc_storage_device, bc_network_interface, bc_keyboard, bc_printer,
145   bc_hub, bc_braille, bc_scanner, bc_joystick, bc_chipcard, bc_camera,
146   bc_framebuffer, bc_dvb, bc_tv, bc_partition, bc_dsl
147 } hd_base_classes_t;
148
149 /* subclass values of bc_monitor */
150 typedef enum sc_monitor {
151   sc_mon_other, sc_mon_crt, sc_mon_lcd
152 } hd_sc_monitor_t;
153
154 /* subclass values of bc_storage */
155 typedef enum sc_storage {
156   sc_sto_scsi, sc_sto_ide, sc_sto_floppy, sc_sto_ipi, sc_sto_raid,
157   sc_sto_other = 0x80
158 } hd_sc_storage_t;
159
160 /* subclass values of bc_display */
161 typedef enum sc_display {
162   sc_dis_vga, sc_dis_xga, sc_dis_other = 0x80
163 } hd_sc_display_t;
164
165 /* subclass values of bc_framebuffer */
166 typedef enum sc_framebuffer {
167   sc_fb_vesa = 1
168 } hd_sc_framebuffer_t;
169
170 /* subclass values of bc_bridge */
171 typedef enum sc_bridge { 
172   sc_bridge_host, sc_bridge_isa, sc_bridge_eisa, sc_bridge_mc,
173   sc_bridge_pci, sc_bridge_pcmcia, sc_bridge_nubus, sc_bridge_cardbus,
174   sc_bridge_other = 0x80
175 } hd_sc_bridge_t;
176
177 /* subclass values of bc_comm */
178 typedef enum sc_comm { 
179   sc_com_ser, sc_com_par, sc_com_multi, sc_com_modem, sc_com_other = 0x80
180 } hd_sc_comm_t;
181
182 /* subclass values of bc_system */
183 typedef enum sc_system {
184   sc_sys_pic, sc_sys_dma, sc_sys_timer, sc_sys_rtc, sc_sys_other = 0x80
185 } hd_sc_system_t;
186
187 /* subclass values of bc_input */
188 typedef enum sc_input {
189   sc_inp_keyb, sc_inp_digit, sc_inp_mouse, sc_inp_other = 0x80
190 } hd_sc_input_t;
191
192 /* subclass values of bc_serial */
193 typedef enum sc_serial {
194   sc_ser_fire, sc_ser_access, sc_ser_ssa, sc_ser_usb, sc_ser_fiber,
195   sc_ser_smbus, sc_ser_other = 0x80
196 } hd_sc_serial_t;
197
198 /* internal sub class values (bc_internal) */
199 typedef enum sc_internal {
200   sc_int_none, sc_int_isapnp_if, sc_int_main_mem, sc_int_cpu, sc_int_fpu,
201   sc_int_bios, sc_int_prom, sc_int_sys
202 } hd_sc_internal_t;
203
204 /* subclass values of bc_mouse */
205 typedef enum sc_mouse {
206   sc_mou_ps2, sc_mou_ser, sc_mou_bus, sc_mou_usb, sc_mou_sun,
207   sc_mou_other = 0x80
208 } hd_sc_mouse_t;
209
210 /* subclass values of bc_storage_device */
211 typedef enum sc_std {
212   sc_sdev_disk, sc_sdev_tape, sc_sdev_cdrom, sc_sdev_floppy, sc_sdev_scanner,
213   sc_sdev_other = 0x80
214 } hd_sc_std_t;
215
216 /* subclass values of bc_network_interface */
217 typedef enum sc_net_if {
218   sc_nif_loopback, sc_nif_ethernet, sc_nif_tokenring, sc_nif_fddi,
219   sc_nif_ctc, sc_nif_iucv, sc_nif_hsi, sc_nif_qeth,
220   sc_nif_escon, sc_nif_myrinet, sc_nif_wlan, sc_nif_xp, sc_nif_other = 0x80,
221   sc_nif_sit
222 } hd_sc_net_if_t;
223
224 /* subclass values of bc_multimedia */
225 typedef enum sc_multimedia {
226   sc_multi_video, sc_multi_audio, sc_multi_other
227 } hd_sc_multimedia_t;
228
229 /* subclass values of bc_keyboard */
230 typedef enum sc_keyboard {
231   sc_keyboard_kbd, sc_keyboard_console
232 } hd_sc_keyboard_t;
233
234 /* subclass values of bc_hub */
235 typedef enum sc_hub {
236   sc_hub_other, sc_hub_usb
237 } hd_sc_hub_t;
238
239 /* subclass values of bc_camera */
240 typedef enum sc_camera {
241   sc_camera_webcam, sc_camera_digital
242 } hd_sc_camera_t;
243
244 /* subclass values of bc_modem */
245 typedef enum sc_modem {
246   sc_mod_at, sc_mod_win1, sc_mod_win2, sc_mod_win3, sc_mod_win4
247 } hd_sc_modem_t;
248
249 /* subclass values of bc_dsl */
250 typedef enum sc_dsl {
251   sc_dsl_unknown, sc_dsl_pppoe, sc_dsl_capi, sc_dsl_capiisdn
252 } hd_sc_dsl_t;
253
254 /* prog_if's of sc_ser_usb */
255 typedef enum pif_usb_e {
256   pif_usb_uhci = 0, pif_usb_ohci = 0x10, pif_usb_ehci = 0x20,
257   pif_usb_other = 0x80, pif_usb_device = 0xfe
258 } hd_pif_usb_t;
259
260 /* CD-ROM  prog_if values */
261 typedef enum pif_cdrom {
262   pif_cdrom, pif_cdr, pif_cdrw, pif_dvd, pif_dvdr, pif_dvdram
263 } hd_pif_cdrom_t ;
264
265 /* S/390 disk prog_if values */
266 typedef enum pif_s390disk {
267   pif_scsi, pif_dasd
268 } hd_pif_s390disk_t;
269
270 /* bus type values similar to PCI bridge subclasses */
271 typedef enum bus_types {
272   bus_none, bus_isa, bus_eisa, bus_mc, bus_pci, bus_pcmcia, bus_nubus,
273   bus_cardbus, bus_other,
274
275   /* outside the range of the PCI values */
276   bus_ps2 = 0x80, bus_serial, bus_parallel, bus_floppy, bus_scsi, bus_ide, bus_usb,
277   bus_adb, bus_raid, bus_sbus, bus_i2o, bus_vio, bus_ccw
278 } hd_bus_types_t;
279
280 /**
281  * Hardware status.
282  * The status is stored in /var/lib/hardware/unique-keys/ and used
283  * to detect if the hardware is new and has to be configured by some
284  * hardware %config tool.
285  */
286 typedef struct {
287   /**
288    * Status fields are invalid.
289    */
290   unsigned invalid:1;
291   /**
292    * Hardware should be reconfigured.
293    * Either \ref hd_status_t::status_yes or \ref hd_status_t::status_no.
294    * A hardware must be reconfigured if it is in state
295    * \ref hd_status_t::available == \ref hd_status_t::status_no and
296    * \ref hd_status_t::needed == \ref hd_status_t::status_yes.
297    * In other words, if a hardware that was
298    * needed to run the system is gone.
299    */
300   unsigned reconfig:3;
301
302   /**
303    * Hardware %config status.
304    * Set to \ref hd_status_t::status_yes if the hardware has been configured, otherwise
305    * \ref hd_status_t::status_no.
306    */
307   unsigned configured:3;
308
309   /**
310    * Hardware availability.
311    * Set to \ref hd_status_t::status_yes if the hardware has been detected or
312    * \ref hd_status_t::status_no if the hardware has not been found. You can set
313    * it to \ref hd_status_t::status_unknown to indicate that this hardware cannot
314    * be automatically detected (say, ISA cards).
315    * \note You can simulate all kinds of hardware on your system by
316    * creating entries in /var/lib/hardware/unique-keys/ that have
317    * \ref hd_status_t::available set to \ref hd_status_t::status_unknown.
318    */
319   unsigned available:3;
320
321   /**
322    * Hardware is needed.
323    * Set to \ref hd_status_t::status_yes if this hardware is really necessary to run
324    * your computer. The effect will be that some hardware %config dialog
325    * is run if the hardware item is not found.
326    * Typical examples are graphics cards and mice.
327    */
328   unsigned needed:3;
329
330   /**
331    * (Internal) original value of \ref available;
332    * This is used to keep track of the original value of the \ref hd_status_t::available
333    * state as it was stored in /var/lib/hardware/unique-keys/. (\ref hd_status_t::available
334    * is automatically updated during the detection process.)
335    */
336   unsigned available_orig:3;
337
338   /**
339    * Hardware is active.
340    */
341   unsigned active:3;
342 } hd_status_t;
343
344 /* hardware config status values */
345 typedef enum {
346   status_no = 1, status_yes, status_unknown, status_new
347 } hd_status_value_t;
348
349 /**
350  * Various types of hotplug devices.
351  */
352 typedef enum {
353   hp_none,      /**< Not a hotpluggable %device. */
354   hp_pcmcia,    /**< PCMCIA %device. */
355   hp_cardbus,   /**< Cardbus %device. */
356   hp_pci,       /**< PCI hotplug %device. */
357   hp_usb,       /**< USB %device. */
358   hp_ieee1394   /**< IEEE 1394 (FireWire) %device */
359 } hd_hotplug_t;
360
361
362 /**
363  * Holds id/name pairs.
364  * Used for bus, class, vendor, %device and such.
365  */
366 typedef struct {
367   unsigned id;          /**< Numeric id. */
368   char *name;           /**< Name (if any) that corresponds to \ref hd_id_t::id. */
369 } hd_id_t;
370
371 /**
372  * String list type.
373  * Used whenever we create a list of strings (e.g. file read).
374  */
375 typedef struct s_str_list_t {
376   struct s_str_list_t *next;    /**< Link to next member. */
377   char *str;                    /**< Some string data. */
378 } str_list_t;
379
380
381 typedef struct {
382   unsigned char bitmap[16];     /* large enough for all uses */
383   unsigned bits;                /* real bitmap length in bits */
384   unsigned not_empty:1;         /* at least 1 bit is set */
385   str_list_t *str;              /* interpreted bitmask */
386 } hd_bitmap_t;
387
388
389 /*
390  * for memory areas
391  */
392 typedef struct {
393   unsigned start, size;         /* base address & size */
394   unsigned char *data;          /* actual data */
395 } memory_range_t;
396
397
398 /*
399  * smp info according to Intel smp spec (ia32)
400  */
401 typedef struct {
402   unsigned ok:1;                /* data are valid */
403   unsigned rev;                 /* MP spec revision */
404   unsigned mpfp;                /* MP Floating Pointer struct */
405   unsigned mpconfig_ok:1;       /* MP config table valid */
406   unsigned mpconfig;            /* MP config table */
407   unsigned mpconfig_size;       /* dto, size */
408   unsigned char feature[5];     /* MP feature info */
409   char oem_id[9];               /* oem id */
410   char prod_id[13];             /* product id */
411   unsigned cpus, cpus_en;       /* number of cpus & ennabled cpus */
412 } smp_info_t;
413
414
415 /*
416  * vesa bios extensions info
417  */
418 typedef struct vbe_mode_info_s {
419   unsigned number;              /* mode number */
420   unsigned attributes;          /* mode attributes */
421   unsigned width, height;       /* mode size */
422   unsigned bytes_p_line;        /* line length */
423   unsigned pixel_size;          /* bits per pixel */
424   unsigned fb_start;            /* frame buffer start address (if any) */
425   unsigned win_A_start;         /* window A start address */
426   unsigned win_A_attr;          /* window A attributes */
427   unsigned win_B_start;         /* window B start address */
428   unsigned win_B_attr;          /* window B attributes */
429   unsigned win_size;            /* window size in bytes */
430   unsigned win_gran;            /* window granularity in bytes */
431   unsigned pixel_clock;         /* maximum pixel clock */
432 } vbe_mode_info_t;
433
434
435 typedef struct {
436   unsigned ok:1;                /* data are valid */
437   unsigned version;             /* vbe version */
438   unsigned oem_version;         /* oem version info */
439   unsigned memory;              /* in bytes */
440   unsigned fb_start;            /* != 0 if framebuffer is supported */
441   char *oem_name;               /* oem name */
442   char *vendor_name;            /* vendor name */
443   char *product_name;           /* product name */
444   char *product_revision;       /* product revision */
445   unsigned modes;               /* number of supported video modes */
446   vbe_mode_info_t *mode;        /* video mode list */
447   unsigned current_mode;        /* current video mode */
448   unsigned char ddc[0x80];      /* ddc monitor info */
449 } vbe_info_t;
450
451
452 /*
453  * Compaq Controller Order EV (CQHORD) definition
454  */
455 typedef struct {
456     unsigned id;
457     unsigned char slot;
458     unsigned char bus;
459     unsigned char devfn;
460     unsigned char misc;
461 } cpq_ctlorder_t; 
462
463
464 typedef struct {
465   unsigned ok:1;                /* data are valid */
466   unsigned entry;               /* entry point */
467   unsigned compaq:1;            /* is compaq system */
468   cpq_ctlorder_t cpq_ctrl[32];  /* 32 == MAX_CONTROLLERS */
469 } bios32_info_t;
470
471
472 /*
473  * smbios entries
474  */
475 typedef enum {
476   sm_biosinfo, sm_sysinfo, sm_boardinfo, sm_chassis,
477   sm_processor, sm_memctrl, sm_memmodule, sm_cache,
478   sm_connect, sm_slot, sm_onboard, sm_oem,
479   sm_config, sm_lang, sm_group, sm_eventlog,
480   sm_memarray, sm_memdevice, sm_memerror, sm_memarraymap,
481   sm_memdevicemap, sm_mouse, sm_battery, sm_reset,
482   sm_secure, sm_power, sm_voltage, sm_cool,
483   sm_temperature, sm_current, sm_outofband, sm_bis,
484   sm_boot, sm_mem64error, sm_mandev, sm_mandevcomp,
485   sm_mdtd, sm_inactive = 126, sm_end = 127
486 } hd_smbios_type_t;
487
488
489 /* common part of all smbios_* types */
490 typedef struct {
491   union u_hd_smbios_t *next;    /* link to next entry */
492   hd_smbios_type_t type;        /* BIOS info type */
493   int data_len;                 /* formatted section length */
494   unsigned char *data;          /* formatted section */
495   str_list_t *strings;          /* strings taken from the unformed section */
496   int handle;                   /* handle, unique 16 bit number */
497 } smbios_any_t;
498
499
500 /* BIOS related information */
501 typedef struct {
502   union u_hd_smbios_t *next;
503   hd_smbios_type_t type;
504   int data_len;
505   unsigned char *data;
506   str_list_t *strings;
507   int handle;
508   char *vendor;                 /* vendor name */
509   char *version;                /* version (free form) */
510   char *date;                   /* date mm/dd/yyyy (old: yy) */
511   hd_bitmap_t feature;          /* BIOS characteristics */
512   unsigned start;               /* start address */
513   unsigned rom_size;            /* ROM size (in bytes) */
514 } smbios_biosinfo_t;
515
516
517 /* overall system related information */
518 typedef struct {
519   union u_hd_smbios_t *next;
520   hd_smbios_type_t type;
521   int data_len;
522   unsigned char *data;
523   str_list_t *strings;
524   int handle;
525   char *manuf;                  /* manufacturer */
526   char *product;                /* product name */
527   char *version;                /* version */
528   char *serial;                 /* serial number */
529   unsigned char uuid[16];       /* universal unique id; all 0x00: undef, all 0xff: undef but settable */
530   hd_id_t wake_up;              /* wake-up type */
531 } smbios_sysinfo_t;
532
533
534 /* motherboard related information */
535 typedef struct {
536   union u_hd_smbios_t *next;
537   hd_smbios_type_t type;
538   int data_len;
539   unsigned char *data;
540   str_list_t *strings;
541   int handle;
542   char *manuf;                  /* manufacturer */
543   char *product;                /* product name */
544   char *version;                /* version */
545   char *serial;                 /* serial number */
546   char *asset;                  /* asset tag */
547   hd_id_t board_type;           /* board type */
548   hd_bitmap_t feature;          /* board features */
549   char *location;               /* location in chassis */
550   int chassis;                  /* handle of chassis */
551   int objects_len;              /* number of contained objects */
552   int *objects;                 /* array of object handles */
553 } smbios_boardinfo_t;
554
555
556 /* chassis information */
557 typedef struct {
558   union u_hd_smbios_t *next;
559   hd_smbios_type_t type;
560   int data_len;
561   unsigned char *data;
562   str_list_t *strings;
563   int handle;
564   char *manuf;                  /* manufacturer */
565   char *version;                /* version */
566   char *serial;                 /* serial number */
567   char *asset;                  /* asset tag */
568   hd_id_t ch_type;              /* chassis type */
569   unsigned lock;                /* 1: lock present, 0: not present or unknown */
570   hd_id_t bootup;               /* bootup state */
571   hd_id_t power;                /* power supply state (at last boot) */
572   hd_id_t thermal;              /* thermal state (at last boot) */
573   hd_id_t security;             /* security state (at last boot) */
574   unsigned oem;                 /* OEM-specific information */
575 } smbios_chassis_t;
576
577
578 /* processor information */
579 typedef struct {
580   union u_hd_smbios_t *next;
581   hd_smbios_type_t type;
582   int data_len;
583   unsigned char *data;
584   str_list_t *strings;
585   int handle;
586   char *socket;                 /* socket */
587   hd_id_t upgrade;              /* socket type */
588   char *manuf;                  /* manufacturer */
589   char *version;                /* version */
590   char *serial;                 /* serial number */
591   char *asset;                  /* asset tag */
592   char *part;                   /* part number */
593   hd_id_t pr_type;              /* processor type */
594   hd_id_t family;               /* processor family */
595   uint64_t cpu_id;              /* processor id */
596   unsigned voltage;             /* in 0.1 V */
597   unsigned ext_clock;           /* MHz */
598   unsigned max_speed;           /* MHz */
599   unsigned current_speed;       /* MHz */
600   unsigned sock_status;         /* socket status (1: populated, 0: empty */
601   hd_id_t cpu_status;           /* cpu status */
602   int l1_cache;                 /* handle of L1 cache */
603   int l2_cache;                 /* handle of L2 cache */
604   int l3_cache;                 /* handle of L3 cache */
605 } smbios_processor_t;
606
607
608 /* cache information */
609 typedef struct {
610   union u_hd_smbios_t *next;
611   hd_smbios_type_t type;
612   int data_len;
613   unsigned char *data;
614   str_list_t *strings;
615   int handle;
616   char *socket;                 /* socket designation */
617   unsigned max_size;            /* max cache size in kbytes */
618   unsigned current_size;        /* current size in kbytes */
619   unsigned speed;               /* cache speed in nanoseconds */
620   hd_id_t mode;                 /* operational mode */
621   unsigned state;               /* 0/1: disabled/enabled */
622   hd_id_t location;             /* cache location */
623   unsigned socketed;            /* 0/1: not socketed/socketed */
624   unsigned level;               /* cache level (0 = L1, 1 = L2, ...) */
625   hd_id_t ecc;                  /* error correction type */
626   hd_id_t cache_type;           /* logical cache type */
627   hd_id_t assoc;                /* cache associativity */
628   hd_bitmap_t supp_sram;        /* supported SRAM types */
629   hd_bitmap_t sram;             /* current SRAM type */
630 } smbios_cache_t;
631
632
633 /* port connector information */
634 typedef struct {
635   union u_hd_smbios_t *next;
636   hd_smbios_type_t type;
637   int data_len;
638   unsigned char *data;
639   str_list_t *strings;
640   int handle;
641   hd_id_t port_type;            /* port type */
642   char *i_des;                  /* internal reference designator */
643   hd_id_t i_type;               /* internal connector type */
644   char *x_des;                  /* external reference designator */
645   hd_id_t x_type;               /* external connector type */
646 } smbios_connect_t;
647
648
649 /* system slot information */
650 typedef struct {
651   union u_hd_smbios_t *next;
652   hd_smbios_type_t type;
653   int data_len;
654   unsigned char *data;
655   str_list_t *strings;
656   int handle;
657   char *desig;                  /* slot designation */
658   hd_id_t slot_type;            /* slot type */
659   hd_id_t bus_width;            /* data bus width */
660   hd_id_t usage;                /* current usage */
661   hd_id_t length;               /* slot length */
662   unsigned id;                  /* slot id */
663   hd_bitmap_t feature;          /* slot characteristics */
664 } smbios_slot_t;
665
666
667 /* on board devices information */
668 typedef struct {
669   union u_hd_smbios_t *next;
670   hd_smbios_type_t type;
671   int data_len;
672   unsigned char *data;
673   str_list_t *strings;
674   int handle;
675   unsigned dev_len;             /* device list length */
676   struct {
677     char *name;                 /* device name */
678     hd_id_t type;               /* device type */
679     unsigned status;            /* 0: disabled, 1: enabled */
680   } *dev;                       /* device list  */
681 } smbios_onboard_t;
682
683
684 /* OEM information */
685 typedef struct {
686   union u_hd_smbios_t *next;
687   hd_smbios_type_t type;
688   int data_len;
689   unsigned char *data;
690   str_list_t *strings;
691   int handle;
692   str_list_t *oem_strings;      /* OEM strings */
693 } smbios_oem_t;
694
695
696 /* system config options */
697 typedef struct {
698   union u_hd_smbios_t *next;
699   hd_smbios_type_t type;
700   int data_len;
701   unsigned char *data;
702   str_list_t *strings;
703   int handle;
704   str_list_t *options;          /* system config options */
705 } smbios_config_t;
706
707
708 /* language information */
709 typedef struct {
710   union u_hd_smbios_t *next;
711   hd_smbios_type_t type;
712   int data_len;
713   unsigned char *data;
714   str_list_t *strings;          /* list of languages */
715   int handle;
716   char *current;                /* current language */
717 } smbios_lang_t;
718
719
720 /* group associations */
721 typedef struct {
722   union u_hd_smbios_t *next;
723   hd_smbios_type_t type;
724   int data_len;
725   unsigned char *data;
726   str_list_t *strings;
727   int handle;
728   char *name;                   /* group name */
729   int items_len;                /* number of items in this group */
730   int *item_handles;            /* array of item handles */
731 } smbios_group_t;
732
733
734 /* physical memory array (consists of several memory devices) */
735 typedef struct {
736   union u_hd_smbios_t *next;
737   hd_smbios_type_t type;
738   int data_len;
739   unsigned char *data;
740   str_list_t *strings;
741   int handle;
742   hd_id_t location;             /* memory device location */
743   hd_id_t use;                  /* memory usage */
744   hd_id_t ecc;                  /* ECC types */
745   unsigned max_size;            /* maximum memory size in kB */
746   int error_handle;             /* points to error info record; 0xfffe: not supported, 0xffff: no error */
747   unsigned slots;               /* slots or sockets for this device */
748 } smbios_memarray_t;
749
750
751 /* memory device */
752 typedef struct {
753   union u_hd_smbios_t *next;
754   hd_smbios_type_t type;
755   int data_len;
756   unsigned char *data;
757   str_list_t *strings;
758   int handle;
759   char *location;               /* device location */
760   char *bank;                   /* bank location */
761   char *manuf;                  /* manufacturer */
762   char *serial;                 /* serial number */
763   char *asset;                  /* asset tag */
764   char *part;                   /* part number */
765   int array_handle;             /* memory array this device belongs to */
766   int error_handle;             /* points to error info record; 0xfffe: not supported, 0xffff: no error */
767   unsigned width;               /* data width in bits */
768   unsigned eccbits;             /* ecc bits */
769   unsigned size;                /* kB */
770   hd_id_t form;                 /* form factor */
771   unsigned set;                 /* 0: does not belong to a set; 1-0xfe: set number; 0xff: unknown */
772   hd_id_t mem_type;             /* memory type */
773   hd_bitmap_t type_detail;      /* memory type details */
774   unsigned speed;               /* in MHz */
775 } smbios_memdevice_t;
776
777
778 /* 32-bit memory error information  */
779 typedef struct {
780   union u_hd_smbios_t *next;
781   hd_smbios_type_t type;
782   int data_len;
783   unsigned char *data;
784   str_list_t *strings;
785   int handle;
786   hd_id_t err_type;             /* error type memory */
787   hd_id_t granularity;          /* memory array or memory partition */
788   hd_id_t operation;            /* mem operation causing the error */
789   unsigned syndrome;            /* vendor-specific ECC syndrome; 0: unknown */
790   unsigned array_addr;          /* fault address rel. to mem array; 0x80000000: unknown */
791   unsigned device_addr;         /* fault address rel to mem device; 0x80000000: unknown */
792   unsigned range;               /* range, within which the error can be determined; 0x80000000: unknown */
793 } smbios_memerror_t;
794
795
796 /* memory array mapped address */
797 typedef struct {
798   union u_hd_smbios_t *next;
799   hd_smbios_type_t type;
800   int data_len;
801   unsigned char *data;
802   str_list_t *strings;
803   int handle;
804   int array_handle;             /* memory array this mapping belongs to */
805   uint64_t start_addr;          /* memory range start address */
806   uint64_t end_addr;            /* end address */
807   unsigned part_width;          /* number of memory devices */
808 } smbios_memarraymap_t;
809
810
811 /* memory device mapped address */
812 typedef struct {
813   union u_hd_smbios_t *next;
814   hd_smbios_type_t type;
815   int data_len;
816   unsigned char *data;
817   str_list_t *strings;
818   int handle;
819   int memdevice_handle;         /* memory device handle */
820   int arraymap_handle;          /* memory array mapping handle */
821   uint64_t start_addr;          /* memory range start address */
822   uint64_t end_addr;            /* end address */
823   unsigned row_pos;             /* position of the referenced memory device in a row of the address partition */
824   unsigned interleave_pos;      /* dto, in an interleave */
825   unsigned interleave_depth;    /* number of consecutive rows */
826 } smbios_memdevicemap_t;
827
828
829 /* pointing device (aka 'mouse') information */
830 typedef struct {
831   union u_hd_smbios_t *next;
832   hd_smbios_type_t type;
833   int data_len;
834   unsigned char *data;
835   str_list_t *strings;
836   int handle;
837   hd_id_t mtype;                /* mouse type */
838   hd_id_t interface;            /* interface type */
839   unsigned buttons;             /* number of buttons */
840 } smbios_mouse_t;
841
842
843 /* hardware security */
844 typedef struct {
845   union u_hd_smbios_t *next;
846   hd_smbios_type_t type;
847   int data_len;
848   unsigned char *data;
849   str_list_t *strings;
850   int handle;
851   hd_id_t power;                /* power-on password status */
852   hd_id_t keyboard;             /* keyboard password status */
853   hd_id_t admin;                /* admin password status */
854   hd_id_t reset;                /* front panel reset status */
855 } smbios_secure_t;
856
857
858 /* system power controls */
859 typedef struct {
860   union u_hd_smbios_t *next;
861   hd_smbios_type_t type;
862   int data_len;
863   unsigned char *data;
864   str_list_t *strings;
865   int handle;
866   unsigned month;               /* next scheduled power-on month */
867   unsigned day;                 /* dto, day */
868   unsigned hour;                /* dto, hour */
869   unsigned minute;              /* dto, minute */
870   unsigned second;              /* dto, second */
871 } smbios_power_t;
872
873
874 /* 64-bit memory error information  */
875 typedef struct {
876   union u_hd_smbios_t *next;
877   hd_smbios_type_t type;
878   int data_len;
879   unsigned char *data;
880   str_list_t *strings;
881   int handle;
882   hd_id_t err_type;             /* error type memory */
883   hd_id_t granularity;          /* memory array or memory partition */
884   hd_id_t operation;            /* mem operation causing the error */
885   unsigned syndrome;            /* vendor-specific ECC syndrome; 0: unknown */
886   uint64_t array_addr;          /* fault address rel. to mem array; 0x80000000: unknown */
887   uint64_t device_addr;         /* fault address rel to mem device; 0x80000000: unknown */
888   unsigned range;               /* range, within which the error can be determined; 0x80000000: unknown */
889 } smbios_mem64error_t;
890
891
892 typedef union u_hd_smbios_t {
893   union u_hd_smbios_t *next;  
894   smbios_any_t any;
895   smbios_biosinfo_t biosinfo;
896   smbios_sysinfo_t sysinfo;
897   smbios_boardinfo_t boardinfo;
898   smbios_chassis_t chassis;
899   smbios_processor_t processor;
900   smbios_cache_t cache;
901   smbios_connect_t connect;
902   smbios_slot_t slot;
903   smbios_onboard_t onboard;
904   smbios_oem_t oem;
905   smbios_config_t config;
906   smbios_lang_t lang;
907   smbios_group_t group;
908   smbios_memarray_t memarray;
909   smbios_memdevice_t memdevice;
910   smbios_memerror_t memerror;
911   smbios_memarraymap_t memarraymap;
912   smbios_memdevicemap_t memdevicemap;
913   smbios_mouse_t mouse;
914   smbios_secure_t secure;
915   smbios_power_t power;
916   smbios_mem64error_t mem64error;
917 } hd_smbios_t;
918
919
920 /*
921  * udev database info
922  */
923 typedef struct s_udevinfo_t {
924   struct s_udevinfo_t *next;
925   char *sysfs;
926   char *name;
927   str_list_t *links;
928 } hd_udevinfo_t;
929
930
931 /*
932  * sysfs driver info
933  */
934 typedef struct s_sysfsdrv_t {
935   struct s_sysfsdrv_t *next;
936   char *driver;
937   char *device;
938 } hd_sysfsdrv_t;
939
940
941 /*
942  * device number; type is either 0 or 'b' or 'c'.
943  *
944  * range: number of nodes
945  */
946 typedef struct {
947   int type;
948   unsigned major, minor, range;
949 } hd_dev_num_t;
950
951
952 /*
953  * structure holding the (raw) PCI data
954  */
955 typedef struct s_pci_t {
956   struct s_pci_t *next;                         /* linked list */
957   unsigned data_len;                            /* the actual length of the data field */
958   unsigned data_ext_len;                        /* max. accessed config byte; see code */
959   unsigned char data[256];                      /* the PCI data */
960   char *log;                                    /* log messages */
961   unsigned flags,                               /* various info, see enum pci_flags */
962            cmd,                                 /* PCI_COMMAND */
963            hdr_type,                            /* PCI_HEADER_TYPE */
964            secondary_bus;                       /* > 0 for PCI & CB bridges */
965   unsigned bus,                                 /* PCI bus #, *nothing* to do with hw_t.bus */
966            slot, func;                          /* slot & function */
967   unsigned base_class, sub_class, prog_if;      /* PCI device classes */
968   unsigned dev, vend, sub_dev, sub_vend, rev;   /* vendor & device ids */
969   unsigned irq;                                 /* used irq, if any */
970   uint64_t base_addr[7];                        /* I/O or memory base */
971   uint64_t base_len[7];                         /* I/O or memory ranges */
972   unsigned addr_flags[7];                       /* I/O or memory address flags */
973   uint64_t rom_base_addr;                       /* memory base for card ROM */
974   uint64_t rom_base_len;                        /* memory range for card ROM */
975   char *sysfs_id;                               /* sysfs path */
976   char *sysfs_bus_id;                           /* sysfs bus id */
977 } pci_t;
978
979 /*
980  * pci related flags cf. (pci_t).flags
981  */
982 typedef enum pci_flags {
983   pci_flag_ok, pci_flag_pm, pci_flag_agp
984 } hd_pci_flags_t;
985
986
987 /*
988  * raw USB data
989  */
990 typedef struct usb_s {
991   struct usb_s *next;
992   unsigned hd_idx;
993   unsigned hd_base_idx;
994   /* see Linux USB docs */
995   str_list_t *c, *d, *e, *i, *p, *s, *t;
996   struct usb_s *cloned;
997   int bus, dev_nr, lev, parent, port, count, conns, used_conns, ifdescr;
998   unsigned speed;
999   unsigned vendor, device, rev;
1000   char *manufact, *product, *serial;
1001   char *driver;
1002   memory_range_t raw_descr;
1003   int d_cls, d_sub, d_prot;
1004   int i_alt, i_cls, i_sub, i_prot;
1005   unsigned country;
1006 } usb_t;
1007
1008 /*
1009  *structures to hold the (raw) ISA-PnP data
1010  */
1011 typedef struct {
1012   int len;
1013   int type;
1014   unsigned char *data;
1015 } isapnp_res_t;
1016
1017 typedef struct {
1018   int csn;
1019   int log_devs;
1020   unsigned char *serial;
1021   unsigned char *card_regs;
1022   unsigned char (*ldev_regs)[0xd0];
1023   int res_len;
1024   unsigned broken:1;            /* mark a broken card */
1025   isapnp_res_t *res;
1026 } isapnp_card_t;
1027
1028 typedef struct {
1029   int read_port;
1030   int cards;
1031   isapnp_card_t *card;
1032 } isapnp_t;
1033
1034 typedef struct {
1035   isapnp_card_t *card;
1036   int dev;
1037   unsigned flags;                               /* cf. enum isapnp_flags */
1038   unsigned ref:1;                               /* internally used flag */
1039 } isapnp_dev_t;
1040
1041 /*
1042  * ISA-PnP related flags; cf. (isapnp_dev_t).flags
1043  */
1044 typedef enum isapnp_flags {
1045   isapnp_flag_act
1046 } hd_isapnp_flags_t;
1047
1048
1049 /*
1050  * raw SCSI data
1051  */
1052 typedef struct scsi_s {
1053   struct scsi_s *next;
1054   unsigned deleted:1;
1055   unsigned generic:1;
1056   unsigned fake:1;
1057   char *dev_name;
1058   char *guessed_dev_name;
1059   int generic_dev;
1060   unsigned host, channel, id, lun;
1061   char *vendor, *model, *rev, *type_str, *serial;
1062   int type;
1063   unsigned inode_low;
1064   char *proc_dir, *driver;
1065   unsigned unique;
1066   char *info;
1067   unsigned lgeo_c, lgeo_h, lgeo_s;
1068   unsigned pgeo_c, pgeo_h, pgeo_s;
1069   uint64_t size;
1070   unsigned sec_size;
1071   unsigned cache;
1072   str_list_t *host_info;
1073   char *usb_guid;
1074   unsigned pci_info;
1075   unsigned pci_bus;
1076   unsigned pci_slot;
1077   unsigned pci_func;
1078   uint64_t wwpn;
1079   uint64_t fcp_lun;
1080   char *controller_id;
1081 } scsi_t;
1082
1083
1084 /*
1085  * PROM tree on PPC
1086  */
1087 typedef struct devtree_s {
1088   struct devtree_s *next;
1089   struct devtree_s *parent;
1090   unsigned idx;
1091   char *path, *filename;
1092   unsigned pci:1;
1093   char *name, *model, *device_type, *compatible;
1094   int class_code;                       /* class : sub_class : prog-if */
1095   int vendor_id, device_id, subvendor_id, subdevice_id;
1096   int revision_id, interrupt;
1097   unsigned char *edid;                  /* 128 bytes */
1098 } devtree_t;
1099
1100 /*
1101  * Device/CU model numbers for S/390
1102  */
1103 typedef struct ccw_s {
1104   unsigned char lcss;
1105   unsigned char cu_model;
1106   unsigned char dev_model;
1107 } ccw_t;
1108
1109 /*
1110  * special CDROM entry
1111  */
1112 typedef struct cdrom_info_s {
1113   struct cdrom_info_s *next;
1114   char *name;
1115   unsigned speed;
1116   unsigned cdr:1, cdrw:1, dvd:1, dvdr:1, dvdram:1;
1117   unsigned cdrom:1;             /* cdrom in drive */
1118   struct {
1119     unsigned ok:1;
1120     char *volume, *publisher, *preparer, *application, *creation_date;
1121   } iso9660;
1122   struct {
1123     unsigned ok:1;
1124     unsigned platform;
1125     char *id_string;
1126     unsigned bootable:1;
1127     unsigned media_type;        /* boot emulation type */
1128     unsigned load_address;
1129     unsigned load_count;        /* sectors to load */
1130     unsigned start;             /* start sector */
1131     unsigned catalog;           /* boot catalog start */
1132     struct {
1133       unsigned c, h, s;
1134       unsigned size;
1135     } geo;
1136     char *label;
1137   } el_torito;
1138
1139 } cdrom_info_t;
1140
1141 // note: obsolete, will be removed
1142 typedef struct {
1143   unsigned char block0[512];
1144 } floppy_info_t;
1145
1146 /*
1147  * bios data (ix86)
1148  */
1149 typedef struct {
1150   unsigned apm_supported:1;
1151   unsigned apm_enabled:1;
1152   unsigned apm_ver, apm_subver;
1153   unsigned apm_bios_flags;
1154
1155   unsigned vbe_ver;
1156   unsigned vbe_video_mem;
1157
1158   unsigned ser_port0, ser_port1, ser_port2, ser_port3;
1159   unsigned par_port0, par_port1, par_port2;
1160
1161   /* The id is still in big endian format! */
1162   unsigned is_pnp_bios:1;
1163   unsigned pnp_id;
1164   unsigned lba_support:1;
1165
1166   unsigned low_mem_size;
1167   smp_info_t smp;
1168   vbe_info_t vbe;
1169
1170   unsigned smbios_ver;
1171
1172   struct {
1173     unsigned width;
1174     unsigned height;
1175     char *vendor;
1176     char *name;
1177   } lcd;
1178
1179   struct {
1180     char *vendor;
1181     char *type;
1182     unsigned bus;
1183     unsigned compat_vend;
1184     unsigned compat_dev;
1185   } mouse;
1186
1187   struct {
1188     unsigned ok:1;
1189     unsigned scroll_lock:1;
1190     unsigned num_lock:1;
1191     unsigned caps_lock:1;
1192   } led;
1193
1194   bios32_info_t bios32;
1195
1196 } bios_info_t;
1197
1198
1199 /*
1200  * prom data (ppc, sparc)
1201  */
1202 typedef struct {
1203   unsigned has_color:1;
1204   unsigned color;
1205 } prom_info_t;
1206
1207
1208 /*
1209  * general system data
1210  */
1211 typedef struct {
1212   char *system_type;
1213   char *generation;
1214   char *vendor;
1215   char *model;
1216   char *serial;
1217   char *lang;
1218 } sys_info_t;
1219
1220
1221 /*
1222  * monitor (DDC) data
1223  */
1224 typedef struct {
1225   unsigned manu_year;
1226   unsigned min_vsync, max_vsync;        /* vsync range */
1227   unsigned min_hsync, max_hsync;        /* hsync range */
1228   char *vendor;
1229   char *name;
1230   char *serial;
1231 } monitor_info_t;
1232
1233
1234 typedef enum cpu_arch {
1235   arch_unknown = 0,
1236   arch_intel,
1237   arch_alpha,
1238   arch_sparc, arch_sparc64,
1239   arch_ppc, arch_ppc64,
1240   arch_68k,
1241   arch_ia64,
1242   arch_s390, arch_s390x,
1243   arch_arm,
1244   arch_mips,
1245   arch_x86_64
1246 } hd_cpu_arch_t;
1247
1248 // ###### drop boot_arch at all?
1249 typedef enum boot_arch {
1250   boot_unknown = 0,
1251   boot_lilo, boot_milo, boot_aboot, boot_silo, boot_ppc, boot_elilo, boot_s390,
1252   boot_mips, boot_grub
1253 } hd_boot_arch_t;
1254
1255 /* special cpu entry */
1256 typedef struct {
1257   enum cpu_arch architecture;
1258   unsigned family;              /* axp: cpu variation */
1259   unsigned model;               /* axp: cpu revision */
1260   unsigned stepping;
1261   unsigned cache;
1262   unsigned clock;
1263   unsigned units;               /* >1 "hyperthreading" */
1264   char *vend_name;              /* axp: system type */
1265   char *model_name;             /* axp: cpu model */
1266   char *platform;               /* x86: NULL */
1267   str_list_t *features;         /* x86: flags */
1268 } cpu_info_t;
1269
1270
1271 /*
1272  * database info
1273  */
1274 typedef struct {
1275   unsigned data_len, data_max;
1276   unsigned *data;
1277   unsigned names_len, names_max;
1278   char *names;
1279 } hddb_data_t;
1280
1281 typedef uint32_t hddb_entry_mask_t;
1282
1283 typedef struct hddb_list_s {   
1284   hddb_entry_mask_t key_mask;
1285   hddb_entry_mask_t value_mask;
1286   unsigned key;
1287   unsigned value;
1288 } hddb_list_t;
1289
1290 typedef struct {
1291   unsigned list_len, list_max;
1292   hddb_list_t *list;
1293   unsigned ids_len, ids_max;
1294   unsigned *ids;
1295   unsigned strings_len, strings_max;
1296   char *strings;
1297 } hddb2_data_t;
1298
1299 /*
1300  * pci module info
1301  */
1302 typedef struct {
1303   char *module;
1304   unsigned vendor;
1305   unsigned device;
1306   unsigned subvendor;
1307   unsigned subdevice;
1308   unsigned pciclass;
1309   unsigned classmask;
1310 } hddb_pci_t;
1311
1312
1313 /*
1314  * resource types
1315  */
1316 typedef enum resource_types {
1317   res_any, res_phys_mem, res_mem, res_io, res_irq, res_dma, res_monitor,
1318   res_size, res_disk_geo, res_cache, res_baud, res_init_strings, res_pppd_option,
1319   res_framebuffer, res_hwaddr
1320 } hd_resource_types_t;
1321
1322
1323 /*
1324  * size units (cf. (res_size_t).unit)
1325  */
1326 typedef enum size_units {
1327   size_unit_cm, size_unit_cinch, size_unit_byte, size_unit_sectors,
1328   size_unit_kbyte, size_unit_mbyte, size_unit_gbyte
1329 } hd_size_units_t;
1330
1331 /*
1332  * access types for I/O and memory resources
1333  */
1334 typedef enum access_flags {
1335   acc_unknown, acc_ro, acc_wo, acc_rw           /* unknown, read only, write only, read/write */
1336 } hd_access_flags_t;
1337
1338 typedef enum yes_no_flag {
1339   flag_unknown, flag_no, flag_yes               /* unknown, no, yes */
1340 } hd_yes_no_flag_t;
1341
1342
1343 /*
1344  * definitions for the various resource types
1345  */
1346 typedef struct {
1347   union u_hd_res_t *next;
1348   enum resource_types type;
1349 } res_any_t;
1350
1351 typedef struct {
1352   union u_hd_res_t *next;
1353   enum resource_types type;
1354   uint64_t base, range;
1355   unsigned
1356     enabled:1,                          /* 0: disabled, 1 enabled */
1357     access:2,                           /* enum access_flags */
1358     prefetch:2;                         /* enum yes_no_flag */
1359 } res_mem_t;
1360
1361 typedef struct {
1362   union u_hd_res_t *next;
1363   enum resource_types type;
1364   uint64_t range;
1365 } res_phys_mem_t;
1366
1367 typedef struct {
1368   union u_hd_res_t *next;
1369   enum resource_types type;
1370   uint64_t base, range;
1371   unsigned
1372     enabled:1,                          /* 0: disabled, 1 enabled */
1373     access:2;                           /* enum access_flags */
1374 } res_io_t;
1375
1376 typedef struct {
1377   union u_hd_res_t *next;
1378   enum resource_types type;
1379   unsigned base;
1380   unsigned triggered;                   /* # of interrupts */
1381   unsigned enabled:1;                   /* 0: disabled, 1 enabled */
1382 } res_irq_t;
1383
1384 typedef struct {
1385   union u_hd_res_t *next;
1386   enum resource_types type;
1387   unsigned base;
1388   unsigned enabled:1;                   /* 0: disabled, 1 enabled */
1389 } res_dma_t;
1390
1391 typedef struct {
1392   union u_hd_res_t *next;
1393   enum resource_types type;
1394   enum size_units unit;
1395   uint64_t val1, val2;                  /* to allow for 2D values */
1396 } res_size_t;
1397
1398 typedef struct {
1399   union u_hd_res_t *next;
1400   enum resource_types type;
1401   unsigned speed;
1402   unsigned bits, stopbits;
1403   char parity;                          /* n, e, o, s, m */
1404   char handshake;                       /* -, h, s */
1405 } res_baud_t;
1406
1407 typedef struct {
1408   union u_hd_res_t *next;
1409   enum resource_types type;
1410   unsigned size;                        /* in kbyte */
1411 } res_cache_t;
1412
1413 typedef struct {
1414   union u_hd_res_t *next;
1415   enum resource_types type;
1416   unsigned cyls, heads, sectors;
1417   unsigned logical:1;                   /* logical/physical geometry */
1418 } res_disk_geo_t;
1419
1420 typedef struct {
1421   union u_hd_res_t *next;
1422   enum resource_types type;
1423   unsigned width, height;               /* in pixel */
1424   unsigned vfreq;                       /* in Hz */
1425   unsigned interlaced:1;                /* 0/1 */
1426 } res_monitor_t;
1427
1428 typedef struct {
1429   union u_hd_res_t *next;
1430   enum resource_types type;
1431   char *init1;
1432   char *init2;
1433 } res_init_strings_t;
1434
1435 typedef struct {
1436   union u_hd_res_t *next;
1437   enum resource_types type;
1438   char *option;
1439 } res_pppd_option_t;
1440
1441 typedef struct {
1442   union u_hd_res_t *next;
1443   enum resource_types type;
1444   unsigned width, height;               /* in pixel */
1445   unsigned bytes_p_line;                /* line length in bytes (do not confuse with 'width') */
1446   unsigned colorbits;                   /* 4, 8, 15, 16, 24, 32 */
1447   unsigned mode;                        /* mode number for kernel */
1448 } res_framebuffer_t;
1449
1450 typedef struct {
1451   union u_hd_res_t *next;
1452   enum resource_types type;
1453   char *addr;
1454 } res_hwaddr_t;
1455
1456 typedef union u_hd_res_t {
1457   union u_hd_res_t *next;  
1458   res_any_t any;
1459   res_io_t io;
1460   res_mem_t mem;
1461   res_phys_mem_t phys_mem;
1462   res_irq_t irq;
1463   res_dma_t dma;
1464   res_size_t size;
1465   res_cache_t cache;
1466   res_baud_t baud;
1467   res_disk_geo_t disk_geo;
1468   res_monitor_t monitor;
1469   res_init_strings_t init_strings;
1470   res_pppd_option_t pppd_option;
1471   res_framebuffer_t framebuffer;
1472   res_hwaddr_t hwaddr;
1473 } hd_res_t;
1474
1475
1476 /*
1477  * data gathered by the misc module; basically resources from /proc
1478  */
1479 typedef struct {
1480   uint64_t addr, size;
1481   char *dev;
1482   unsigned tag;
1483 } misc_io_t;
1484
1485 typedef struct {
1486   unsigned channel;
1487   char *dev;
1488   unsigned tag;
1489 } misc_dma_t;
1490
1491 typedef struct {
1492   unsigned irq, events;
1493   int devs;
1494   char **dev;
1495   unsigned tag;
1496 } misc_irq_t;
1497
1498 typedef struct {
1499   unsigned io_len, dma_len, irq_len;
1500   misc_io_t *io;
1501   misc_dma_t *dma;
1502   misc_irq_t *irq;
1503   str_list_t *proc_io, *proc_dma, *proc_irq;
1504 } misc_t;
1505
1506 typedef struct s_serial_t {
1507   struct s_serial_t *next;
1508   char *name;
1509   char *device;
1510   unsigned line, port, irq, baud;
1511 } serial_t;
1512
1513 typedef struct s_ser_device_t {
1514   struct s_ser_device_t *next;
1515   unsigned hd_idx;
1516   char *dev_name;
1517   str_list_t *at_resp;
1518   int fd;
1519   struct termios tio;
1520   unsigned max_baud, cur_baud;
1521   unsigned is_mouse:1;
1522   unsigned is_modem:1;
1523   unsigned do_io:1;
1524   unsigned char buf[0x1000];
1525   int buf_len;
1526   int garbage, non_pnp, pnp;
1527   unsigned char pnp_id[8];
1528   char *serial, *class_name, *dev_id, *user_name, *vend, *init_string1, *init_string2, *pppd_option;
1529   unsigned pnp_rev;
1530   unsigned bits;
1531 } ser_device_t;
1532
1533 /*
1534  * Notes on isdn_parm_t:
1535  *   - def_value is only relevant of alt_values != 0
1536  *   - def_value should be a value out of alt_value[]
1537  *   - see libihw docu for the meaning of name,type,flags,def_value
1538  */
1539 typedef struct isdn_parm_s {
1540   struct isdn_parm_s *next;
1541   char *name;                           /* parameter name */
1542   unsigned valid:1;                     /* 1: entry is valid, 0: some inconsistencies */
1543   unsigned conflict:1;                  /* 1: ressource conflict (eg. no free irq) */
1544   uint64_t value;                       /* value of the parameter */
1545   unsigned type;                        /* CDBISDN type (P_...) */
1546   unsigned flags;                       /* CDBISDN flags (P_...) */
1547   unsigned def_value;                   /* default value */
1548   int alt_values;                       /* length of alt_value[] */
1549   unsigned *alt_value;                  /* possible values */
1550 } isdn_parm_t;
1551
1552 /* device driver info types */
1553 typedef enum driver_info_type {
1554   di_any, di_display, di_module, di_mouse, di_x11, di_isdn, di_kbd, di_dsl
1555 } hd_driver_info_t;
1556
1557 /* unspecific info */
1558 typedef struct {
1559   union driver_info_u *next;
1560   enum driver_info_type type;           /* driver info type */
1561   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1562 } driver_info_any_t;
1563
1564 /* display (monitor) info */
1565 typedef struct {
1566   union driver_info_u *next;
1567   enum driver_info_type type;           /* driver info type */
1568   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1569   unsigned width, height;               /* max. useful display geometry */
1570   unsigned min_vsync, max_vsync;        /* vsync range */
1571   unsigned min_hsync, max_hsync;        /* hsync range */
1572   unsigned bandwidth;                   /* max. pixel clock */
1573 } driver_info_display_t;
1574
1575 /* module info */
1576 typedef struct {
1577   union driver_info_u *next;
1578   enum driver_info_type type;           /* driver info type */
1579   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1580   unsigned active:1;                    /* if module is currently active */
1581   unsigned modprobe:1;                  /* modprobe or insmod  */
1582   str_list_t *names;                    /* (ordered) list of module names */
1583   str_list_t *mod_args;                 /* list of module args (corresponds to the module name list) */
1584   char *conf;                           /* conf.modules entry, if any (e.g. for sb.o) */
1585 } driver_info_module_t;
1586
1587 /* mouse protocol info */
1588 typedef struct {
1589   union driver_info_u *next;
1590   enum driver_info_type type;           /* driver info type */
1591   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1592   char *xf86;                           /* the XF86 protocol name */
1593   char *gpm;                            /* dto, gpm */
1594   int buttons;                          /* number of buttons, -1 --> unknown */
1595   int wheels;                           /* dto, wheels */
1596 } driver_info_mouse_t;
1597
1598 /* X11 server info */
1599 typedef struct {
1600   union driver_info_u *next;
1601   enum driver_info_type type;           /* driver info type */
1602   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1603   char *server;                         /* the server/module name */
1604   char *xf86_ver;                       /* XFree86 version (3 or 4) */
1605   unsigned x3d:1;                       /* has 3D support */
1606   struct {
1607     unsigned all:5;                     /* the next 5 entries combined */
1608     unsigned c8:1, c15:1, c16:1, c24:1, c32:1;
1609   } colors;                             /* supported color depths */
1610   unsigned dacspeed;                    /* max. ramdac clock */
1611   str_list_t *extensions;               /* additional X extensions to load ('Module' section) */
1612   str_list_t *options;                  /* special server options */
1613   str_list_t *raw;                      /* extra info to add to XF86Config */
1614   char *script;                         /* 3d script to run */
1615 } driver_info_x11_t;
1616
1617 /* isdn info */
1618 typedef struct {
1619   union driver_info_u *next;
1620   enum driver_info_type type;           /* driver info type */
1621   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1622   int i4l_type, i4l_subtype;            /* I4L types */
1623   char *i4l_name;                       /* I4L card name */
1624   isdn_parm_t *params;                  /* isdn parameters */
1625 } driver_info_isdn_t;
1626
1627 /* dsl info */
1628 typedef struct {
1629   union driver_info_u *next;
1630   enum driver_info_type type;           /* driver info type */
1631   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1632   char *mode;                           /* DSL driver types */
1633   char *name;                           /* DSL driver name */
1634 } driver_info_dsl_t;
1635
1636 /* keyboard info */
1637 typedef struct {
1638   union driver_info_u *next;
1639   enum driver_info_type type;           /* driver info type */
1640   str_list_t *hddb0, *hddb1;            /* the actual driver database entries */
1641   char *XkbRules;                       /* XF86Config entries */
1642   char *XkbModel;
1643   char *XkbLayout;
1644   char *keymap;                         /* console keymap */
1645 } driver_info_kbd_t;
1646
1647 /*
1648  * holds device driver info
1649  */
1650 typedef union driver_info_u {
1651   union driver_info_u *next;
1652   driver_info_any_t any;
1653   driver_info_module_t module;
1654   driver_info_mouse_t mouse;
1655   driver_info_x11_t x11;
1656   driver_info_display_t display;
1657   driver_info_isdn_t isdn;
1658   driver_info_dsl_t dsl;
1659   driver_info_kbd_t kbd;
1660 } driver_info_t;
1661
1662
1663 /*
1664  * Some hardware doesn't fit into the hd_t scheme or there is info we
1665  * gathered during the scan process but that no-one really cares about. Such
1666  * stuff is stored in hd_detail_t.
1667  */
1668 typedef enum hd_detail_type {
1669   hd_detail_pci, hd_detail_usb, hd_detail_isapnp, hd_detail_cdrom,
1670   hd_detail_floppy, hd_detail_bios, hd_detail_cpu, hd_detail_prom,
1671   hd_detail_monitor, hd_detail_sys, hd_detail_scsi, hd_detail_devtree,
1672   hd_detail_ccw
1673 } hd_detail_type_t;
1674
1675 typedef struct {
1676   enum hd_detail_type type;
1677   pci_t *data;
1678 } hd_detail_pci_t;
1679
1680 typedef struct {
1681   enum hd_detail_type type;
1682   usb_t *data;
1683 } hd_detail_usb_t;
1684
1685 typedef struct {
1686   enum hd_detail_type type;
1687   isapnp_dev_t *data;
1688 } hd_detail_isapnp_t;
1689
1690 typedef struct {
1691   enum hd_detail_type type;
1692   cdrom_info_t *data;
1693 } hd_detail_cdrom_t;
1694
1695 typedef struct {
1696   enum hd_detail_type type;
1697   floppy_info_t *data;
1698 } hd_detail_floppy_t;
1699
1700 typedef struct {
1701   enum hd_detail_type type;
1702   bios_info_t *data;
1703 } hd_detail_bios_t;
1704
1705 typedef struct {
1706   enum hd_detail_type type;
1707   cpu_info_t *data;
1708 } hd_detail_cpu_t;
1709
1710 typedef struct {
1711   enum hd_detail_type type;
1712   prom_info_t *data;
1713 } hd_detail_prom_t;
1714
1715 typedef struct {
1716   enum hd_detail_type type;
1717   monitor_info_t *data;
1718 } hd_detail_monitor_t;
1719
1720 typedef struct {
1721   enum hd_detail_type type;
1722   sys_info_t *data;
1723 } hd_detail_sys_t;
1724
1725 typedef struct {
1726   enum hd_detail_type type;
1727   scsi_t *data;
1728 } hd_detail_scsi_t;
1729
1730 typedef struct {
1731   enum hd_detail_type type;
1732   devtree_t *data;
1733 } hd_detail_devtree_t;
1734
1735 typedef struct {
1736   enum hd_detail_type type;
1737   ccw_t *data;
1738 } hd_detail_ccw_t;
1739
1740 typedef union {
1741   enum hd_detail_type type;
1742   hd_detail_pci_t pci;
1743   hd_detail_usb_t usb;
1744   hd_detail_isapnp_t isapnp;
1745   hd_detail_cdrom_t cdrom;
1746   hd_detail_floppy_t floppy;
1747   hd_detail_bios_t bios;
1748   hd_detail_cpu_t cpu;
1749   hd_detail_prom_t prom;
1750   hd_detail_monitor_t monitor;
1751   hd_detail_sys_t sys;
1752   hd_detail_scsi_t scsi;
1753   hd_detail_devtree_t devtree;
1754   hd_detail_ccw_t ccw;
1755 } hd_detail_t;
1756
1757
1758 /* info about manually configured hardware (in /var/lib/hardware/) */
1759 typedef struct hd_manual_s {
1760   struct hd_manual_s *next;
1761
1762   char *unique_id;
1763   char *parent_id;
1764   char *child_ids;
1765   unsigned hw_class;
1766   char *model;
1767
1768   hd_status_t status;
1769   char *config_string;
1770
1771   /* More or less free-form key, value pairs.
1772    * key should not contain '=', however.
1773    */
1774   str_list_t *key;
1775   str_list_t *value;
1776 } hd_manual_t;
1777
1778
1779 /**
1780  * Individual hardware item.
1781  * Every hardware component gets an \ref hd_t entry. A list of all hardware
1782  * items is in \ref hd_data_t::hd.
1783  */
1784 typedef struct s_hd_t {
1785   struct s_hd_t *next;          /**< Link to next hardware item. */
1786   /**
1787    * Unique index, starting at 1.
1788    * Use \ref hd_get_device_by_idx() to look up an hardware entry by index. And don't
1789    * free the result!
1790    */
1791   unsigned idx;
1792
1793   /**
1794    * Hardware appears to be broken in some way.
1795    * This was used to indicate broken framebuffer support of some graphics cards.
1796    * Currently unused.
1797    */
1798   unsigned broken:1;
1799
1800   /**
1801    * Bus type (id and name).
1802    */ 
1803   hd_id_t bus;
1804
1805   /**
1806    * Slot and bus number.
1807    * Bits 0-7: slot number, 8-31 bus number.
1808    */
1809   unsigned slot;
1810
1811   /**
1812    * (PCI) function.
1813    */
1814   unsigned func;
1815
1816   /**
1817    * Base class (id and name).
1818    */
1819   hd_id_t base_class;
1820
1821   /**
1822    * Sub class (id and name).
1823    */
1824   hd_id_t sub_class;
1825
1826   /**
1827    * (PCI) programming interface (id and name).
1828    */
1829   hd_id_t prog_if;
1830
1831   /**
1832    * Vendor id and name.
1833    * Id is actually a combination of some tag to differentiate the
1834    * various id types and the real id. Use the \ref ID_VALUE macro to
1835    * get e.g. the real PCI id value for a PCI %device.
1836    */
1837   hd_id_t vendor;
1838
1839   /**
1840    * Device id and name.
1841    * Id is actually a combination of some tag to differentiate the
1842    * various id types and the real id. Use the \ref ID_VALUE macro to
1843    * get e.g. the real PCI id value for a PCI %device.
1844    * \note If you're looking or something printable, you might want to use \ref hd_t::model
1845    * instead.
1846    */
1847   hd_id_t device;
1848
1849   /**
1850    * Subvendor id and name.
1851    * Id is actually a combination of some tag to differentiate the
1852    * various id types and the real id. Use the \ref ID_VALUE macro to
1853    * get e.g. the real PCI id value for a PCI %device.
1854    */
1855   hd_id_t sub_vendor;
1856
1857   /**
1858    * Subdevice id and name.
1859    * Id is actually a combination of some tag to differentiate the
1860    * various id types and the real id. Use the \ref ID_VALUE macro to
1861    * get e.g. the real PCI id value for a PCI %device.
1862    */
1863   hd_id_t sub_device;
1864
1865   /**
1866    * Revision id or string.
1867    * If revision is numerical (e.g. PCI) \ref hd_id_t::id is used.
1868    * If revision is some char data (e.g. disk drives) it is stored in \ref hd_id_t::name.
1869    */
1870   hd_id_t revision;
1871
1872   /**
1873    * Serial id.
1874    */
1875   char *serial;
1876
1877   /**
1878    * Vendor id and name of some compatible hardware.
1879    * Used mainly for ISA-PnP devices.
1880    */
1881   hd_id_t compat_vendor;
1882
1883   /**
1884    * Device id and name of some compatible hardware.
1885    * Used mainly for ISA-PnP devices.
1886    */
1887   hd_id_t compat_device;
1888
1889   /**
1890    * Hardware class.
1891    * Not to confuse with \ref base_class!
1892    */
1893   hd_hw_item_t hw_class;
1894
1895   /**
1896    * Hardware class list.
1897    * A device may belong to more than one hardware class.
1898    */
1899   unsigned char hw_class_list[(hw_all + 7) / 8];        /**< (Internal) bitmask of hw classes. */
1900
1901   /**
1902    * Model name.
1903    * This is a combination of vendor and %device names. Some heuristics is used
1904    * to make it more presentable. Use this instead of \ref hd_t::vendor and
1905    * \ref hd_t::device.
1906    */
1907   char *model;
1908
1909   /**
1910    * Device this hardware is attached to.
1911    * Link to some 'parent' %device. Use \ref hd_get_device_by_idx() to get
1912    * the corresponding hardware entry.
1913    */
1914   unsigned attached_to;
1915
1916   /**
1917    * sysfs entry for this hardware, if any.
1918    */
1919   char *sysfs_id;
1920
1921   /**
1922    * sysfs bus id for this hardware, if any.
1923    */
1924   char *sysfs_bus_id;
1925
1926   /**
1927    * sysfs device link.
1928    */
1929   char *sysfs_device_link;
1930
1931   /**
1932    * Special %device file.
1933    * Device file name to access this hardware. Normally something below /dev.
1934    * For network interfaces this is the interface name.
1935    */
1936   char *unix_dev_name;
1937
1938   /**
1939    * Device type & number according to sysfs.
1940    */
1941   hd_dev_num_t unix_dev_num;
1942
1943   /**
1944    * List of %device names.
1945    * Device file names to access this hardware. Normally something below /dev.
1946    * They should be all equivalent. The preferred name however is
1947    * \ref hd_t::unix_dev_name.
1948    */
1949   str_list_t *unix_dev_names;
1950
1951   /**
1952    * Special %device file.
1953    * Device file name to access this hardware. Most hardware only has one
1954    * %device name stored in \ref hd_t::unix_dev_name. But in some cases
1955    * there's an alternative name.
1956    */
1957   char *unix_dev_name2;
1958
1959   /**
1960    * Device type & number according to sysfs.
1961    */
1962   hd_dev_num_t unix_dev_num2;
1963
1964   /**
1965    * BIOS/PROM id.
1966    * Where appropriate, this is a special BIOS/PROM id (e.g. "0x80" for
1967    * the first harddisk on Intel-PCs).
1968    * CHPID for s390.
1969    */
1970   char *rom_id;
1971
1972   /**
1973    * Unique id for this hardware.
1974    * A unique string identifying this hardware. The string consists
1975    * of two parts separated by a dot ("."). The part before the dot
1976    * describes the location (where the hardware is attached in the system).
1977    * The part after the dot identifies the hardware itself. The string
1978    * must not contain slashes ("/") because we're going to create files
1979    * with this id as name. Apart from this there are no restrictions on
1980    * the form of this string.
1981    */
1982   char *unique_id;
1983
1984   /* List of ids. */
1985   str_list_t *unique_ids;
1986
1987   /**
1988    * (Internal) Probing module that created this entry.
1989    */
1990   unsigned module;
1991
1992   /**
1993    * (Internal) Source code line where this entry was created.
1994    */
1995   unsigned line;
1996
1997   /**
1998    * (Internal) Counter, used in combination with \ref hd_t::module and \ref hd_t::line.
1999    */
2000   unsigned count;
2001
2002   /**
2003    * Device resources.
2004    */
2005   hd_res_t *res;
2006
2007   /**
2008    * Special info associated with this hardware.
2009    * \note This is going to change!
2010    */
2011   hd_detail_t *detail;
2012
2013   /**
2014    * (Internal) Unspecific text info.
2015    * It is used to track IDE interfaces and assign them to the correct
2016    * IDE controllers.
2017    */
2018   str_list_t *extra_info;
2019
2020   /**
2021    * Hardware status (if available).
2022    * The status is stored in files below /var/lib/hardware/unique-keys/. Every
2023    * hardware item gets a file there with its unique id as file name.
2024    */
2025   hd_status_t status;
2026
2027   /**
2028    * Some %config info.
2029    * Every hardware item may get some string assigned. This string is stored
2030    * in files below /var/lib/hardware/unique-keys/. There is no meaning
2031    * associated with this string.
2032    */
2033   char *config_string;
2034
2035   /**
2036    * Hotplug controller for this %device.
2037    * It indicates what kind of hotplug %device (if any) this is.
2038    */
2039   hd_hotplug_t hotplug;
2040
2041    /**
2042     * Slot the hotplug device is connected to (e.g. PCMCIA socket).
2043     * \note \ref hotplug_slot counts 1-based (0: no information available).
2044     */
2045   unsigned hotplug_slot;
2046
2047   struct is_s {
2048     unsigned agp:1;             /* AGP device */
2049     unsigned isapnp:1;          /* ISA-PnP device */
2050     unsigned notready:1;        /* block devices: no medium, other: device not configured */
2051     unsigned manual:1;          /* undetectable, manually configured hardware */
2052     unsigned softraiddisk:1;    /* disk belongs to some soft raid array */
2053     unsigned zip:1;             /* zip floppy */
2054     unsigned cdr:1;             /* CD-R */
2055     unsigned cdrw:1;            /* CD-RW */
2056     unsigned dvd:1;             /* DVD */
2057     unsigned dvdr:1;            /* DVD-R */
2058     unsigned dvdram:1;          /* DVD-RAM */
2059     unsigned pppoe:1;           /* PPPOE modem connected */
2060     unsigned wlan:1;            /* WLAN card */
2061   } is;
2062
2063   struct tag_s {                /* this struct is for internal purposes only */
2064     unsigned remove:1;          /* schedule for removal */
2065     unsigned freeit:1;          /* for internal memory management */
2066     unsigned fixed:1;           /* fixed, do no longer modify this entry */
2067     unsigned ser_skip:1;        /* if serial line, don't scan for devices */
2068     unsigned ser_device:2;      /* if != 0: info about attached serial device; see serial.c */
2069   } tag;
2070
2071   /**
2072    * (Internal) First 512 bytes of block devices.
2073    * To check accessibility of block devices we read the first block. The data
2074    * is used to identify the boot %device.
2075    */
2076   unsigned char *block0;
2077
2078   /**
2079    * Currently active driver.
2080    */
2081   char *driver;
2082
2083   /**
2084    * List of currently active drivers.
2085    */
2086   str_list_t *drivers;
2087
2088   /**
2089    * Old \ref unique_id for compatibility.
2090    * The calculation of unique ids has changed in libhd v3.17. Basically
2091    * we no longer use the vendor/%device names if there are vendor/%device
2092    * ids. (Otherwise a simple %device name database update would change the id,
2093    * which is really not what you want.)
2094    */
2095   char *old_unique_id;
2096
2097   /**
2098    * \ref unique_id of parent (\ref attached_to).
2099    * \note Please do not use it for now.
2100    * 
2101    */
2102   char *parent_id;
2103
2104   /**
2105    * \ref unique_ids of children (\ref parent_id).
2106    * \note Please do not use it for now.
2107    * 
2108    */
2109   str_list_t *child_ids;
2110
2111   /**
2112    * (Internal) location independent \ref unique_id part.
2113    * The speed up some internal searches, we store it here separately.
2114    */
2115   char *unique_id1;
2116
2117   /**
2118    * USB Global Unique Identifier.
2119    * Available for USB devices. This may even be set if \ref hd_t::bus is not
2120    * \ref bus_usb (e.g. USB storage devices will have \ref hd_t::bus set to
2121    * \ref bus_scsi due to SCSI emulation).
2122    */
2123   char *usb_guid;
2124
2125   driver_info_t *driver_info;   /* device driver info */
2126
2127   str_list_t *requires;         /* packages/programs required for this hardware */
2128
2129   /*
2130    * These are used internally for memory management.
2131    * Do not even _think_ of modifying these!
2132    */
2133   unsigned ref_cnt;             /**< (Internal) memory reference count. */
2134   struct s_hd_t *ref;           /**< (Internal) if set, this is only a reference. */
2135 } hd_t;
2136
2137
2138 /**
2139  * Holds all data accumulated during hardware probing.
2140  */
2141 typedef struct {
2142   /**
2143    * Current hardware list.
2144    * The list of all currently probed hardware. This is not identical with
2145    * the result of \ref hd_list(). (But a superset of it.)
2146    */
2147   hd_t *hd;
2148
2149   /**
2150    * A progress indicator.
2151    * If this callback function is not NULL, it is called at various points and can
2152    * be used to give some user feedback what we are actually doing.
2153    * If the debug flag HD_DEB_PROGRESS is set, progress messages are logged.
2154    * \param pos Indicates where we are.
2155    * \param msg Indicates what we are going to do.
2156    */
2157   void (*progress)(char *pos, char *msg);
2158   
2159   /** Log messages.
2160    * All messages logged during hardware probing accumulate here.
2161    */
2162   char *log;
2163
2164   /** Debug flags.
2165    * Although there exist some debug flag defines this scheme is currently
2166    * not followed consistently. It is guaranteed however that -1 will give
2167    * the most log messages and 0 the least.
2168    */
2169   unsigned debug;
2170
2171   /**
2172    * Special flags.
2173    * Influence hardware probing in some strange ways with these. You normally
2174    * do not want to use them.
2175    */
2176   struct flag_struct {
2177     unsigned internal:1;        /**< \ref hd_scan() has been called internally. */
2178     unsigned dformat:2;         /**< Alternative output format. */
2179     unsigned no_parport:1;      /**< Don't do parport probing: parport modules (used to) crash pmacs. */
2180     unsigned iseries:1;         /**< Set if we are on an iSeries machine. */
2181     unsigned list_all:1;        /**< Return even devices with status 'not available'. */
2182     unsigned fast:1;            /**< Don't check tricky hardware. */
2183     unsigned list_md:1;         /**< Report md & lvm devices from /proc/partitions */
2184     unsigned nofork:1;          /**< don't run potentially hanging code in a subprocess */
2185     unsigned nosysfs:1;         /**< don't ask sysfs */
2186     unsigned forked:1;          /**< we're running in a subprocess */
2187     unsigned cpuemu:1;          /**< use CPU emulation to run BIOS code (i386 only) */
2188     unsigned udev:1;            /**< return first udev symlink as device name */
2189     unsigned edd_used:1;        /**< internal: edd info has been used  */
2190   } flags;
2191
2192
2193   /** Concentrate on tses devices.
2194    * List of sysfs ids for devices to look for.
2195    */
2196   str_list_t *only;
2197
2198   /*
2199    * The following entries should *not* be accessed outside of libhd!
2200    */
2201   unsigned char probe[(pr_all + 7) / 8];        /**< (Internal) bitmask of probing features. */
2202   unsigned char probe_set[(pr_all + 7) / 8];    /**< (Iternal) bitmask of probing features that will always be set. */
2203   unsigned char probe_clr[(pr_all + 7) / 8];    /**< (Internal) bitmask of probing features that will always be reset. */
2204   unsigned last_idx;            /**< (Internal) index of the last hd entry generated */
2205   unsigned module;              /**< (Internal) the current probing module we are in */
2206   enum boot_arch boot;          /**< (Internal) boot method */
2207   hd_t *old_hd;                 /**< (Internal) old (outdated) entries (if you scan more than once) */
2208   pci_t *pci;                   /**< (Internal) raw PCI data */
2209   isapnp_t *isapnp;             /**< (Internal) raw ISA-PnP data */
2210   cdrom_info_t *cdrom;          /**< (Internal) CDROM devs from PROC_CDROM_INFO */
2211   str_list_t *net;              /**< (Internal) list of network interfaces */
2212   str_list_t *floppy;           /**< (Internal) contents of PROC_NVRAM, used by the floppy module */
2213   misc_t *misc;                 /**< (Internal) data gathered in the misc module */
2214   serial_t *serial;             /**< (Internal) /proc's serial info */
2215   scsi_t *scsi;                 /**< (Internal) raw SCSI data */
2216   ser_device_t *ser_mouse;      /**< (Internal) info about serial mice */
2217   ser_device_t *ser_modem;      /**< (Internal) info about serial modems */
2218   str_list_t *cpu;              /**< (Internal) /proc/cpuinfo */
2219   str_list_t *klog;             /**< (Internal) kernel log */
2220   str_list_t *proc_usb;         /**< (Internal) /proc/bus/usb info */
2221   usb_t *usb;                   /**< (Internal) usb info */
2222   hddb_pci_t *hddb_pci_hm;      /**< (Internal) pci module info */
2223   hddb_pci_t *hddb_pci;         /**< (Internal) pci module info */
2224   hddb2_data_t *hddb2[2];       /**< (Internal) hardware database */
2225   str_list_t *kmods;            /**< (Internal) list of active kernel modules */
2226   uint64_t used_irqs;           /**< (Internal) irq usage */
2227   uint64_t assigned_irqs;       /**< (Internal) irqs automatically assigned by libhd (for driver info) */
2228   memory_range_t bios_rom;      /**< (Internal) BIOS 0xc0000 - 0xfffff */
2229   memory_range_t bios_ram;      /**< (Internal) BIOS 0x00400 - 0x004ff */
2230   memory_range_t bios_ebda;     /**< (Internal) EBDA */
2231   unsigned display;             /**< (Internal) hd_idx of the active (vga) display */
2232   unsigned color_code;          /**< (Internal) color, if any */
2233   char *cmd_line;               /**< (Internal) kernel command line */
2234   str_list_t *xtra_hd;          /**< (Internal) fake hd entries (for testing) */
2235   devtree_t *devtree;           /**< (Internal) prom device tree on ppc */
2236   unsigned kernel_version;      /**< (Internal) kernel version */
2237   int in_vmware;                /**< (Internal) running in vmware */
2238   hd_manual_t *manual;          /**< (Internal) hardware config info */
2239   str_list_t *disks;            /**< (Internal) disks according to /proc/partitions */
2240   str_list_t *partitions;       /**< (Internal) dto, partitions */
2241   str_list_t *cdroms;           /**< (Internal) cdroms according to PROC_CDROM_INFO */
2242   hd_smbios_t *smbios;          /**< (Internal) smbios data */
2243   struct {
2244     unsigned ok:1;
2245     unsigned size;
2246     unsigned used;
2247     void *data;
2248     int id;
2249     int updated;
2250   } shm;                        /**< (Internal) our shm segment */
2251   unsigned pci_config_type;     /**< (Internal) PCI config type (1 or 2), 0: unknown */
2252   hd_udevinfo_t *udevinfo;      /**< (Internal) udev info */
2253   hd_sysfsdrv_t *sysfsdrv;      /**< (Internal) sysfs driver info */
2254   uint64_t sysfsdrv_id;         /**< (Internal) sysfs driver info id */
2255   str_list_t *scanner_db;       /**< (Internal) list of scanner modules */
2256 } hd_data_t;
2257
2258
2259 /* - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2260  *
2261  *                      libhd interface functions
2262  *
2263  * - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
2264  */
2265
2266 /* implemented in hd.c */
2267
2268 /* the actual hardware scan */
2269 void hd_scan(hd_data_t *hd_data);
2270
2271 //! Free all data.
2272 hd_data_t *hd_free_hd_data(hd_data_t *hd_data);
2273
2274 //! Free hardware items returned by e.g. \ref hd_list().
2275 hd_t *hd_free_hd_list(hd_t *hd);
2276
2277 void hd_set_probe_feature(hd_data_t *hd_data, enum probe_feature feature);
2278 void hd_clear_probe_feature(hd_data_t *hd_data, enum probe_feature feature);
2279 int hd_probe_feature(hd_data_t *hd_data, enum probe_feature feature);
2280 void hd_set_probe_feature_hw(hd_data_t *hd_data, hd_hw_item_t item);
2281
2282 enum probe_feature hd_probe_feature_by_name(char *name);
2283 char *hd_probe_feature_by_value(enum probe_feature feature);
2284
2285 int hd_module_is_active(hd_data_t *hd_data, char *mod);
2286
2287 hd_t *hd_base_class_list(hd_data_t *hd_data, unsigned base_class);
2288 hd_t *hd_sub_class_list(hd_data_t *hd_data, unsigned base_class, unsigned sub_class);
2289 hd_t *hd_bus_list(hd_data_t *hd_data, unsigned bus);
2290 hd_t *hd_list(hd_data_t *hd_data, hd_hw_item_t item, int rescan, hd_t *hd_old);
2291 hd_t *hd_list_with_status(hd_data_t *hd_data, hd_hw_item_t item, hd_status_t status);
2292 hd_t *hd_list2(hd_data_t *hd_data, hd_hw_item_t *items, int rescan);
2293 hd_t *hd_list_with_status2(hd_data_t *hd_data, hd_hw_item_t *items, hd_status_t status);
2294
2295 int hd_has_special_eide(hd_data_t *hd_data);
2296 int hd_has_pcmcia(hd_data_t *hd_data);
2297 int hd_apm_enabled(hd_data_t *hd_data);
2298 int hd_usb_support(hd_data_t *hd_data);
2299 int hd_smp_support(hd_data_t *hd_data);
2300 int hd_mac_color(hd_data_t *hd_data);
2301 int hd_color(hd_data_t *hd_data);
2302 int hd_is_uml(hd_data_t *hd_data);
2303 unsigned hd_display_adapter(hd_data_t *hd_data);
2304 unsigned hd_boot_disk(hd_data_t *hd_data, int *matches);
2305 enum cpu_arch hd_cpu_arch(hd_data_t *hd_data);
2306 enum boot_arch hd_boot_arch(hd_data_t *hd_data);
2307
2308 hd_t *hd_get_device_by_idx(hd_data_t *hd_data, unsigned idx);
2309
2310 void hd_set_hw_class(hd_t *hd, hd_hw_item_t hw_class);
2311 int hd_is_hw_class(hd_t *hd, hd_hw_item_t hw_class);
2312
2313 char *hd_version(void);
2314
2315 /* implemented in hddb.c */
2316
2317 str_list_t *get_hddb_packages(hd_data_t *hd_data);
2318 void hddb_add_info(hd_data_t *hd_data, hd_t *hd);
2319
2320 void hddb_dump_raw(hddb2_data_t *hddb, FILE *f);
2321 void hddb_dump(hddb2_data_t *hddb, FILE *f);
2322
2323 /* implemented in hdp.c */
2324
2325 void hd_dump_entry(hd_data_t *hd_data, hd_t *hd, FILE *f);
2326
2327
2328 /* implemented in cdrom.c */
2329
2330 cdrom_info_t *hd_read_cdrom_info(hd_data_t *hd_data, hd_t *hd);
2331
2332 /* implemented in manual.c */
2333 hd_manual_t *hd_manual_read_entry(hd_data_t *hd_data, const char *id);
2334 int hd_manual_write_entry(hd_data_t *hd_data, hd_manual_t *entry);
2335 hd_manual_t *hd_free_manual(hd_manual_t *manual);
2336 hd_t *hd_read_config(hd_data_t *hd_data, const char *id);
2337 int hd_write_config(hd_data_t *hd_data, hd_t *hd);
2338 char *hd_hw_item_name(hd_hw_item_t item);
2339 char *hd_status_value_name(hd_status_value_t status);
2340 int hd_change_status(const char *id, hd_status_t status, const char *config_string);
2341
2342
2343 /*
2344  * - - - - - CDB ISDN interface - - - - -
2345  */
2346
2347
2348 /* (C) 2003 kkeil@suse.de */
2349
2350 #define CDBISDN_VERSION 0x0101
2351
2352 #ifndef PCI_ANY_ID
2353 #define PCI_ANY_ID      0xffff
2354 #endif
2355
2356 #define CDBISDN_P_NONE  0x0
2357 #define CDBISDN_P_IRQ   0x1
2358 #define CDBISDN_P_MEM   0x2
2359 #define CDBISDN_P_IO    0x3
2360
2361 /* vendor info */
2362 typedef struct {
2363         char    *name;
2364         char    *shortname;
2365         int     vnr;
2366         int     refcnt;
2367 } cdb_isdn_vendor;
2368
2369 typedef struct  {
2370         int     handle;         /* internal identifier idx in database */
2371         int     vhandle;        /* internal identifier to vendor database */
2372         char    *name;          /* cardname */
2373         char    *lname;         /* vendor short name + cardname */
2374         char    *Class;         /* CLASS of the card */
2375         char    *bus;           /* bus type */
2376         int     revision;       /* revision used with USB */
2377         int     vendor;         /* Vendor ID for ISAPNP and PCI cards */
2378         int     device;         /* Device ID for ISAPNP and PCI cards */
2379         int     subvendor;      /* Subvendor ID for PCI cards */
2380                                 /* A value of 0xffff is ANY_ID */
2381         int     subdevice;      /* Subdevice ID for PCI cards */
2382                                 /* A value of 0xffff is ANY_ID */
2383         unsigned int features;  /* feature flags */
2384         int     line_cnt;       /* count of ISDN ports */
2385         int     vario_cnt;      /* count of driver varios */
2386         int     vario;          /* referenz to driver vario record */
2387 } cdb_isdn_card;
2388
2389 typedef struct  {
2390         int     handle;         /* idx in database */   
2391         int     next_vario;     /* link to alternate vario */
2392         int     drvid;          /* unique id of the driver vario */
2393         int     typ;            /* Type to identify the driver */
2394         int     subtyp;         /* Subtype of the driver type */
2395         int     smp;            /* SMP supported ? */
2396         char    *mod_name;      /* name of the driver module */
2397         char    *para_str;      /* optional parameter string */
2398         char    *mod_preload;   /* optional modules to preload */
2399         char    *cfg_prog;      /* optional cfg prog */
2400         char    *firmware;      /* optional firmware to load */
2401         char    *description;   /* optional description */
2402         char    *need_pkg;      /* list of packages needed for function */
2403         char    *info;          /* optional additional info */
2404         char    *protocol;      /* supported D-channel protocols */
2405         char    *interface;     /* supported API interfaces */
2406         char    *io;            /* possible IO ports with legacy ISA cards */
2407         char    *irq;           /* possible interrupts with legacy ISA cards */
2408         char    *membase;       /* possible membase with legacy ISA cards */
2409         char    *features;      /* optional features*/
2410         int     card_ref;       /* reference to a card */
2411         char    *name;          /* driver name */
2412 } cdb_isdn_vario;
2413
2414
2415 extern cdb_isdn_vendor  *hd_cdbisdn_get_vendor(int);
2416 extern cdb_isdn_card    *hd_cdbisdn_get_card(int);
2417 extern cdb_isdn_vario   *hd_cdbisdn_get_vario_from_type(int, int);
2418 extern cdb_isdn_card    *hd_cdbisdn_get_card_from_type(int, int);
2419 extern cdb_isdn_card    *hd_cdbisdn_get_card_from_id(int, int, int, int);
2420 extern cdb_isdn_vario   *hd_cdbisdn_get_vario(int);
2421 extern int              hd_cdbisdn_get_version(void);
2422 extern int              hd_cdbisdn_get_db_version(void);
2423 extern char             *hd_cdbisdn_get_db_date(void);
2424
2425 /* CDB ISDN interface end */
2426
2427 #ifdef __cplusplus
2428 }
2429 #endif
2430
2431 #endif  /* _HD_H */