• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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