mirror of
https://github.com/projectacrn/acrn-hypervisor.git
synced 2025-09-13 21:09:54 +00:00
acrn-config: Generate info in pci_dev file for Pre-Launched VMs
Pre-Launched VMs need the vbar_base values pre-populated for pass-thru PCI devices. This patch moves the pci parser logic from board_cfg_gen to library so that scenario_cfg_gen scripts can use pci parser routines while generating pci_dev file logical partition scenario. Tracked-On: #4666 Signed-off-by: Sainath Grandhi <sainath.grandhi@intel.com>
This commit is contained in:
committed by
wenlingz
parent
b99de16ff5
commit
bf917ae2cb
@@ -6,6 +6,7 @@
|
||||
import re
|
||||
import sys
|
||||
import common
|
||||
import collections
|
||||
|
||||
BOARD_NAME = ''
|
||||
BIOS_INFO = ['BIOS Information', 'Vendor:', 'Version:', 'Release Date:', 'BIOS Revision:']
|
||||
@@ -466,3 +467,129 @@ def get_pci_info(board_info):
|
||||
pci_bdf_vpid[bdf_str] = vid_pid
|
||||
|
||||
return (pci_desc, pci_bdf_vpid)
|
||||
|
||||
HI_MMIO_OFFSET = 0
|
||||
|
||||
class Bar_Mem:
|
||||
def __init__(self):
|
||||
self.addr = 0
|
||||
self.remapped = False
|
||||
|
||||
|
||||
class Bar_Attr:
|
||||
def __init__(self):
|
||||
self.name = 0
|
||||
self.remappable = True
|
||||
self.name_w_i_cnt = 0
|
||||
|
||||
class Pci_Dev_Bar_Desc:
|
||||
def __init__(self):
|
||||
self.pci_dev_dic = {}
|
||||
self.pci_bar_dic = {}
|
||||
|
||||
PCI_DEV_BAR_DESC = Pci_Dev_Bar_Desc()
|
||||
|
||||
|
||||
def get_value_after_str(line, key):
|
||||
""" Get the value after cstate string """
|
||||
idx = 0
|
||||
line_in_list = line.split()
|
||||
for idx_key, val in enumerate(line_in_list):
|
||||
if val == key:
|
||||
idx = idx_key
|
||||
break
|
||||
|
||||
return line_in_list[idx + 1]
|
||||
|
||||
|
||||
def check_bar_remappable(line):
|
||||
#TODO: check device BAR remappable per ACPI table
|
||||
|
||||
return True
|
||||
|
||||
|
||||
def get_size(line):
|
||||
|
||||
# get size string from format, Region n: Memory at x ... [size=NK]
|
||||
size_str = line.split()[-1].strip(']').split('=')[1]
|
||||
if 'G' in size_str:
|
||||
size = int(size_str.strip('G')) * common.SIZE_G
|
||||
elif 'M' in size_str:
|
||||
size = int(size_str.strip('M')) * common.SIZE_M
|
||||
elif 'K' in size_str:
|
||||
size = int(size_str.strip('K')) * common.SIZE_K
|
||||
else:
|
||||
size = int(size_str)
|
||||
|
||||
return size
|
||||
|
||||
# round up the running bar_addr to the size of the incoming bar "line"
|
||||
def remap_bar_addr_to_high(bar_addr, line):
|
||||
"""Generate vbar address"""
|
||||
global HI_MMIO_OFFSET
|
||||
size = get_size(line)
|
||||
cur_addr = common.round_up(bar_addr, size)
|
||||
HI_MMIO_OFFSET = cur_addr + size
|
||||
return cur_addr
|
||||
|
||||
|
||||
def parser_pci():
|
||||
""" Parse PCI lines """
|
||||
cur_bdf = 0
|
||||
prev_bdf = 0
|
||||
tmp_bar_dic = {}
|
||||
bar_addr = bar_num = '0'
|
||||
cal_sub_pci_name = []
|
||||
|
||||
pci_lines = get_info(common.BOARD_INFO_FILE, "<PCI_DEVICE>", "</PCI_DEVICE>")
|
||||
|
||||
for line in pci_lines:
|
||||
tmp_bar_mem = Bar_Mem()
|
||||
# get pci bar information into board_cfg_lib.PCI_DEV_BAR_DESC
|
||||
if "Region" in line and "Memory at" in line:
|
||||
#ignore memory region from SR-IOV capabilities
|
||||
if "size=" not in line:
|
||||
continue
|
||||
|
||||
bar_addr = int(get_value_after_str(line, "at"), 16)
|
||||
bar_num = line.split()[1].strip(':')
|
||||
if bar_addr >= common.SIZE_4G or bar_addr < common.SIZE_2G:
|
||||
if not tmp_bar_attr.remappable:
|
||||
continue
|
||||
|
||||
bar_addr = remap_bar_addr_to_high(HI_MMIO_OFFSET, line)
|
||||
tmp_bar_mem.remapped = True
|
||||
|
||||
tmp_bar_mem.addr = hex(bar_addr)
|
||||
tmp_bar_dic[int(bar_num)] = tmp_bar_mem
|
||||
else:
|
||||
tmp_bar_attr = Bar_Attr()
|
||||
prev_bdf = cur_bdf
|
||||
pci_bdf = line.split()[0]
|
||||
tmp_bar_attr.name = " ".join(line.split(':')[1].split()[1:])
|
||||
|
||||
# remove '[*]' in pci subname
|
||||
if '[' in tmp_bar_attr.name:
|
||||
tmp_bar_attr.name = tmp_bar_attr.name.rsplit('[', 1)[0]
|
||||
|
||||
cal_sub_pci_name.append(tmp_bar_attr.name)
|
||||
tmp_bar_attr.remappable = check_bar_remappable(line)
|
||||
PCI_DEV_BAR_DESC.pci_dev_dic[pci_bdf] = tmp_bar_attr
|
||||
cur_bdf = pci_bdf
|
||||
|
||||
if not prev_bdf:
|
||||
prev_bdf = cur_bdf
|
||||
|
||||
if tmp_bar_dic and cur_bdf != prev_bdf:
|
||||
PCI_DEV_BAR_DESC.pci_bar_dic[prev_bdf] = tmp_bar_dic
|
||||
|
||||
# clear the tmp_bar_dic before store the next dic
|
||||
tmp_bar_dic = {}
|
||||
|
||||
# output all the pci device list to pci_device.h
|
||||
sub_name_count = collections.Counter(cal_sub_pci_name)
|
||||
|
||||
if tmp_bar_dic:
|
||||
PCI_DEV_BAR_DESC.pci_bar_dic[cur_bdf] = tmp_bar_dic
|
||||
|
||||
return sub_name_count
|
||||
|
Reference in New Issue
Block a user