1*4882a593Smuzhiyun#!/usr/bin/env python 2*4882a593Smuzhiyun# SPDX-License-Identifier: GPL-2.0 3*4882a593Smuzhiyun 4*4882a593Smuzhiyunimport os 5*4882a593Smuzhiyunfrom optparse import OptionParser 6*4882a593Smuzhiyun 7*4882a593Smuzhiyunhelp_msg = "print verbose messages. Try -vv, -vvv for more verbose messages" 8*4882a593Smuzhiyunparser = OptionParser() 9*4882a593Smuzhiyunparser.add_option( 10*4882a593Smuzhiyun "-v", "--verbose", dest="verbose", help=help_msg, action="count") 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun(options, args) = parser.parse_args() 13*4882a593Smuzhiyun 14*4882a593Smuzhiyunverbose = 0 15*4882a593Smuzhiyunif options.verbose is not None: 16*4882a593Smuzhiyun verbose = options.verbose 17*4882a593Smuzhiyun 18*4882a593Smuzhiyunvmbus_sys_path = '/sys/bus/vmbus/devices' 19*4882a593Smuzhiyunif not os.path.isdir(vmbus_sys_path): 20*4882a593Smuzhiyun print("%s doesn't exist: exiting..." % vmbus_sys_path) 21*4882a593Smuzhiyun exit(-1) 22*4882a593Smuzhiyun 23*4882a593Smuzhiyunvmbus_dev_dict = { 24*4882a593Smuzhiyun '{0e0b6031-5213-4934-818b-38d90ced39db}': '[Operating system shutdown]', 25*4882a593Smuzhiyun '{9527e630-d0ae-497b-adce-e80ab0175caf}': '[Time Synchronization]', 26*4882a593Smuzhiyun '{57164f39-9115-4e78-ab55-382f3bd5422d}': '[Heartbeat]', 27*4882a593Smuzhiyun '{a9a0f4e7-5a45-4d96-b827-8a841e8c03e6}': '[Data Exchange]', 28*4882a593Smuzhiyun '{35fa2e29-ea23-4236-96ae-3a6ebacba440}': '[Backup (volume checkpoint)]', 29*4882a593Smuzhiyun '{34d14be3-dee4-41c8-9ae7-6b174977c192}': '[Guest services]', 30*4882a593Smuzhiyun '{525074dc-8985-46e2-8057-a307dc18a502}': '[Dynamic Memory]', 31*4882a593Smuzhiyun '{cfa8b69e-5b4a-4cc0-b98b-8ba1a1f3f95a}': 'Synthetic mouse', 32*4882a593Smuzhiyun '{f912ad6d-2b17-48ea-bd65-f927a61c7684}': 'Synthetic keyboard', 33*4882a593Smuzhiyun '{da0a7802-e377-4aac-8e77-0558eb1073f8}': 'Synthetic framebuffer adapter', 34*4882a593Smuzhiyun '{f8615163-df3e-46c5-913f-f2d2f965ed0e}': 'Synthetic network adapter', 35*4882a593Smuzhiyun '{32412632-86cb-44a2-9b5c-50d1417354f5}': 'Synthetic IDE Controller', 36*4882a593Smuzhiyun '{ba6163d9-04a1-4d29-b605-72e2ffb1dc7f}': 'Synthetic SCSI Controller', 37*4882a593Smuzhiyun '{2f9bcc4a-0069-4af3-b76b-6fd0be528cda}': 'Synthetic fiber channel adapter', 38*4882a593Smuzhiyun '{8c2eaf3d-32a7-4b09-ab99-bd1f1c86b501}': 'Synthetic RDMA adapter', 39*4882a593Smuzhiyun '{44c4f61d-4444-4400-9d52-802e27ede19f}': 'PCI Express pass-through', 40*4882a593Smuzhiyun '{276aacf4-ac15-426c-98dd-7521ad3f01fe}': '[Reserved system device]', 41*4882a593Smuzhiyun '{f8e65716-3cb3-4a06-9a60-1889c5cccab5}': '[Reserved system device]', 42*4882a593Smuzhiyun '{3375baf4-9e15-4b30-b765-67acb10d607b}': '[Reserved system device]', 43*4882a593Smuzhiyun} 44*4882a593Smuzhiyun 45*4882a593Smuzhiyun 46*4882a593Smuzhiyundef get_vmbus_dev_attr(dev_name, attr): 47*4882a593Smuzhiyun try: 48*4882a593Smuzhiyun f = open('%s/%s/%s' % (vmbus_sys_path, dev_name, attr), 'r') 49*4882a593Smuzhiyun lines = f.readlines() 50*4882a593Smuzhiyun f.close() 51*4882a593Smuzhiyun except IOError: 52*4882a593Smuzhiyun lines = [] 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun return lines 55*4882a593Smuzhiyun 56*4882a593Smuzhiyun 57*4882a593Smuzhiyunclass VMBus_Dev: 58*4882a593Smuzhiyun pass 59*4882a593Smuzhiyun 60*4882a593Smuzhiyun 61*4882a593Smuzhiyunvmbus_dev_list = [] 62*4882a593Smuzhiyun 63*4882a593Smuzhiyunfor f in os.listdir(vmbus_sys_path): 64*4882a593Smuzhiyun vmbus_id = get_vmbus_dev_attr(f, 'id')[0].strip() 65*4882a593Smuzhiyun class_id = get_vmbus_dev_attr(f, 'class_id')[0].strip() 66*4882a593Smuzhiyun device_id = get_vmbus_dev_attr(f, 'device_id')[0].strip() 67*4882a593Smuzhiyun dev_desc = vmbus_dev_dict.get(class_id, 'Unknown') 68*4882a593Smuzhiyun 69*4882a593Smuzhiyun chn_vp_mapping = get_vmbus_dev_attr(f, 'channel_vp_mapping') 70*4882a593Smuzhiyun chn_vp_mapping = [c.strip() for c in chn_vp_mapping] 71*4882a593Smuzhiyun chn_vp_mapping = sorted( 72*4882a593Smuzhiyun chn_vp_mapping, key=lambda c: int(c.split(':')[0])) 73*4882a593Smuzhiyun 74*4882a593Smuzhiyun chn_vp_mapping = [ 75*4882a593Smuzhiyun '\tRel_ID=%s, target_cpu=%s' % 76*4882a593Smuzhiyun (c.split(':')[0], c.split(':')[1]) for c in chn_vp_mapping 77*4882a593Smuzhiyun ] 78*4882a593Smuzhiyun d = VMBus_Dev() 79*4882a593Smuzhiyun d.sysfs_path = '%s/%s' % (vmbus_sys_path, f) 80*4882a593Smuzhiyun d.vmbus_id = vmbus_id 81*4882a593Smuzhiyun d.class_id = class_id 82*4882a593Smuzhiyun d.device_id = device_id 83*4882a593Smuzhiyun d.dev_desc = dev_desc 84*4882a593Smuzhiyun d.chn_vp_mapping = '\n'.join(chn_vp_mapping) 85*4882a593Smuzhiyun if d.chn_vp_mapping: 86*4882a593Smuzhiyun d.chn_vp_mapping += '\n' 87*4882a593Smuzhiyun 88*4882a593Smuzhiyun vmbus_dev_list.append(d) 89*4882a593Smuzhiyun 90*4882a593Smuzhiyun 91*4882a593Smuzhiyunvmbus_dev_list = sorted(vmbus_dev_list, key=lambda d: int(d.vmbus_id)) 92*4882a593Smuzhiyun 93*4882a593Smuzhiyunformat0 = '%2s: %s' 94*4882a593Smuzhiyunformat1 = '%2s: Class_ID = %s - %s\n%s' 95*4882a593Smuzhiyunformat2 = '%2s: Class_ID = %s - %s\n\tDevice_ID = %s\n\tSysfs path: %s\n%s' 96*4882a593Smuzhiyun 97*4882a593Smuzhiyunfor d in vmbus_dev_list: 98*4882a593Smuzhiyun if verbose == 0: 99*4882a593Smuzhiyun print(('VMBUS ID ' + format0) % (d.vmbus_id, d.dev_desc)) 100*4882a593Smuzhiyun elif verbose == 1: 101*4882a593Smuzhiyun print( 102*4882a593Smuzhiyun ('VMBUS ID ' + format1) % 103*4882a593Smuzhiyun (d.vmbus_id, d.class_id, d.dev_desc, d.chn_vp_mapping) 104*4882a593Smuzhiyun ) 105*4882a593Smuzhiyun else: 106*4882a593Smuzhiyun print( 107*4882a593Smuzhiyun ('VMBUS ID ' + format2) % 108*4882a593Smuzhiyun ( 109*4882a593Smuzhiyun d.vmbus_id, d.class_id, d.dev_desc, 110*4882a593Smuzhiyun d.device_id, d.sysfs_path, d.chn_vp_mapping 111*4882a593Smuzhiyun ) 112*4882a593Smuzhiyun ) 113