1 /* 2 * Copyright 2008-2009 Haiku Inc. All rights reserved. 3 * Distributed under the terms of the MIT License. 4 * 5 * Authors: 6 * Pieter Panman 7 */ 8 9 10 #include "DevicePCI.h" 11 12 #include <sstream> 13 #include <stdlib.h> 14 15 #include <Catalog.h> 16 17 #undef B_TRANSLATION_CONTEXT 18 #define B_TRANSLATION_CONTEXT "DevicePCI" 19 20 extern "C" { 21 #include "dm_wrapper.h" 22 #include "pcihdr.h" 23 #include "pci-utils.h" 24 } 25 26 27 DevicePCI::DevicePCI(Device* parent) 28 : 29 Device(parent), 30 fClassBaseId(0), 31 fClassSubId(0), 32 fClassApiId(0), 33 fVendorId(0), 34 fDeviceId(0), 35 fSubsystemVendorId(0), 36 fSubSystemId(0) 37 { 38 } 39 40 41 DevicePCI::~DevicePCI() 42 { 43 } 44 45 46 BString ToHex(uint16 num) 47 { 48 std::stringstream ss; 49 ss.flags(std::ios::hex | std::ios::showbase); 50 ss << num; 51 return BString(ss.str().c_str()); 52 } 53 54 55 void 56 DevicePCI::InitFromAttributes() 57 { 58 // Process the attributes 59 fClassBaseId = atoi(fAttributeMap[B_DEVICE_TYPE].String()); 60 fClassSubId = atoi(fAttributeMap[B_DEVICE_SUB_TYPE].String()); 61 fClassApiId = atoi(fAttributeMap[B_DEVICE_INTERFACE].String()); 62 fVendorId = atoi(fAttributeMap[B_DEVICE_VENDOR_ID].String()); 63 fDeviceId = atoi(fAttributeMap[B_DEVICE_ID].String()); 64 65 // Looks better in Hex, so rewrite 66 fAttributeMap[B_DEVICE_TYPE] = ToHex(fClassBaseId); 67 fAttributeMap[B_DEVICE_SUB_TYPE] = ToHex(fClassSubId); 68 fAttributeMap[B_DEVICE_INTERFACE] = ToHex(fClassApiId); 69 fAttributeMap[B_DEVICE_VENDOR_ID] = ToHex(fVendorId); 70 fAttributeMap[B_DEVICE_ID] = ToHex(fDeviceId); 71 72 // Fetch ClassInfo 73 char classInfo[128]; 74 get_class_info(fClassBaseId, fClassSubId, fClassApiId, classInfo, 75 sizeof(classInfo)); 76 77 // Fetch ManufacturerName 78 BString ManufacturerName; 79 const char *venShort; 80 const char *venFull; 81 get_vendor_info(fVendorId, &venShort, &venFull); 82 if (!venShort && !venFull) { 83 ManufacturerName << B_TRANSLATE("Unknown"); 84 } else if (venShort && venFull) { 85 ManufacturerName << venFull << "(" << venShort << ")"; 86 } else { 87 ManufacturerName << (venShort ? venShort : venFull); 88 } 89 90 // Fetch DeviceName 91 BString DeviceName; 92 const char *devShort; 93 const char *devFull; 94 get_device_info(fVendorId, fDeviceId, fSubsystemVendorId, fSubSystemId, 95 &devShort, &devFull); 96 if (!devShort && !devFull) { 97 DeviceName << B_TRANSLATE("Unknown"); 98 } else if (devShort && devFull) { 99 DeviceName << devFull << "(" << devShort << ")"; 100 } else { 101 DeviceName << (devShort ? devShort : devFull); 102 } 103 104 SetAttribute(B_TRANSLATE("Device name"), DeviceName); 105 SetAttribute(B_TRANSLATE("Manufacturer"), ManufacturerName); 106 #if 0 107 // These are a source of confusion for users, leading them to think there 108 // is no driver for their device. Until we can display something useful, 109 // let's not show the lines at all. 110 SetAttribute(B_TRANSLATE("Driver used"), B_TRANSLATE("Not implemented")); 111 SetAttribute(B_TRANSLATE("Device paths"), B_TRANSLATE("Not implemented")); 112 #endif 113 SetAttribute(B_TRANSLATE("Class info"), classInfo); 114 fCategory = (Category)fClassBaseId; 115 BString outlineName; 116 outlineName << ManufacturerName << " " << DeviceName; 117 SetText(outlineName.String()); 118 } 119 120 121 Attributes 122 DevicePCI::GetBusAttributes() 123 { 124 Attributes attributes; 125 attributes.push_back(GetAttribute(B_DEVICE_TYPE)); 126 attributes.push_back(GetAttribute(B_DEVICE_SUB_TYPE)); 127 attributes.push_back(GetAttribute(B_DEVICE_INTERFACE)); 128 attributes.push_back(GetAttribute(B_DEVICE_VENDOR_ID)); 129 attributes.push_back(GetAttribute(B_DEVICE_ID)); 130 return attributes; 131 } 132 133 134 BString 135 DevicePCI::GetBusStrings() 136 { 137 BString str("Class Info:\t\t\t\t: %classInfo%"); 138 str.ReplaceFirst("%classInfo%", fAttributeMap["Class Info"]); 139 return str; 140 } 141 142 143 BString 144 DevicePCI::GetBusTabName() 145 { 146 return B_TRANSLATE("PCI Information"); 147 } 148 149