/* * Copyright © 2022 Imagination Technologies Ltd. * * Permission is hereby granted, free of charge, to any person obtaining a copy * of this software and associated documentation files (the "Software"), to deal * in the Software without restriction, including without limitation the rights * to use, copy, modify, merge, publish, distribute, sublicense, and/or sell * copies of the Software, and to permit persons to whom the Software is * furnished to do so, subject to the following conditions: * * The above copyright notice and this permission notice (including the next * paragraph) shall be included in all copies or substantial portions of the * Software. * * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE * SOFTWARE. */ #ifndef PVR_DEVICE_INFO_H #define PVR_DEVICE_INFO_H /* TODO: This file is currently hand-maintained. However, the intention is to * auto-generate it in the future based on the hwdefs. */ #include #include #include #include #include "util/log.h" #include "util/macros.h" #define PVR_BVNC_PACK_SHIFT_B 48 #define PVR_BVNC_PACK_SHIFT_V 32 #define PVR_BVNC_PACK_SHIFT_N 16 #define PVR_BVNC_PACK_SHIFT_C 0 #define PVR_BVNC_PACK_MASK_B UINT64_C(0xFFFF000000000000) #define PVR_BVNC_PACK_MASK_V UINT64_C(0x0000FFFF00000000) #define PVR_BVNC_PACK_MASK_N UINT64_C(0x00000000FFFF0000) #define PVR_BVNC_PACK_MASK_C UINT64_C(0x000000000000FFFF) /** * Packs B, V, N and C values into a 64-bit unsigned integer. * * The packed layout is as follows: * * \verbatim * +--------+--------+--------+-------+ * | 63..48 | 47..32 | 31..16 | 15..0 | * +========+========+========+=======+ * | B | V | N | C | * +--------+--------+--------+-------+ * \endverbatim * * #pvr_get_packed_bvnc() should be used instead of this macro when a * #pvr_device_information is available in order to ensure proper type checking. * * \param b Branch ID. * \param v Version ID. * \param n Number of scalable units. * \param c Config ID. * \return Packed BVNC. * * \sa #pvr_get_packed_bvnc(), #PVR_BVNC_UNPACK_B(), #PVR_BVNC_UNPACK_V(), * #PVR_BVNC_UNPACK_N() and #PVR_BVNC_UNPACK_C() */ #define PVR_BVNC_PACK(b, v, n, c) \ ((((uint64_t)(b) << PVR_BVNC_PACK_SHIFT_B) & PVR_BVNC_PACK_MASK_B) | \ (((uint64_t)(v) << PVR_BVNC_PACK_SHIFT_V) & PVR_BVNC_PACK_MASK_V) | \ (((uint64_t)(n) << PVR_BVNC_PACK_SHIFT_N) & PVR_BVNC_PACK_MASK_N) | \ (((uint64_t)(c) << PVR_BVNC_PACK_SHIFT_C) & PVR_BVNC_PACK_MASK_C)) /** * Unpacks B value (branch ID) from packed BVNC. * * \param bvnc Packed BVNC. * \return Branch ID. * * \sa #PVR_BVNC_UNPACK_V(), #PVR_BVNC_UNPACK_N(), #PVR_BVNC_UNPACK_C(), * #pvr_get_packed_bvnc() and #PVR_BVNC_PACK() */ #define PVR_BVNC_UNPACK_B(bvnc) \ ((uint16_t)(((bvnc)&PVR_BVNC_PACK_MASK_B) >> PVR_BVNC_PACK_SHIFT_B)) /** * Unpacks V value (version ID) from packed BVNC. * * \param bvnc Packed BVNC. * \return Version ID. * * \sa #PVR_BVNC_UNPACK_B(), #PVR_BVNC_UNPACK_N(), #PVR_BVNC_UNPACK_C(), * #pvr_get_packed_bvnc() and #PVR_BVNC_PACK() */ #define PVR_BVNC_UNPACK_V(bvnc) \ ((uint16_t)(((bvnc)&PVR_BVNC_PACK_MASK_V) >> PVR_BVNC_PACK_SHIFT_V)) /** * Unpacks N value (number of scalable units) from packed BVNC. * * \param bvnc Packed BVNC. * \return Number of scalable units. * * \sa #PVR_BVNC_UNPACK_B(), #PVR_BVNC_UNPACK_V(), #PVR_BVNC_UNPACK_C(), * #pvr_get_packed_bvnc() and #PVR_BVNC_PACK() */ #define PVR_BVNC_UNPACK_N(bvnc) \ ((uint16_t)(((bvnc)&PVR_BVNC_PACK_MASK_N) >> PVR_BVNC_PACK_SHIFT_N)) /** * Unpacks C value (config ID) from packed BVNC. * * \param bvnc Packed BVNC. * \return Config ID. * * \sa #PVR_BVNC_UNPACK_B(), #PVR_BVNC_UNPACK_V(), #PVR_BVNC_UNPACK_N(), * #pvr_get_packed_bvnc() and #PVR_BVNC_PACK() */ #define PVR_BVNC_UNPACK_C(bvnc) \ ((uint16_t)(((bvnc)&PVR_BVNC_PACK_MASK_C) >> PVR_BVNC_PACK_SHIFT_C)) /** * Tests whether a physical device has a given feature. * * Feature names are derived from those found in #pvr_device_features by * dropping the 'has_' prefix, which is applied by this macro. * * \param dev_info #pvr_device_info object associated with the target physical * device. * \param feature Device feature name. * * \return * * true if the named feature is present in the hardware. * * false if the named feature is not present in the hardware. * * \sa #PVR_FEATURE_VALUE() and #PVR_GET_FEATURE_VALUE() */ #define PVR_HAS_FEATURE(dev_info, feature) ((dev_info)->features.has_##feature) /** * Gets a physical device feature value if feature is supported. * * Feature names are derived from those found in #pvr_device_features by * dropping the 'has_' prefix. * * This macro should be used in preference to #PVR_GET_FEATURE_VALUE() as it has * proper error handling. * * \param dev_info #pvr_device_info object associated with the target physical * device. * \param feature Feature name. * \param value_out Feature value. * * \return * * 0 on success, or * * -%EINVAL if the named feature is not present in the hardware. * * \sa #PVR_HAS_FEATURE() and #PVR_GET_FEATURE_VALUE() */ #define PVR_FEATURE_VALUE(dev_info, feature, value_out) \ ({ \ const struct pvr_device_info *__dev_info = dev_info; \ int __ret = -EINVAL; \ if (__dev_info->features.has_##feature) { \ *(value_out) = __dev_info->features.feature; \ __ret = 0; \ } \ __ret; \ }) /** * Gets a physical device feature value if supported, but otherwise returns a * default value. * * Feature names are derived from those found in #pvr_device_features by * dropping the 'has_' prefix. * * #PVR_FEATURE_VALUE() should be used in preference to this macro when errors * can be returned by the caller. This macro is intended for cases where errors * can't be returned. * * \param dev_info #pvr_device_info object associated with the target * physical device. * \param feature Feature name. * \param default_value Default feature value. * * \return Feature value. * * \sa #PVR_HAS_FEATURE() and #PVR_FEATURE_VALUE() */ #define PVR_GET_FEATURE_VALUE(dev_info, feature, default_value) \ ({ \ const struct pvr_device_info *__dev_info = dev_info; \ __typeof__(default_value) __ret = default_value; \ if (__dev_info->features.has_##feature) { \ __ret = __dev_info->features.feature; \ } else { \ mesa_logw("Missing " #feature \ " feature (defaulting to: " #default_value ")"); \ assert(0); \ } \ __ret; \ }) /** * Tests whether a physical device has a given enhancement. * * Enhancement numbers are derived from those found in #pvr_device_enhancements * by dropping the 'has_ern' prefix, which is applied by this macro. * * \param dev_info #pvr_device_info object associated with the target physical * device. * \param number Enhancement number. * * \return * * true if the enhancement is present in the hardware. * * false if the enhancement is not present in the hardware. */ #define PVR_HAS_ERN(dev_info, number) ((dev_info)->enhancements.has_ern##number) /** * Tests whether a physical device has a given quirk. * * Quirk numbers are derived from those found in #pvr_device_quirks by * dropping the 'has_brn' prefix, which is applied by this macro. * * \param dev_info #pvr_device_info object associated with the target physical * device. * \param number Quirk number. * * \return * * true if the quirk is present in the hardware. * * false if the quirk is not present in the hardware. */ #define PVR_HAS_QUIRK(dev_info, number) ((dev_info)->quirks.has_brn##number) struct pvr_device_ident { uint16_t b, v, n, c; uint32_t device_id; const char *series_name; const char *public_name; }; struct pvr_device_features { bool has_astc : 1; bool has_cluster_grouping : 1; bool has_common_store_size_in_dwords : 1; bool has_compute : 1; bool has_compute_morton_capable : 1; bool has_compute_overlap : 1; bool has_eight_output_registers : 1; bool has_gpu_multicore_support : 1; bool has_gs_rta_support : 1; bool has_isp_max_tiles_in_flight : 1; bool has_isp_samples_per_pixel : 1; bool has_max_instances_per_pds_task : 1; bool has_max_multisample : 1; bool has_max_partitions : 1; bool has_max_usc_tasks : 1; bool has_num_clusters : 1; bool has_num_raster_pipes : 1; bool has_num_user_clip_planes : 1; bool has_paired_tiles : 1; bool has_pds_ddmadt : 1; bool has_robust_buffer_access : 1; bool has_roguexe : 1; bool has_screen_size8K : 1; bool has_simple_internal_parameter_format : 1; bool has_simple_internal_parameter_format_v2 : 1; bool has_simple_parameter_format_version : 1; bool has_slc_cache_line_size_bits : 1; bool has_slc_mcu_cache_controls : 1; bool has_tf_bicubic_filter : 1; bool has_tile_size_16x16 : 1; bool has_tile_size_x : 1; bool has_tile_size_y : 1; bool has_tpu_array_textures : 1; bool has_tpu_extended_integer_lookup : 1; bool has_tpu_image_state_v2 : 1; bool has_usc_f16sop_u8 : 1; bool has_usc_min_output_registers_per_pix : 1; bool has_usc_pixel_partition_mask : 1; bool has_usc_slots : 1; bool has_uvs_banks : 1; bool has_uvs_pba_entries : 1; bool has_uvs_vtx_entries : 1; bool has_vdm_cam_size : 1; bool has_vdm_degenerate_culling : 1; bool has_xpu_max_slaves : 1; bool has_xt_top_infrastructure : 1; bool has_zls_subtile : 1; uint32_t common_store_size_in_dwords; uint32_t isp_max_tiles_in_flight; uint32_t isp_samples_per_pixel; uint32_t max_instances_per_pds_task; uint32_t max_multisample; uint32_t max_partitions; uint32_t max_usc_tasks; uint32_t num_clusters; uint32_t num_raster_pipes; uint32_t num_user_clip_planes; uint32_t simple_parameter_format_version; uint32_t slc_cache_line_size_bits; uint32_t tile_size_x; uint32_t tile_size_y; uint32_t usc_min_output_registers_per_pix; uint32_t usc_slots; uint32_t uvs_banks; uint32_t uvs_pba_entries; uint32_t uvs_vtx_entries; uint32_t vdm_cam_size; uint32_t xpu_max_slaves; /* Derived features. */ bool has_s8xe : 1; }; struct pvr_device_enhancements { bool has_ern35421 : 1; bool has_ern38020 : 1; bool has_ern38748 : 1; bool has_ern42307 : 1; bool has_ern45493 : 1; }; struct pvr_device_quirks { bool has_brn44079 : 1; bool has_brn47727 : 1; bool has_brn48492 : 1; bool has_brn48545 : 1; bool has_brn49032 : 1; bool has_brn49927 : 1; bool has_brn51025 : 1; bool has_brn51210 : 1; bool has_brn51764 : 1; bool has_brn52354 : 1; bool has_brn52942 : 1; bool has_brn56279 : 1; bool has_brn58839 : 1; bool has_brn62269 : 1; bool has_brn66011 : 1; bool has_brn70165 : 1; }; struct pvr_device_info { struct pvr_device_ident ident; struct pvr_device_features features; struct pvr_device_enhancements enhancements; struct pvr_device_quirks quirks; }; struct pvr_device_runtime_info { uint64_t min_free_list_size; uint64_t reserved_shared_size; uint64_t total_reserved_partition_size; uint64_t num_phantoms; uint64_t max_coeffs; uint64_t cdm_max_local_mem_size_regs; uint32_t core_count; }; /** * Packs B, V, N and C values into a 64-bit unsigned integer. * * The packed layout is as follows: * * \verbatim * +--------+--------+--------+-------+ * | 63..48 | 47..32 | 31..16 | 15..0 | * +========+========+========+=======+ * | B | V | N | C | * +--------+--------+--------+-------+ * \endverbatim * * This should be used in preference to #PVR_BVNC_PACK() when a * #pvr_device_info is available in order to ensure proper type checking. * * \param dev_info Device information. * \return Packed BVNC. */ static ALWAYS_INLINE uint64_t pvr_get_packed_bvnc(const struct pvr_device_info *dev_info) { return PVR_BVNC_PACK(dev_info->ident.b, dev_info->ident.v, dev_info->ident.n, dev_info->ident.c); } int pvr_device_info_init(struct pvr_device_info *info, uint64_t bvnc); #endif /* PVR_DEVICE_INFO_H */