# Copyright 2022 syzkaller project authors. All rights reserved. # Use of this source code is governed by Apache 2 LICENSE that can be found in the LICENSE file. include resource fd_media[fd] resource fd_request[fd] resource media_entity_id[int32]: MEDIA_ENT_ID_FLAG_NEXT resource media_pad_index[int16] syz_open_dev$media(dev ptr[in, string["/dev/media#"]], id intptr, flags flags[open_flags]) fd_media ioctl$MEDIA_IOC_DEVICE_INFO(fd fd_media, cmd const[MEDIA_IOC_DEVICE_INFO], arg ptr[out, array[int8, MEDIA_DEVICE_INFO_SIZE]]) ioctl$MEDIA_IOC_ENUM_ENTITIES(fd fd_media, cmd const[MEDIA_IOC_ENUM_ENTITIES], arg ptr[inout, media_entity_desc]) ioctl$MEDIA_IOC_ENUM_LINKS(fd fd_media, cmd const[MEDIA_IOC_ENUM_LINKS], arg ptr[inout, media_links_enum]) ioctl$MEDIA_IOC_SETUP_LINK(fd fd_media, cmd const[MEDIA_IOC_SETUP_LINK], arg ptr[in, media_link_desc]) ioctl$MEDIA_IOC_G_TOPOLOGY(fd fd_media, cmd const[MEDIA_IOC_G_TOPOLOGY], arg ptr[inout, media_v2_topology]) ioctl$MEDIA_IOC_REQUEST_ALLOC(fd fd_media, cmd const[MEDIA_IOC_REQUEST_ALLOC], arg ptr[out, fd_request]) ioctl$MEDIA_REQUEST_IOC_QUEUE(fd fd_request, cmd const[MEDIA_REQUEST_IOC_QUEUE], arg const[0]) ioctl$MEDIA_REQUEST_IOC_REINIT(fd fd_request, cmd const[MEDIA_REQUEST_IOC_REINIT], arg const[0]) define MEDIA_DEVICE_INFO_SIZE sizeof(struct media_device_info) define MEDIA_ENTITY_DESC_SIZE sizeof(struct media_entity_desc) media_entity_desc { id media_entity_id (in) } [size[MEDIA_ENTITY_DESC_SIZE]] media_links_enum { entity media_entity_id (in) pads ptr[out, array[media_pad_desc, 2]] links ptr[out, array[media_link_desc, 2]] reserved array[const[0, int32], 4] } media_link_desc { source media_pad_desc sink media_pad_desc flags flags[media_link_flags, int32] reserved array[int32, 2] } media_link_flags = MEDIA_LNK_FL_ENABLED, MEDIA_LNK_FL_IMMUTABLE, MEDIA_LNK_FL_DYNAMIC, MEDIA_LNK_FL_DATA_LINK, MEDIA_LNK_FL_INTERFACE_LINK media_pad_desc { entity media_entity_id index media_pad_index flags flags[media_pad_flags, int32] reserved array[int32, 2] } media_pad_flags = MEDIA_PAD_FL_SINK, MEDIA_PAD_FL_SOURCE, MEDIA_PAD_FL_MUST_CONNECT media_v2_topology { topology_version int64 (out) num_entities len[ptr_entities, int32] reserved1 const[0, int32] ptr_entities ptr64[out, array[media_v2_entity]] num_interfaces len[ptr_interfaces, int32] reserved2 const[0, int32] ptr_interfaces ptr64[out, array[media_v2_interface]] num_pads len[ptr_pads, int32] reserved3 const[0, int32] ptr_pads ptr64[out, array[media_v2_pad]] num_links len[ptr_links, int32] reserved4 const[0, int32] ptr_links ptr64[out, array[media_v2_link]] } [packed] media_v2_entity { id media_entity_id name array[int8, 64] function int32 flags int32 reserved array[int32, 5] } [packed] media_v2_interface { id int32 intf_type int32 flags int32 reserved array[int32, 9] raw array[int32, 16] } [packed] media_v2_pad { id int32 entity_id media_entity_id flags int32 # The v1 pad indexes are int16, so we use int16 as resource base, # but v2 pad indexes are int32, so we need the pad. index padto32[media_pad_index] reserved array[int32, 4] } [packed] media_v2_link { id int32 source_id int32 sink_id int32 flags int32 reserved array[int32, 6] } [packed]