3333from chipsec .library .logger import logger
3434from chipsec .library .exceptions import IOBARNotFoundError
3535from chipsec .library .exceptions import CSReadError
36+ from chipsec .library .registers .io import IO
3637
3738DEFAULT_IO_BAR_SIZE = 0x100
3839
@@ -57,50 +58,50 @@ def is_IO_BAR_defined(self, bar_name: str) -> bool:
5758 #
5859 # Get base address of I/O range by IO BAR name
5960 #
60- def get_IO_BAR_base_address (self , bar_name : str ) -> Tuple [int , int ]:
61- bar = self .cs .Cfg .IO_BARS [bar_name ]
62- if bar is None or bar == {}:
61+ def get_IO_BAR_base_address (self , bar_name : str , instance ) -> Tuple [int , int ]:
62+ reglist = self .cs .register .get_list_by_name (bar_name )
63+ bar = reglist [0 ].get_def (bar_name )
64+ if not bar :
6365 raise IOBARNotFoundError (f'IOBARNotFound: { bar_name } ' )
66+ base = 0
67+ empmty_base = 0
6468
65- if 'register' in bar :
66- bar_reg = bar ['register' ]
67- if 'base_field' in bar :
68- base_field = bar ['base_field' ]
69+ if bar .register :
70+ if instance is not None :
71+ bar_reg = self .cs .register .get_instance_by_name (bar .register , instance )
72+ else :
73+ bar_reg = self .cs .register .get_list_by_name (bar .register )[0 ]
74+
75+ if bar .base_field :
76+ base_field = bar .base_field
6977 try :
70- base = self . cs . register . read_field ( bar_reg , base_field , preserve_field_position = True )
78+ base = bar_reg . get_field ( base_field )
7179 except Exception :
72- base = 0
80+ pass
7381 try :
74- empty_base = self . cs . register . get_field_mask (bar_reg , base_field , preserve_field_position = True )
82+ empty_base = bar_reg . get_field_mask (base_field , True )
7583 except Exception :
76- empty_base = 0
84+ pass
7785 else :
7886 try :
79- base = self . cs . register . read (bar_reg )
87+ base = bar_reg . read ()
8088 except Exception :
81- base = 0
89+ pass
8290 try :
83- empty_base = self . cs . register . get_field_mask ( bar_reg , preserve_field_position = True )
91+ empty_base = bar_reg . get_mask ( )
8492 except Exception :
85- empty_base = 0
86- else :
87- # this method is not preferred
88- base = self .cs .hals .Pci .read_word (self .cs .device .get_first_bus (bar ), bar ['dev' ], bar ['fun' ], bar ['reg' ])
89- empty_base = 0xFFFF
90-
91- if 'fixed_address' in bar and (base == empty_base or base == 0 ):
92- base = bar ['fixed_address' ]
93- if logger ().HAL :
94- logger ().log (f'[iobar] Using fixed address for { bar_name } : 0x{ base :016X} ' )
95-
96- if 'mask' in bar :
97- base = base & bar ['mask' ]
98- if 'offset' in bar :
99- base = base + bar ['offset' ]
100- size = bar ['size' ] if ('size' in bar ) else DEFAULT_IO_BAR_SIZE
101-
102- if logger ().HAL :
103- logger ().log (f'[iobar] { bar_name } : 0x{ base :04X} (size = 0x{ size :X} )' )
93+ pass
94+
95+ if bar .fixed_address and (base == empty_base or base == 0 ):
96+ base = bar .fixed_address
97+ self .logger .log_hal (f'[iobar] Using fixed address for { bar_name } : 0x{ base :016X} ' )
98+
99+ if bar .mask :
100+ base = base & bar .mask
101+ if bar .offset :
102+ base = base + bar .offset
103+ size = bar .size if bar .size else DEFAULT_IO_BAR_SIZE
104+ self .logger .log_hal (f'[iobar] { bar_name } : 0x{ base :04X} (size = 0x{ size :X} )' )
104105 if base == 0 :
105106 raise CSReadError (f'IOBAR ({ bar_name } ) base address is 0' )
106107 return base , size
@@ -109,12 +110,11 @@ def get_IO_BAR_base_address(self, bar_name: str) -> Tuple[int, int]:
109110 # Read I/O register from I/O range defined by I/O BAR name
110111 #
111112 def read_IO_BAR_reg (self , bar_name : str , offset : int , size : int ) -> int :
112- if logger ().HAL :
113- logger ().log (f'[iobar] read { bar_name } + 0x{ offset :X} ({ size :d} )' )
113+ self .logger .log_hal (f'[iobar] read { bar_name } + 0x{ offset :X} ({ size :d} )' )
114114 (bar_base , bar_size ) = self .get_IO_BAR_base_address (bar_name )
115115 io_port = bar_base + offset
116- if offset > bar_size and logger () .HAL :
117- logger () .log_warning (f'offset 0x{ offset :X} is outside { bar_name } size (0x{ size :X} )' )
116+ if offset > bar_size and self . logger .HAL :
117+ self . logger .log_warning (f'offset 0x{ offset :X} is outside { bar_name } size (0x{ size :X} )' )
118118 value = self .cs .hals .Io .read (io_port , size )
119119 return value
120120
@@ -123,63 +123,50 @@ def read_IO_BAR_reg(self, bar_name: str, offset: int, size: int) -> int:
123123 #
124124 def write_IO_BAR_reg (self , bar_name : str , offset : int , size : int , value : int ) -> int :
125125 (bar_base , bar_size ) = self .get_IO_BAR_base_address (bar_name )
126- if logger ().HAL :
127- logger ().log (f'[iobar] write { bar_name } + 0x{ offset :X} ({ size :d} ): 0x{ value :X} ' )
126+ self .logger .log_hal (f'[iobar] write { bar_name } + 0x{ offset :X} ({ size :d} ): 0x{ value :X} ' )
128127 io_port = bar_base + offset
129- if offset > bar_size and logger () .HAL :
130- logger () .log_warning (f'offset 0x{ offset :X} is outside { bar_name } size (0x{ size :X} )' )
128+ if offset > bar_size and self . logger .HAL :
129+ self . logger .log_warning (f'offset 0x{ offset :X} is outside { bar_name } size (0x{ size :X} )' )
131130 return self .cs .hals .Io .write (io_port , value , size )
132131
133132 #
134133 # Check if I/O range is enabled by BAR name
135134 #
136135 def is_IO_BAR_enabled (self , bar_name : str ) -> bool :
137- bar = self .cs .Cfg .IO_BARS [bar_name ]
136+ if not self .is_IO_BAR_defined (bar_name ):
137+ return False
138+ bar = IO .get_def (bar_name )
138139 is_enabled = True
139- if 'register' in bar :
140- bar_reg = bar [ ' register' ]
141- if 'enable_field' in bar :
142- bar_en_field = bar [ ' enable_field' ]
143- is_enabled = (1 == self . cs . register . read_field (bar_reg , bar_en_field ))
140+ if bar . register :
141+ bar_reg = bar . register
142+ if bar . enable_field :
143+ bar_en_field = bar . enable_field
144+ is_enabled = (1 == bar_reg . read_field (bar_en_field ))
144145 return is_enabled
145146
146147 def list_IO_BARs (self ) -> None :
147148 logger ().log ('' )
148149 logger ().log ('--------------------------------------------------------------------------------' )
149- logger ().log (' I/O Range | BAR Register | Base | Size | En? | Description' )
150+ logger ().log (f' { " I/O Range" :35 } | { "B:D.F" :7 } | { " Base" :16 } | { " Size" :8 } | { " En?" :3 } | Description' )
150151 logger ().log ('--------------------------------------------------------------------------------' )
151- for _bar_name in self .cs .Cfg .IO_BARS :
152- if not self .is_IO_BAR_defined (_bar_name ):
153- continue
154- _bar = self .cs .Cfg .IO_BARS [_bar_name ]
155- bus_data = []
156- if 'register' in _bar :
157- bus_data = self .cs .register .get_bus (_bar ['register' ])
158- if not bus_data :
159- if 'bus' in self .cs .register .get_def (_bar ['register' ]):
160- bus_data = [self .cs .register .get_def (_bar ['register' ])['bus' ]]
161- elif 'bus' in _bar :
162- bus_data .extend (_bar ['bus' ])
163- else :
164- continue
165-
166- for bus in bus_data :
167- try :
168- (_base , _size ) = self .get_IO_BAR_base_address (_bar_name )
169- except CSReadError :
170- if self .logger .HAL :
171- self .logger .log (f"Unable to find IO BAR { _bar_name } " )
172- continue
173- _en = self .is_IO_BAR_enabled (_bar_name )
174-
175- if 'register' in _bar :
176- _s = _bar ['register' ]
177- if 'offset' in _bar :
178- _s += (f' + 0x{ _bar ["offset" ]:X} ' )
179- else :
180- _s = f'{ bus :02X} :{ _bar ["dev" ]:02X} .{ _bar ["fun" ]:01X} + { _bar ["reg" ]} '
181-
182- logger ().log (f' { _bar_name :12} | { _s :14} | { _base :016X} | { _size :08X} | { _en :d} | { _bar ["desc" ]} ' )
152+ for vid in self .cs .Cfg .IO_BARS :
153+ for dev in self .cs .Cfg .IO_BARS [vid ]:
154+ for _bar_name in self .cs .Cfg .IO_BARS [vid ][dev ]:
155+ bar_name = f'{ vid } .{ dev } .{ _bar_name } '
156+ if not self .is_IO_BAR_defined (bar_name ):
157+ continue
158+ _bar = self .cs .Cfg .IO_BARS [vid ][dev ][_bar_name ]
159+
160+ for instance in _bar .instances :
161+ (_base , _size ) = _bar .get_base (instance )
162+ if _base is None :
163+ (_base , _size ) = self .get_IO_BAR_base_address (bar_name , instance )
164+ _en = self .is_IO_BAR_enabled (bar_name , instance )
165+ if instance .bus is not None :
166+ bdf = f'{ instance .bus :02X} :{ instance .dev :02X} .{ instance .fun :1X} '
167+ else :
168+ bdf = 'fixed'
169+ logger ().log (f' { _bar_name :35} | { bdf :7} | { _base :016X} | { _size :08X} | { _en :d} | { _bar ["desc" ]} ' )
183170
184171 #
185172 # Read I/O range by I/O BAR name
@@ -199,10 +186,10 @@ def dump_IO_BAR(self, bar_name: str, size: int = 1) -> None:
199186 (range_base , range_size ) = self .get_IO_BAR_base_address (bar_name )
200187 n = range_size // size
201188 fmt = f'0{ size * 2 :d} X'
202- logger () .log (f"[iobar] I/O BAR { bar_name } :" )
189+ self . logger .log (f"[iobar] I/O BAR { bar_name } :" )
203190 for i in range (n ):
204191 reg = self .cs .hals .Io .read (range_base + i * size , size )
205- logger () .log (f'{ size * i :+04X} : { reg :{fmt }} ' )
192+ self . logger .log (f'{ size * i :+04X} : { reg :{fmt }} ' )
206193
207194
208195haldata = {"arch" :[hal_base .HALBase .MfgIds .Any ], 'name' : ['IOBAR' ]}
0 commit comments