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