1"""Functions related to program configs. 2 3See proto definitions for descriptions of arguments. 4""" 5 6load( 7 "@proto//chromiumos/config/api/design_id.proto", 8 design_id_pb = "chromiumos.config.api", 9) 10load( 11 "@proto//chromiumos/config/api/device_brand_id.proto", 12 db_id_pb = "chromiumos.config.api", 13) 14load( 15 "@proto//chromiumos/config/api/program.proto", 16 program_pb = "chromiumos.config.api", 17) 18load( 19 "@proto//chromiumos/config/api/program_id.proto", 20 program_id_pb = "chromiumos.config.api", 21) 22load( 23 "@proto//chromiumos/config/api/schedqos_config.proto", 24 schedqos_pb = "chromiumos.config.api", 25) 26 27# Needed to load from @proto. Add @unused to silence lint. 28load("//config/util/bindings/proto.star", "protos") 29load("//config/util/generate.star", "generate") 30load("//config/util/hw_topology.star", "hw_topo") 31load("//config/util/public_replication.star", "public_replication") 32 33_DEFAULT_PUBLIC_FIELDS = ["name", "id", "base_program"] 34 35_LAUNCHED_PUBLIC_FIELDS = [ 36 "audio_config", 37 "platform.arc_settings", 38 "platform.capabilities", 39 "platform.hevc_support", 40 "platform.resource_config", 41 "platform.scheduler_tune", 42 "platform.schedqos_config", 43 "platform.swap_config", 44 "mosys_platform_name", 45 "generate_camera_media_profiles", 46] 47 48def _create_schedqos(default = None): 49 """Builds a SchedqosConfig proto""" 50 return schedqos_pb.SchedqosConfig( 51 default = default, 52 ) 53 54def _create_schedqos_config_set( 55 normal_cpu_share = None, 56 background_cpu_share = None, 57 thread_urgent_bursty = None, 58 thread_urgent = None, 59 thread_balanced = None, 60 thread_eco = None, 61 thread_utility = None, 62 thread_background = None, 63 thread_urgent_bursty_server = None, 64 thread_urgent_bursty_client = None): 65 """Builds a ConfigSet proto for schedqos""" 66 return schedqos_pb.SchedqosConfig.ConfigSet( 67 normal_cpu_share = normal_cpu_share, 68 background_cpu_share = background_cpu_share, 69 thread_urgent_bursty = thread_urgent_bursty, 70 thread_urgent = thread_urgent, 71 thread_balanced = thread_balanced, 72 thread_eco = thread_eco, 73 thread_utility = thread_utility, 74 thread_background = thread_background, 75 thread_urgent_bursty_server = thread_urgent_bursty_server, 76 thread_urgent_bursty_client = thread_urgent_bursty_client, 77 ) 78 79def _create_schedqos_thread_config( 80 rt_priority = None, 81 nice = None, 82 uclamp_min = None, 83 cpuset_cgroup = None, 84 latency_sensitive = None): 85 """Builds a ThreadConfig proto for schedqos""" 86 thread_config = schedqos_pb.SchedqosConfig.ThreadConfig( 87 cpuset_cgroup = cpuset_cgroup, 88 ) 89 if rt_priority != None: 90 thread_config.rt_priority.value = rt_priority 91 if nice != None: 92 thread_config.nice.value = nice 93 if uclamp_min != None: 94 thread_config.uclamp_min.value = uclamp_min 95 if latency_sensitive != None: 96 thread_config.latency_sensitive.value = latency_sensitive 97 return thread_config 98 99_SCHEDQOS_CPUSET_CGROUP = struct( 100 ALL = schedqos_pb.SchedqosConfig.CPUSET_CGROUP_ALL, 101 EFFICIENT = schedqos_pb.SchedqosConfig.CPUSET_CGROUP_EFFICIENT, 102) 103 104def _create_firmware_configuration_segment(name, mask): 105 """Builds a FirmwareConfigurationSegment proto.""" 106 return program_pb.FirmwareConfigurationSegment( 107 name = name, 108 mask = mask, 109 ) 110 111def _create_design_config_id_segment(design_id, min_id, max_id): 112 """Builds a DesignConfigIdSegment proto.""" 113 return program_pb.DesignConfigIdSegment( 114 design_id = design_id, 115 min_id = min_id, 116 max_id = max_id, 117 ) 118 119# TODO(shapiroc): Migrate clients, make this private, and fix param order 120def _create_signer_config(device_brand_id, key_id, design_id = None): 121 """Builds a DeviceSignerConfig proto.""" 122 if design_id: 123 return program_pb.DeviceSignerConfig( 124 design_id = design_id_pb.DesignId(value = design_id), 125 key_id = key_id, 126 ) 127 else: 128 return program_pb.DeviceSignerConfig( 129 brand_id = db_id_pb.DeviceBrandId(value = device_brand_id), 130 key_id = key_id, 131 ) 132 133def _create_signer_config_by_brand(device_brand_id, key_id): 134 return _create_signer_config(device_brand_id = device_brand_id, key_id = key_id) 135 136def _create_signer_configs_by_brand(configs): 137 return [_create_signer_config_by_brand(id, key) for id, key in configs.items()] 138 139def _create_signer_config_by_design(design_id, key_id): 140 return _create_signer_config(design_id = design_id, key_id = key_id, device_brand_id = None) 141 142def _create_signer_configs_by_design(configs): 143 return [_create_signer_config_by_design(id, key) for id, key in configs.items()] 144 145def _create_swap_config( 146 size_multiplier = None): 147 swap_config = None 148 if any([ 149 size_multiplier != None, 150 ]): 151 swap_config = program_pb.Program.Platform.SwapConfig( 152 size_multiplier = size_multiplier, 153 ) 154 return swap_config 155 156def _create_platform( 157 soc_family, 158 soc_arch, 159 gpu_family = None, 160 graphics_apis = [], 161 video_codecs = [], 162 suspend_to_idle = None, 163 dark_resume = None, 164 wake_on_dp = None, 165 boost_urgent = None, 166 cpuset_nonurgent = None, 167 input_boost = None, 168 boost_top_app = None, 169 boost_arcvm = None, 170 hevc_support = None, 171 arc_media_codecs_suffix = None, 172 resource = None, 173 schedqos = None, 174 swap_config = None): 175 capabilities = None 176 if any([ 177 suspend_to_idle != None, 178 dark_resume != None, 179 wake_on_dp != None, 180 ]): 181 capabilities = program_pb.Program.Platform.Capabilities( 182 suspend_to_idle = suspend_to_idle, 183 dark_resume = dark_resume, 184 wake_on_dp = wake_on_dp, 185 ) 186 187 scheduler_tune = None 188 if any([ 189 boost_urgent != None, 190 cpuset_nonurgent != None, 191 input_boost != None, 192 boost_top_app != None, 193 boost_arcvm != None, 194 ]): 195 scheduler_tune = program_pb.Program.Platform.SchedulerTune( 196 boost_urgent = boost_urgent, 197 cpuset_nonurgent = cpuset_nonurgent, 198 input_boost = input_boost, 199 boost_top_app = boost_top_app, 200 boost_arcvm = boost_arcvm, 201 ) 202 203 arc_settings = None 204 if any([ 205 arc_media_codecs_suffix != None, 206 ]): 207 arc_settings = program_pb.Program.Platform.ArcSettings( 208 media_codecs_suffix = arc_media_codecs_suffix, 209 ) 210 211 return program_pb.Program.Platform( 212 soc_family = soc_family, 213 soc_arch = soc_arch, 214 gpu_family = gpu_family, 215 graphics_apis = graphics_apis, 216 video_codecs = video_codecs, 217 capabilities = capabilities, 218 scheduler_tune = scheduler_tune, 219 arc_settings = arc_settings, 220 hevc_support = hw_topo.bool_to_present(hevc_support), 221 resource_config = resource, 222 schedqos_config = schedqos, 223 swap_config = swap_config, 224 ) 225 226def _create_audio_config( 227 card_configs = [], 228 has_module_file = False, 229 default_ucm_suffix = "{model}", 230 default_cras_suffix = ""): 231 """Builds an AudioConfig proto. 232 233 Args: 234 card_configs: A list of CardConfig protos specifying card configs to be 235 installed and used for all designs within this program. Individual 236 projects will not be able to modify card configs set here, so this 237 should only be used for configs needing to be present on all 238 designs such as HDMI/DP audio out consistently provided by the SoC 239 platform. 240 has_module_file: A boolean specifying whether an alsa module file 241 should be installed. 242 default_ucm_suffix: A default format string used to generate the 243 parts of the UCM suffix not referring to audio components. This 244 value is used for any card config not providing a value for 245 ucm_config. The following placeholders may be used: 246 {design}: The design name. 247 {camera_count}: The number of cameras (usually 0, 1 or 2). 248 {headset_codec}: The headset codec name (in lowercase) 249 specified in the topology containing the card config. 250 {speaker_amp}: The speaker amp name (in lowercase) specified in 251 the topology containing the card config. 252 {mic_description}: A description of the microphone topology, of 253 the form {user_facing_mic_count}uf{world_facing_mic_count}wf, with 254 components elided if their count is 0. 255 {total_mic_count}: The total number of internal microphones. 256 {user_facing_mic_count}: The number of internal user-facing microphones. 257 {world_facing_mic_count}: The number of internal world-facing microphones. 258 default_cras_suffix: Similar to default_ucm_suffix. 259 launched: A bool indicating whether this program is launched, and as 260 such whether additional preset fields should be made public. 261 """ 262 return program_pb.Program.AudioConfig( 263 card_configs = card_configs, 264 has_module_file = has_module_file, 265 default_ucm_suffix = default_ucm_suffix, 266 default_cras_suffix = default_cras_suffix, 267 ) 268 269def _create( 270 name, 271 base_program = None, 272 public_fields = [], 273 component_quals = None, 274 constraints = None, 275 firmware_configuration_segments = None, 276 ssfc_segments = None, 277 design_config_id_segments = None, 278 device_signer_configs = None, 279 mosys_platform_name = None, 280 platform = None, 281 audio_config = None, 282 generate_camera_media_profiles = None, 283 launched = False): 284 """Builds a Program proto.""" 285 program_id = program_id_pb.ProgramId(value = name) 286 287 public_fields = list(public_fields) 288 public_fields += _DEFAULT_PUBLIC_FIELDS 289 if launched: 290 public_fields += _LAUNCHED_PUBLIC_FIELDS 291 292 return program_pb.Program( 293 public_replication = public_replication.create(public_fields = public_fields), 294 id = program_id, 295 name = name, 296 base_program = base_program, 297 component_quals = component_quals, 298 design_config_constraints = constraints, 299 firmware_configuration_segments = firmware_configuration_segments, 300 ssfc_segments = ssfc_segments, 301 design_config_id_segments = design_config_id_segments, 302 device_signer_configs = device_signer_configs, 303 mosys_platform_name = mosys_platform_name, 304 platform = platform, 305 audio_config = audio_config, 306 generate_camera_media_profiles = generate_camera_media_profiles, 307 ) 308 309program = struct( 310 create = _create, 311 create_audio_config = _create_audio_config, 312 create_platform = _create_platform, 313 create_firmware_configuration_segment = _create_firmware_configuration_segment, 314 create_design_config_id_segment = _create_design_config_id_segment, 315 create_signer_config = _create_signer_config, 316 create_signer_config_by_brand = _create_signer_config_by_brand, 317 create_signer_configs_by_brand = _create_signer_configs_by_brand, 318 create_signer_config_by_design = _create_signer_config_by_design, 319 create_signer_configs_by_design = _create_signer_configs_by_design, 320 create_schedqos = _create_schedqos, 321 create_schedqos_config_set = _create_schedqos_config_set, 322 create_schedqos_thread_config = _create_schedqos_thread_config, 323 create_swap_config = _create_swap_config, 324 generate = generate.generate, 325 platform = program_pb.Program.Platform, 326 schedqos_cpuset_cgroup = _SCHEDQOS_CPUSET_CGROUP, 327) 328