1/*
2 * Copyright 2006, Haiku, Inc. All Rights Reserved.
3 * Distributed under the terms of the MIT License.
4 *
5 * Authors:
6 * 	Jérôme Duval
7 */
8
9#include <stdio.h>
10
11static void
12get_class_info(uint8 pci_class_base_id, uint8 pci_class_sub_id, uint8 pci_class_api_id, char *classInfo, size_t size)
13{
14	if (pci_class_base_id == 0x80)
15		snprintf(classInfo, size, " (Other)");
16	else {
17		PCI_CLASSCODETABLE *foundItem = NULL;
18		int i;
19		for (i = 0; i < (int)PCI_CLASSCODETABLE_LEN; i++) {
20			if ((pci_class_base_id == PciClassCodeTable[i].BaseClass)
21				&& (pci_class_sub_id == PciClassCodeTable[i].SubClass)) {
22				foundItem = &PciClassCodeTable[i];
23				if (pci_class_api_id == PciClassCodeTable[i].ProgIf)
24					break;
25			}
26		}
27		if (foundItem) {
28			if (pci_class_sub_id != 0x80)
29				snprintf(classInfo, size, "%s (%s%s%s)", foundItem->BaseDesc, foundItem->SubDesc,
30					(foundItem->ProgDesc && strcmp("", foundItem->ProgDesc)) ? ", " : "", foundItem->ProgDesc);
31			else
32				snprintf(classInfo, size, "%s", foundItem->BaseDesc);
33		} else
34				snprintf(classInfo, size, "%s (%u:%u:%u)", "(Unknown)",
35					pci_class_base_id, pci_class_sub_id, pci_class_api_id);
36	}
37}
38
39static void
40get_vendor_info(uint16 vendorID, const char **venShort, const char **venFull)
41{
42	int i;
43	for (i = 0; i < (int)PCI_VENTABLE_LEN; i++) {
44		if (PciVenTable[i].VenId == vendorID) {
45			if (PciVenTable[i].VenShort && PciVenTable[i].VenFull
46				&& 0 == strcmp(PciVenTable[i].VenShort, PciVenTable[i].VenFull)) {
47				*venShort = PciVenTable[i].VenShort[0] ? PciVenTable[i].VenShort : NULL;
48				*venFull = NULL;
49			} else {
50				*venShort = PciVenTable[i].VenShort && PciVenTable[i].VenShort[0] ? PciVenTable[i].VenShort : NULL;
51				*venFull = PciVenTable[i].VenFull && PciVenTable[i].VenFull[0] ? PciVenTable[i].VenFull : NULL;
52			}
53			return;
54		}
55	}
56	*venShort = NULL;
57	*venFull = NULL;
58}
59
60
61static void
62get_device_info(uint16 vendorID, uint16 deviceID,
63	uint16 subvendorID, uint16 subsystemID, const char **devShort, const char **devFull)
64{
65	int i;
66	*devShort = NULL;
67	*devFull = NULL;
68
69	// search for the device
70	for (i = 0; i < (int)PCI_DEVTABLE_LEN; i++) {
71		if (PciDevTable[i].VenId == vendorID && PciDevTable[i].DevId == deviceID ) {
72			*devShort = PciDevTable[i].ChipDesc && PciDevTable[i].ChipDesc[0] ? PciDevTable[i].ChipDesc : NULL;
73			if (PciDevTable[i].SubVenId == 0 || PciDevTable[i].SubDevId == 0)
74				i++;
75			break;
76		}
77	}
78
79	// search for the subsystem eventually
80	for (; i < (int)PCI_DEVTABLE_LEN; i++) {
81		if (PciDevTable[i].VenId != vendorID || PciDevTable[i].DevId != deviceID)
82			break;
83		if (PciDevTable[i].SubVenId == subvendorID && PciDevTable[i].SubDevId == subsystemID) {
84			*devFull = PciDevTable[i].ChipDesc && PciDevTable[i].ChipDesc[0] ? PciDevTable[i].ChipDesc : NULL;
85			break;
86		}
87	}
88}
89