sphinx.addnodesdocument)}( rawsourcechildren]( translations LanguagesNode)}(hhh](h pending_xref)}(hhh]docutils.nodesTextChinese (Simplified)}parenthsba attributes}(ids]classes]names]dupnames]backrefs] refdomainstdreftypedoc reftarget4/translations/zh_CN/driver-api/fpga/fpga-programmingmodnameN classnameN refexplicitutagnamehhh ubh)}(hhh]hChinese (Traditional)}hh2sbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/zh_TW/driver-api/fpga/fpga-programmingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hItalian}hhFsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/it_IT/driver-api/fpga/fpga-programmingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hJapanese}hhZsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/ja_JP/driver-api/fpga/fpga-programmingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hKorean}hhnsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/ko_KR/driver-api/fpga/fpga-programmingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hPortuguese (Brazilian)}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/pt_BR/driver-api/fpga/fpga-programmingmodnameN classnameN refexplicituh1hhh ubh)}(hhh]hSpanish}hhsbah}(h]h ]h"]h$]h&] refdomainh)reftypeh+ reftarget4/translations/sp_SP/driver-api/fpga/fpga-programmingmodnameN classnameN refexplicituh1hhh ubeh}(h]h ]h"]h$]h&]current_languageEnglishuh1h hh _documenthsourceNlineNubhsection)}(hhh](htitle)}(h"In-kernel API for FPGA Programmingh]h"In-kernel API for FPGA Programming}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhN/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming.rsthKubh)}(hhh](h)}(hOverviewh]hOverview}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhhhhhKubh paragraph)}(hThe in-kernel API for FPGA programming is a combination of APIs from FPGA manager, bridge, and regions. The actual function used to trigger FPGA programming is fpga_region_program_fpga().h]hThe in-kernel API for FPGA programming is a combination of APIs from FPGA manager, bridge, and regions. The actual function used to trigger FPGA programming is fpga_region_program_fpga().}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hafpga_region_program_fpga() uses functionality supplied by the FPGA manager and bridges. It will:h]hafpga_region_program_fpga() uses functionality supplied by the FPGA manager and bridges. It will:}(hhhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK hhhhubh block_quote)}(hX* lock the region's mutex * lock the mutex of the region's FPGA manager * build a list of FPGA bridges if a method has been specified to do so * disable the bridges * program the FPGA using info passed in :c:expr:`fpga_region->info`. * re-enable the bridges * release the locks h]h bullet_list)}(hhh](h list_item)}(hlock the region's mutexh]h)}(hj h]hlock the region’s mutex}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(h+lock the mutex of the region's FPGA managerh]h)}(hj h]h-lock the mutex of the region’s FPGA manager}(hj"hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hDbuild a list of FPGA bridges if a method has been specified to do soh]h)}(hj7h]hDbuild a list of FPGA bridges if a method has been specified to do so}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj5ubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hdisable the bridgesh]h)}(hjNh]hdisable the bridges}(hjPhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjLubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hBprogram the FPGA using info passed in :c:expr:`fpga_region->info`.h]h)}(hjeh](h&program the FPGA using info passed in }(hjghhhNhNubh desc_inline)}(hfpga_region->infoh](h)}(hhh]h desc_sig_name)}(h fpga_regionh]h fpga_region}(hjyhhhNhNubah}(h]h ]nah"]h$]h&]uh1jwhjtubah}(h]h ]h"]h$]h&] refdomaincreftype identifier reftargetj{modnameN classnameN c:parent_keysphinx.domains.c LookupKey)}data]sbuh1hhjpubhdesc_sig_operator)}(h->h]h->}(hjhhhNhNubah}(h]h ]oah"]h$]h&]uh1jhjpubjx)}(hinfoh]hinfo}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjpubeh}(h]h ](c-exprsig sig-inlinejeh"]h$]h&]uh1jnhjgubh.}(hjghhhNhNubeh}(h]h ]h"]h$]h&]uh1hhhhKhjcubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hre-enable the bridgesh]h)}(hjh]hre-enable the bridges}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubj)}(hrelease the locks h]h)}(hrelease the locksh]hrelease the locks}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhjubah}(h]h ]h"]h$]h&]uh1jhjubeh}(h]h ]h"]h$]h&]bullet*uh1jhhhKhhubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubh)}(hThe struct fpga_image_info specifies what FPGA image to program. It is allocated/freed by fpga_image_info_alloc() and freed with fpga_image_info_free()h]hThe struct fpga_image_info specifies what FPGA image to program. It is allocated/freed by fpga_image_info_alloc() and freed with fpga_image_info_free()}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhhhhubeh}(h]overviewah ]h"]overviewah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(h%How to program an FPGA using a regionh]h%How to program an FPGA using a region}(hj+hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj(hhhhhKubh)}(hX0When the FPGA region driver probed, it was given a pointer to an FPGA manager driver so it knows which manager to use. The region also either has a list of bridges to control during programming or it has a pointer to a function that will generate that list. Here's some sample code of what to do next::h]hX1When the FPGA region driver probed, it was given a pointer to an FPGA manager driver so it knows which manager to use. The region also either has a list of bridges to control during programming or it has a pointer to a function that will generate that list. Here’s some sample code of what to do next:}(hj9hhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKhj(hhubh literal_block)}(hXs#include #include struct fpga_image_info *info; int ret; /* * First, alloc the struct with information about the FPGA image to * program. */ info = fpga_image_info_alloc(dev); if (!info) return -ENOMEM; /* Set flags as needed, such as: */ info->flags = FPGA_MGR_PARTIAL_RECONFIG; /* * Indicate where the FPGA image is. This is pseudo-code; you're * going to use one of these three. */ if (image is in a scatter gather table) { info->sgt = [your scatter gather table] } else if (image is in a buffer) { info->buf = [your image buffer] info->count = [image buffer size] } else if (image is in a firmware file) { info->firmware_name = devm_kstrdup(dev, firmware_name, GFP_KERNEL); } /* Add info to region and do the programming */ region->info = info; ret = fpga_region_program_fpga(region); /* Deallocate the image info if you're done with it */ region->info = NULL; fpga_image_info_free(info); if (ret) return ret; /* Now enumerate whatever hardware has appeared in the FPGA. */h]hXs#include #include struct fpga_image_info *info; int ret; /* * First, alloc the struct with information about the FPGA image to * program. */ info = fpga_image_info_alloc(dev); if (!info) return -ENOMEM; /* Set flags as needed, such as: */ info->flags = FPGA_MGR_PARTIAL_RECONFIG; /* * Indicate where the FPGA image is. This is pseudo-code; you're * going to use one of these three. */ if (image is in a scatter gather table) { info->sgt = [your scatter gather table] } else if (image is in a buffer) { info->buf = [your image buffer] info->count = [image buffer size] } else if (image is in a firmware file) { info->firmware_name = devm_kstrdup(dev, firmware_name, GFP_KERNEL); } /* Add info to region and do the programming */ region->info = info; ret = fpga_region_program_fpga(region); /* Deallocate the image info if you're done with it */ region->info = NULL; fpga_image_info_free(info); if (ret) return ret; /* Now enumerate whatever hardware has appeared in the FPGA. */}hjIsbah}(h]h ]h"]h$]h&] xml:spacepreserveuh1jGhhhK"hj(hhubeh}(h]%how-to-program-an-fpga-using-a-regionah ]h"]%how to program an fpga using a regionah$]h&]uh1hhhhhhhhKubh)}(hhh](h)}(hAPI for programming an FPGAh]hAPI for programming an FPGA}(hjdhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjahhhhhKUubj)}(hhh](j)}(h-fpga_region_program_fpga() - Program an FPGAh]h)}(hjwh]h-fpga_region_program_fpga() - Program an FPGA}(hjyhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKWhjuubah}(h]h ]h"]h$]h&]uh1jhjrhhhhhNubj)}(h9fpga_image_info() - Specifies what FPGA image to programh]h)}(hjh]h9fpga_image_info() - Specifies what FPGA image to program}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKXhjubah}(h]h ]h"]h$]h&]uh1jhjrhhhhhNubj)}(h=fpga_image_info_alloc() - Allocate an FPGA image info structh]h)}(hjh]h=fpga_image_info_alloc() - Allocate an FPGA image info struct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKYhjubah}(h]h ]h"]h$]h&]uh1jhjrhhhhhNubj)}(h9fpga_image_info_free() - Free an FPGA image info struct h]h)}(h8fpga_image_info_free() - Free an FPGA image info structh]h8fpga_image_info_free() - Free an FPGA image info struct}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhKZhjubah}(h]h ]h"]h$]h&]uh1jhjrhhhhhNubeh}(h]h ]h"]h$]h&]j j uh1jhhhKWhjahhubhindex)}(hhh]h}(h]h ]h"]h$]h&]entries](single%fpga_region_program_fpga (C function)c.fpga_region_program_fpgahNtauh1jhjahhhNhNubhdesc)}(hhh](hdesc_signature)}(h9int fpga_region_program_fpga (struct fpga_region *region)h]hdesc_signature_line)}(h8int fpga_region_program_fpga(struct fpga_region *region)h](hdesc_sig_keyword_type)}(hinth]hint}(hjhhhNhNubah}(h]h ]ktah"]h$]h&]uh1jhjhhhk/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:92: ./drivers/fpga/fpga-region.chKTubhdesc_sig_space)}(h h]h }(hjhhhNhNubah}(h]h ]wah"]h$]h&]uh1j hjhhhj hKTubh desc_name)}(hfpga_region_program_fpgah]jx)}(hfpga_region_program_fpgah]hfpga_region_program_fpga}(hj#hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubah}(h]h ](sig-namedescnameeh"]h$]h&]jWjXuh1jhjhhhj hKTubhdesc_parameterlist)}(h(struct fpga_region *region)h]hdesc_parameter)}(hstruct fpga_region *regionh](hdesc_sig_keyword)}(hstructh]hstruct}(hjGhhhNhNubah}(h]h ]kah"]h$]h&]uh1jEhjAubj )}(h h]h }(hjVhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjAubh)}(hhh]jx)}(h fpga_regionh]h fpga_region}(hjghhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjdubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetjimodnameN classnameNjj)}j]j ASTIdentifier)}jj%sbc.fpga_region_program_fpgaasbuh1hhjAubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjAubhdesc_sig_punctuation)}(hj h]h*}(hjhhhNhNubah}(h]h ]pah"]h$]h&]uh1jhjAubjx)}(hregionh]hregion}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjAubeh}(h]h ]h"]h$]h&]noemphjWjXuh1j?hj;ubah}(h]h ]h"]h$]h&]jWjXuh1j9hjhhhj hKTubeh}(h]h ]h"]h$]h&]jWjX add_permalinkuh1jsphinx_line_type declaratorhjhhhj hKTubah}(h]jah ](j sig-objecteh"]h$]h&] is_multiline _toc_parts) _toc_namehuh1jhj hKThjhhubh desc_content)}(hhh]h)}(h program FPGAh]h program FPGA}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:92: ./drivers/fpga/fpga-region.chKThjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhj hKTubeh}(h]h ](jfunctioneh"]h$]h&]domainjobjtypejdesctypejnoindex noindexentrynocontentsentryuh1jhhhjahNhNubh container)}(hX**Parameters** ``struct fpga_region *region`` FPGA region **Description** Program an FPGA using fpga image info (region->info). If the region has a get_bridges function, the exclusive reference for the bridges will be held if programming succeeds. This is intended to prevent reprogramming the region until the caller considers it safe to do so. The caller will need to call fpga_bridges_put() before attempting to reprogram the region. **Return** 0 for success or negative error code.h](h)}(h**Parameters**h]hstrong)}(hjh]h Parameters}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:92: ./drivers/fpga/fpga-region.chKXhjubhdefinition_list)}(hhh]hdefinition_list_item)}(h+``struct fpga_region *region`` FPGA region h](hterm)}(h``struct fpga_region *region``h]hliteral)}(hj+h]hstruct fpga_region *region}(hj/hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj)ubah}(h]h ]h"]h$]h&]uh1j'hk/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:92: ./drivers/fpga/fpga-region.chKVhj#ubh definition)}(hhh]h)}(h FPGA regionh]h FPGA region}(hjHhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjBhKVhjEubah}(h]h ]h"]h$]h&]uh1jChj#ubeh}(h]h ]h"]h$]h&]uh1j!hjBhKVhjubah}(h]h ]h"]h$]h&]uh1jhjubh)}(h**Description**h]j)}(hjjh]h Description}(hjlhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjhubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:92: ./drivers/fpga/fpga-region.chKXhjubh)}(hXkProgram an FPGA using fpga image info (region->info). If the region has a get_bridges function, the exclusive reference for the bridges will be held if programming succeeds. This is intended to prevent reprogramming the region until the caller considers it safe to do so. The caller will need to call fpga_bridges_put() before attempting to reprogram the region.h]hXkProgram an FPGA using fpga image info (region->info). If the region has a get_bridges function, the exclusive reference for the bridges will be held if programming succeeds. This is intended to prevent reprogramming the region until the caller considers it safe to do so. The caller will need to call fpga_bridges_put() before attempting to reprogram the region.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:92: ./drivers/fpga/fpga-region.chKWhjubh)}(h **Return**h]j)}(hjh]hReturn}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:92: ./drivers/fpga/fpga-region.chK^hjubh)}(h%0 for success or negative error code.h]h%0 for success or negative error code.}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhk/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:92: ./drivers/fpga/fpga-region.chK_hjubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjahhhNhNubh)}(hFPGA Manager flagsh]hFPGA Manager flags}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhhhK_hjahhubh)}(hJFlags used in the :c:type:`fpga_image_info->flags ` fieldh](hFlags used in the }(hjhhhNhNubh)}(h2:c:type:`fpga_image_info->flags `h]j.)}(hjh]hfpga_image_info->flags}(hjhhhNhNubah}(h]h ](xrefjc-typeeh"]h$]h&]uh1j-hjubah}(h]h ]h"]h$]h&]refdoc driver-api/fpga/fpga-programming refdomainjreftypetype refexplicitrefwarnjj)}j]sb reftargetfpga_image_infouh1hhn/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:97: ./include/linux/fpga/fpga-mgr.hhK=hjubh field}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhjhK=hjahhubh)}(hF``FPGA_MGR_PARTIAL_RECONFIG``: do partial reconfiguration if supportedh](j.)}(h``FPGA_MGR_PARTIAL_RECONFIG``h]hFPGA_MGR_PARTIAL_RECONFIG}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubh): do partial reconfiguration if supported}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhn/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:97: ./include/linux/fpga/fpga-mgr.hhK?hjahhubh)}(hM``FPGA_MGR_EXTERNAL_CONFIG``: FPGA has been configured prior to Linux bootingh](j.)}(h``FPGA_MGR_EXTERNAL_CONFIG``h]hFPGA_MGR_EXTERNAL_CONFIG}(hj$hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubh1: FPGA has been configured prior to Linux booting}(hj hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhn/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:97: ./include/linux/fpga/fpga-mgr.hhKAhjahhubh)}(hB``FPGA_MGR_ENCRYPTED_BITSTREAM``: indicates bitstream is encryptedh](j.)}(h ``FPGA_MGR_ENCRYPTED_BITSTREAM``h]hFPGA_MGR_ENCRYPTED_BITSTREAM}(hjAhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj=ubh": indicates bitstream is encrypted}(hj=hhhNhNubeh}(h]h ]h"]h$]h&]uh1hhn/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:97: ./include/linux/fpga/fpga-mgr.hhKChjahhubh)}(hF``FPGA_MGR_BITSTREAM_LSB_FIRST``: SPI bitstream bit order is LSB firsth](j.)}(h ``FPGA_MGR_BITSTREAM_LSB_FIRST``h]hFPGA_MGR_BITSTREAM_LSB_FIRST}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjZubh&: SPI bitstream bit order is LSB first}(hjZhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhn/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:97: ./include/linux/fpga/fpga-mgr.hhKEhjahhubh)}(h?``FPGA_MGR_COMPRESSED_BITSTREAM``: FPGA bitstream is compressedh](j.)}(h!``FPGA_MGR_COMPRESSED_BITSTREAM``h]hFPGA_MGR_COMPRESSED_BITSTREAM}(hj{hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjwubh: FPGA bitstream is compressed}(hjwhhhNhNubeh}(h]h ]h"]h$]h&]uh1hhn/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:97: ./include/linux/fpga/fpga-mgr.hhKGhjahhubj)}(hhh]h}(h]h ]h"]h$]h&]entries](jfpga_image_info (C struct)c.fpga_image_infohNtauh1jhjahhhNhNubj)}(hhh](j)}(hfpga_image_infoh]j)}(hstruct fpga_image_infoh](jF)}(hjIh]hstruct}(hjhhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjhhho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKubj )}(h h]h }(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjhhhjhKubj)}(hfpga_image_infoh]jx)}(hjh]hfpga_image_info}(hjhhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjubah}(h]h ](j4j5eh"]h$]h&]jWjXuh1jhjhhhjhKubeh}(h]h ]h"]h$]h&]jWjXjuh1jjjhjhhhjhKubah}(h]jah ](jjeh"]h$]h&]jj)jhuh1jhjhKhjhhubj)}(hhh]h)}(h%information specific to an FPGA imageh]h%information specific to an FPGA image}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKRhjhhubah}(h]h ]h"]h$]h&]uh1jhjhhhjhKubeh}(h]h ](jstructeh"]h$]h&]jjjjjjjjjuh1jhhhjahNhNubj)}(hX**Definition**:: struct fpga_image_info { u32 flags; u32 enable_timeout_us; u32 disable_timeout_us; u32 config_complete_timeout_us; char *firmware_name; struct sg_table *sgt; const char *buf; size_t count; size_t header_size; size_t data_size; int region_id; struct device *dev; #ifdef CONFIG_OF; struct device_node *overlay; #endif; }; **Members** ``flags`` boolean flags as defined above ``enable_timeout_us`` maximum time to enable traffic through bridge (uSec) ``disable_timeout_us`` maximum time to disable traffic through bridge (uSec) ``config_complete_timeout_us`` maximum time for FPGA to switch to operating status in the write_complete op. ``firmware_name`` name of FPGA image firmware file ``sgt`` scatter/gather table containing FPGA image ``buf`` contiguous buffer containing FPGA image ``count`` size of buf ``header_size`` size of image header. ``data_size`` size of image data to be sent to the device. If not specified, whole image will be used. Header may be skipped in either case. ``region_id`` id of target region ``dev`` device that owns this ``overlay`` Device Tree overlayh](h)}(h**Definition**::h](j)}(h**Definition**h]h Definition}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1jhjubh:}(hjhhhNhNubeh}(h]h ]h"]h$]h&]uh1hho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKVhj ubjH)}(hXsstruct fpga_image_info { u32 flags; u32 enable_timeout_us; u32 disable_timeout_us; u32 config_complete_timeout_us; char *firmware_name; struct sg_table *sgt; const char *buf; size_t count; size_t header_size; size_t data_size; int region_id; struct device *dev; #ifdef CONFIG_OF; struct device_node *overlay; #endif; };h]hXsstruct fpga_image_info { u32 flags; u32 enable_timeout_us; u32 disable_timeout_us; u32 config_complete_timeout_us; char *firmware_name; struct sg_table *sgt; const char *buf; size_t count; size_t header_size; size_t data_size; int region_id; struct device *dev; #ifdef CONFIG_OF; struct device_node *overlay; #endif; };}hj,sbah}(h]h ]h"]h$]h&]jWjXuh1jGho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKXhj ubh)}(h **Members**h]j)}(hj=h]hMembers}(hj?hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj;ubah}(h]h ]h"]h$]h&]uh1hho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKjhj ubj)}(hhh](j")}(h)``flags`` boolean flags as defined above h](j()}(h ``flags``h]j.)}(hj\h]hflags}(hj^hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjZubah}(h]h ]h"]h$]h&]uh1j'ho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKThjVubjD)}(hhh]h)}(hboolean flags as defined aboveh]hboolean flags as defined above}(hjuhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjqhKThjrubah}(h]h ]h"]h$]h&]uh1jChjVubeh}(h]h ]h"]h$]h&]uh1j!hjqhKThjSubj")}(hK``enable_timeout_us`` maximum time to enable traffic through bridge (uSec) h](j()}(h``enable_timeout_us``h]j.)}(hjh]henable_timeout_us}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubah}(h]h ]h"]h$]h&]uh1j'ho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKUhjubjD)}(hhh]h)}(h4maximum time to enable traffic through bridge (uSec)h]h4maximum time to enable traffic through bridge (uSec)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKUhjubah}(h]h ]h"]h$]h&]uh1jChjubeh}(h]h ]h"]h$]h&]uh1j!hjhKUhjSubj")}(hM``disable_timeout_us`` maximum time to disable traffic through bridge (uSec) h](j()}(h``disable_timeout_us``h]j.)}(hjh]hdisable_timeout_us}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubah}(h]h ]h"]h$]h&]uh1j'ho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKVhjubjD)}(hhh]h)}(h5maximum time to disable traffic through bridge (uSec)h]h5maximum time to disable traffic through bridge (uSec)}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKVhjubah}(h]h ]h"]h$]h&]uh1jChjubeh}(h]h ]h"]h$]h&]uh1j!hjhKVhjSubj")}(hm``config_complete_timeout_us`` maximum time for FPGA to switch to operating status in the write_complete op. h](j()}(h``config_complete_timeout_us``h]j.)}(hjh]hconfig_complete_timeout_us}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubah}(h]h ]h"]h$]h&]uh1j'ho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKXhjubjD)}(hhh]h)}(hMmaximum time for FPGA to switch to operating status in the write_complete op.h]hMmaximum time for FPGA to switch to operating status in the write_complete op.}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKWhjubah}(h]h ]h"]h$]h&]uh1jChjubeh}(h]h ]h"]h$]h&]uh1j!hjhKXhjSubj")}(h3``firmware_name`` name of FPGA image firmware file h](j()}(h``firmware_name``h]j.)}(hjAh]h firmware_name}(hjChhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj?ubah}(h]h ]h"]h$]h&]uh1j'ho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKYhj;ubjD)}(hhh]h)}(h name of FPGA image firmware fileh]h name of FPGA image firmware file}(hjZhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjVhKYhjWubah}(h]h ]h"]h$]h&]uh1jChj;ubeh}(h]h ]h"]h$]h&]uh1j!hjVhKYhjSubj")}(h3``sgt`` scatter/gather table containing FPGA image h](j()}(h``sgt``h]j.)}(hjzh]hsgt}(hj|hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjxubah}(h]h ]h"]h$]h&]uh1j'ho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKZhjtubjD)}(hhh]h)}(h*scatter/gather table containing FPGA imageh]h*scatter/gather table containing FPGA image}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKZhjubah}(h]h ]h"]h$]h&]uh1jChjtubeh}(h]h ]h"]h$]h&]uh1j!hjhKZhjSubj")}(h0``buf`` contiguous buffer containing FPGA image h](j()}(h``buf``h]j.)}(hjh]hbuf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubah}(h]h ]h"]h$]h&]uh1j'ho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhK[hjubjD)}(hhh]h)}(h'contiguous buffer containing FPGA imageh]h'contiguous buffer containing FPGA image}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK[hjubah}(h]h ]h"]h$]h&]uh1jChjubeh}(h]h ]h"]h$]h&]uh1j!hjhK[hjSubj")}(h``count`` size of buf h](j()}(h ``count``h]j.)}(hjh]hcount}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubah}(h]h ]h"]h$]h&]uh1j'ho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhK\hjubjD)}(hhh]h)}(h size of bufh]h size of buf}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK\hjubah}(h]h ]h"]h$]h&]uh1jChjubeh}(h]h ]h"]h$]h&]uh1j!hjhK\hjSubj")}(h&``header_size`` size of image header. h](j()}(h``header_size``h]j.)}(hj%h]h header_size}(hj'hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj#ubah}(h]h ]h"]h$]h&]uh1j'ho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhK]hjubjD)}(hhh]h)}(hsize of image header.h]hsize of image header.}(hj>hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj:hK]hj;ubah}(h]h ]h"]h$]h&]uh1jChjubeh}(h]h ]h"]h$]h&]uh1j!hj:hK]hjSubj")}(h``data_size`` size of image data to be sent to the device. If not specified, whole image will be used. Header may be skipped in either case. h](j()}(h ``data_size``h]j.)}(hj^h]h data_size}(hj`hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj\ubah}(h]h ]h"]h$]h&]uh1j'ho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhK_hjXubjD)}(hhh]h)}(h~size of image data to be sent to the device. If not specified, whole image will be used. Header may be skipped in either case.h]h~size of image data to be sent to the device. If not specified, whole image will be used. Header may be skipped in either case.}(hjwhhhNhNubah}(h]h ]h"]h$]h&]uh1hho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhK^hjtubah}(h]h ]h"]h$]h&]uh1jChjXubeh}(h]h ]h"]h$]h&]uh1j!hjshK_hjSubj")}(h"``region_id`` id of target region h](j()}(h ``region_id``h]j.)}(hjh]h region_id}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubah}(h]h ]h"]h$]h&]uh1j'ho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhK`hjubjD)}(hhh]h)}(hid of target regionh]hid of target region}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhK`hjubah}(h]h ]h"]h$]h&]uh1jChjubeh}(h]h ]h"]h$]h&]uh1j!hjhK`hjSubj")}(h``dev`` device that owns this h](j()}(h``dev``h]j.)}(hjh]hdev}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1j-hjubah}(h]h ]h"]h$]h&]uh1j'ho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKahjubjD)}(hhh]h)}(hdevice that owns thish]hdevice that owns this}(hjhhhNhNubah}(h]h ]h"]h$]h&]uh1hhjhKahjubah}(h]h ]h"]h$]h&]uh1jChjubeh}(h]h ]h"]h$]h&]uh1j!hjhKahjSubj")}(h``overlay`` Device Tree overlayh](j()}(h ``overlay``h]j.)}(hj h]hoverlay}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubah}(h]h ]h"]h$]h&]uh1j'ho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKahj ubjD)}(hhh]h)}(hDevice Tree overlayh]hDevice Tree overlay}(hj# hhhNhNubah}(h]h ]h"]h$]h&]uh1hho/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:100: ./include/linux/fpga/fpga-mgr.hhKbhj ubah}(h]h ]h"]h$]h&]uh1jChj ubeh}(h]h ]h"]h$]h&]uh1j!hj hKahjSubeh}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjahhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j"fpga_image_info_alloc (C function)c.fpga_image_info_allochNtauh1jhjahhhNhNubj)}(hhh](j)}(hCstruct fpga_image_info * fpga_image_info_alloc (struct device *dev)h]j)}(hAstruct fpga_image_info *fpga_image_info_alloc(struct device *dev)h](jF)}(hjIh]hstruct}(hjd hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj` hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:103: ./drivers/fpga/fpga-mgr.chKhubj )}(h h]h }(hjr hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj` hhhjq hKhubh)}(hhh]jx)}(hfpga_image_infoh]hfpga_image_info}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j)}jfpga_image_info_allocsbc.fpga_image_info_allocasbuh1hhj` hhhjq hKhubj )}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj` hhhjq hKhubj)}(hj h]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj` hhhjq hKhubj)}(hfpga_image_info_alloch]jx)}(hj h]hfpga_image_info_alloc}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj ubah}(h]h ](j4j5eh"]h$]h&]jWjXuh1jhj` hhhjq hKhubj:)}(h(struct device *dev)h]j@)}(hstruct device *devh](jF)}(hjIh]hstruct}(hj hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhj ubj )}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubh)}(hhh]jx)}(hdeviceh]hdevice}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj modnameN classnameNjj)}j]j c.fpga_image_info_allocasbuh1hhj ubj )}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj ubj)}(hj h]h*}(hj( hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj ubjx)}(hdevh]hdev}(hj5 hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj ubeh}(h]h ]h"]h$]h&]noemphjWjXuh1j?hj ubah}(h]h ]h"]h$]h&]jWjXuh1j9hj` hhhjq hKhubeh}(h]h ]h"]h$]h&]jWjXjuh1jjjhj\ hhhjq hKhubah}(h]jW ah ](jjeh"]h$]h&]jj)jhuh1jhjq hKhhjY hhubj)}(hhh]h)}(h"Allocate an FPGA image info structh]h"Allocate an FPGA image info struct}(hj_ hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:103: ./drivers/fpga/fpga-mgr.chKhhj\ hhubah}(h]h ]h"]h$]h&]uh1jhjY hhhjq hKhubeh}(h]h ](jfunctioneh"]h$]h&]jjjjw jjw jjjuh1jhhhjahNhNubj)}(hb**Parameters** ``struct device *dev`` owning device **Return** struct fpga_image_info or NULLh](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:103: ./drivers/fpga/fpga-mgr.chKlhj{ ubj)}(hhh]j")}(h%``struct device *dev`` owning device h](j()}(h``struct device *dev``h]j.)}(hj h]hstruct device *dev}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubah}(h]h ]h"]h$]h&]uh1j'hi/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:103: ./drivers/fpga/fpga-mgr.chKihj ubjD)}(hhh]h)}(h owning deviceh]h owning device}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhj hKihj ubah}(h]h ]h"]h$]h&]uh1jChj ubeh}(h]h ]h"]h$]h&]uh1j!hj hKihj ubah}(h]h ]h"]h$]h&]uh1jhj{ ubh)}(h **Return**h]j)}(hj h]hReturn}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:103: ./drivers/fpga/fpga-mgr.chKkhj{ ubh)}(hstruct fpga_image_info or NULLh]hstruct fpga_image_info or NULL}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:103: ./drivers/fpga/fpga-mgr.chKkhj{ ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjahhhNhNubj)}(hhh]h}(h]h ]h"]h$]h&]entries](j!fpga_image_info_free (C function)c.fpga_image_info_freehNtauh1jhjahhhNhNubj)}(hhh](j)}(h8void fpga_image_info_free (struct fpga_image_info *info)h]j)}(h7void fpga_image_info_free(struct fpga_image_info *info)h](j)}(hvoidh]hvoid}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhj hhhi/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:106: ./drivers/fpga/fpga-mgr.chKubj )}(h h]h }(hj/ hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hj hhhj. hKubj)}(hfpga_image_info_freeh]jx)}(hfpga_image_info_freeh]hfpga_image_info_free}(hjA hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhj= ubah}(h]h ](j4j5eh"]h$]h&]jWjXuh1jhj hhhj. hKubj:)}(h(struct fpga_image_info *info)h]j@)}(hstruct fpga_image_info *infoh](jF)}(hjIh]hstruct}(hj] hhhNhNubah}(h]h ]jRah"]h$]h&]uh1jEhjY ubj )}(h h]h }(hjj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjY ubh)}(hhh]jx)}(hfpga_image_infoh]hfpga_image_info}(hj{ hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjx ubah}(h]h ]h"]h$]h&] refdomainjreftypej reftargetj} modnameN classnameNjj)}j]j)}jjC sbc.fpga_image_info_freeasbuh1hhjY ubj )}(h h]h }(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1j hjY ubj)}(hj h]h*}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jhjY ubjx)}(hinfoh]hinfo}(hj hhhNhNubah}(h]h ]jah"]h$]h&]uh1jwhjY ubeh}(h]h ]h"]h$]h&]noemphjWjXuh1j?hjU ubah}(h]h ]h"]h$]h&]jWjXuh1j9hj hhhj. hKubeh}(h]h ]h"]h$]h&]jWjXjuh1jjjhj hhhj. hKubah}(h]j ah ](jjeh"]h$]h&]jj)jhuh1jhj. hKhj hhubj)}(hhh]h)}(hFree an FPGA image info structh]hFree an FPGA image info struct}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:106: ./drivers/fpga/fpga-mgr.chKhj hhubah}(h]h ]h"]h$]h&]uh1jhj hhhj. hKubeh}(h]h ](jfunctioneh"]h$]h&]jjjj jj jjjuh1jhhhjahNhNubj)}(hQ**Parameters** ``struct fpga_image_info *info`` FPGA image info struct to freeh](h)}(h**Parameters**h]j)}(hj h]h Parameters}(hj hhhNhNubah}(h]h ]h"]h$]h&]uh1jhj ubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:106: ./drivers/fpga/fpga-mgr.chKhj ubj)}(hhh]j")}(h?``struct fpga_image_info *info`` FPGA image info struct to freeh](j()}(h ``struct fpga_image_info *info``h]j.)}(hj! h]hstruct fpga_image_info *info}(hj# hhhNhNubah}(h]h ]h"]h$]h&]uh1j-hj ubah}(h]h ]h"]h$]h&]uh1j'hi/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:106: ./drivers/fpga/fpga-mgr.chKhj ubjD)}(hhh]h)}(hFPGA image info struct to freeh]hFPGA image info struct to free}(hj: hhhNhNubah}(h]h ]h"]h$]h&]uh1hhi/var/lib/git/docbuild/linux/Documentation/driver-api/fpga/fpga-programming:106: ./drivers/fpga/fpga-mgr.chKhj7 ubah}(h]h ]h"]h$]h&]uh1jChj ubeh}(h]h ]h"]h$]h&]uh1j!hj6 hKhj ubah}(h]h ]h"]h$]h&]uh1jhj ubeh}(h]h ] kernelindentah"]h$]h&]uh1jhjahhhNhNubeh}(h]api-for-programming-an-fpgaah ]h"]api for programming an fpgaah$]h&]uh1hhhhhhhhKUubeh}(h]"in-kernel-api-for-fpga-programmingah ]h"]"in-kernel api for fpga programmingah$]h&]uh1hhhhhhhhKubeh}(h]h ]h"]h$]h&]sourcehuh1hcurrent_sourceN current_lineNsettingsdocutils.frontendValues)}(hN generatorN datestampN source_linkN source_urlN toc_backlinksentryfootnote_backlinksK sectnum_xformKstrip_commentsNstrip_elements_with_classesN strip_classesN report_levelK halt_levelKexit_status_levelKdebugNwarning_streamN tracebackinput_encoding utf-8-siginput_encoding_error_handlerstrictoutput_encodingutf-8output_encoding_error_handlerj error_encodingutf-8error_encoding_error_handlerbackslashreplace language_codeenrecord_dependenciesNconfigN id_prefixhauto_id_prefixid dump_settingsNdump_internalsNdump_transformsNdump_pseudo_xmlNexpose_internalsNstrict_visitorN_disable_configN_sourcehʌ _destinationN _config_files]7/var/lib/git/docbuild/linux/Documentation/docutils.confafile_insertion_enabled raw_enabledKline_length_limitM'pep_referencesN pep_base_urlhttps://peps.python.org/pep_file_url_templatepep-%04drfc_referencesN rfc_base_url&https://datatracker.ietf.org/doc/html/ tab_widthKtrim_footnote_reference_spacesyntax_highlightlong smart_quotessmartquotes_locales]character_level_inline_markupdoctitle_xform docinfo_xformKsectsubtitle_xform image_loadinglinkembed_stylesheetcloak_email_addressessection_self_linkenvNubreporterNindirect_targets]substitution_defs}substitution_names}refnames}refids}nameids}(jo jl j%j"j^j[jg jd u nametypes}(jo j%j^jg uh}(jl hj"hj[j(jd jajjjjjW j\ j j u footnote_refs} citation_refs} autofootnotes]autofootnote_refs]symbol_footnotes]symbol_footnote_refs] footnotes] citations]autofootnote_startKsymbol_footnote_startK id_counter collectionsCounter}Rparse_messages]transform_messages] transformerN include_log] decorationNhhub.