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