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