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