[PATCH 2/3] SWDEV-220451 - Query guest's information by VF2PF message - Guest side - part 2
Alex Deucher
alexdeucher at gmail.com
Wed Sep 16 21:07:01 UTC 2020
On Wed, Sep 16, 2020 at 11:05 AM Bokun Zhang <Bokun.Zhang at amd.com> wrote:
>
> - Add VF2PF message support
> - Remove incorrect Macro to avoid compile error
> - Remove duplicated struct and use amdgv_sriovmsg.h
>
> Change-Id: I8175d304871f4b5aab75fd071a6bdf8008137dbe
> Signed-off-by: Bokun Zhang <Bokun.Zhang at amd.com>
Please drop the SWDEV reference from the subject and prefix the patch
with drm/amdgpu: Also please provide a better patch subject and
description. It looks like this patch is doing multiple things and
it's hard to understand them all.
Alex
> ---
> drivers/gpu/drm/amd/amdgpu/amdgpu_device.c | 4 +-
> drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c | 244 ++++++++++++++++-----
> drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h | 75 +------
> 3 files changed, 198 insertions(+), 125 deletions(-)
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> index 5d702f6e77de..483ec0136332 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_device.c
> @@ -3443,8 +3443,10 @@ void amdgpu_device_fini(struct amdgpu_device *adev)
> /* make sure IB test finished before entering exclusive mode
> * to avoid preemption on IB test
> * */
> - if (amdgpu_sriov_vf(adev))
> + if (amdgpu_sriov_vf(adev)) {
> amdgpu_virt_request_full_gpu(adev, false);
> + amdgpu_virt_fini_data_exchange(adev);
> + }
>
> /* disable all interrupts */
> amdgpu_irq_disable_all(adev);
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
> index f76961d17246..1f1171812e35 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.c
> @@ -31,6 +31,12 @@
> #include "soc15.h"
> #include "nv.h"
>
> +#define POPULATE_UCODE_INFO(vf2pf_info, ucode, ver) \
> + do { \
> + vf2pf_info->ucode_info[ucode].id = ucode; \
> + vf2pf_info->ucode_info[ucode].version = ver; \
> + } while (0)
> +
> bool amdgpu_virt_mmio_blocked(struct amdgpu_device *adev)
> {
> /* By now all MMIO pages except mailbox are blocked */
> @@ -239,10 +245,10 @@ void amdgpu_virt_free_mm_table(struct amdgpu_device *adev)
> }
>
>
> -int amdgpu_virt_fw_reserve_get_checksum(void *obj,
> - unsigned long obj_size,
> - unsigned int key,
> - unsigned int chksum)
> +unsigned int amd_sriov_msg_checksum(void *obj,
> + unsigned long obj_size,
> + unsigned int key,
> + unsigned int checksum)
> {
> unsigned int ret = key;
> unsigned long i = 0;
> @@ -252,9 +258,9 @@ int amdgpu_virt_fw_reserve_get_checksum(void *obj,
> /* calculate checksum */
> for (i = 0; i < obj_size; ++i)
> ret += *(pos + i);
> - /* minus the chksum itself */
> - pos = (char *)&chksum;
> - for (i = 0; i < sizeof(chksum); ++i)
> + /* minus the checksum itself */
> + pos = (char *)&checksum;
> + for (i = 0; i < sizeof(checksum); ++i)
> ret -= *(pos + i);
> return ret;
> }
> @@ -415,33 +421,187 @@ static void amdgpu_virt_add_bad_page(struct amdgpu_device *adev,
> }
> }
>
> -void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev)
> +static int amdgpu_virt_read_pf2vf_data(struct amdgpu_device *adev)
> {
> - uint32_t pf2vf_size = 0;
> - uint32_t checksum = 0;
> + struct amd_sriov_msg_pf2vf_info_header *pf2vf_info = adev->virt.fw_reserve.p_pf2vf;
> + uint32_t checksum;
> uint32_t checkval;
> - char *str;
> +
> + if (adev->virt.fw_reserve.p_pf2vf == NULL)
> + return -EINVAL;
> +
> + if (pf2vf_info->size > 1024) {
> + DRM_ERROR("invalid pf2vf message size\n");
> + return -EINVAL;
> + }
> +
> + switch (pf2vf_info->version) {
> + case 1:
> + checksum = ((struct amdgim_pf2vf_info_v1 *)pf2vf_info)->checksum;
> + checkval = amd_sriov_msg_checksum(
> + adev->virt.fw_reserve.p_pf2vf, pf2vf_info->size,
> + adev->virt.fw_reserve.checksum_key, checksum);
> + if (checksum != checkval) {
> + DRM_ERROR("invalid pf2vf message\n");
> + return -EINVAL;
> + }
> +
> + adev->virt.gim_feature =
> + ((struct amdgim_pf2vf_info_v1 *)pf2vf_info)->feature_flags;
> + break;
> + case 2:
> + /* TODO: missing key, need to add it later */
> + checksum = ((struct amd_sriov_msg_pf2vf_info *)pf2vf_info)->checksum;
> + checkval = amd_sriov_msg_checksum(
> + adev->virt.fw_reserve.p_pf2vf, pf2vf_info->size,
> + 0, checksum);
> + if (checksum != checkval) {
> + DRM_ERROR("invalid pf2vf message\n");
> + return -EINVAL;
> + }
> +
> + adev->virt.vf2pf_update_interval_ms =
> + ((struct amd_sriov_msg_pf2vf_info *)pf2vf_info)->vf2pf_update_interval_ms;
> + adev->virt.gim_feature =
> + ((struct amd_sriov_msg_pf2vf_info *)pf2vf_info)->feature_flags.all;
> +
> + break;
> + default:
> + DRM_ERROR("invalid pf2vf version\n");
> + return -EINVAL;
> + }
> +
> + /* correct too large or too little interval value */
> + if (adev->virt.vf2pf_update_interval_ms < 200 || adev->virt.vf2pf_update_interval_ms > 10000)
> + adev->virt.vf2pf_update_interval_ms = 2000;
> +
> + return 0;
> +}
> +
> +static void amdgpu_virt_populate_vf2pf_ucode_info(struct amdgpu_device *adev)
> +{
> + struct amd_sriov_msg_vf2pf_info *vf2pf_info;
> + vf2pf_info = (struct amd_sriov_msg_vf2pf_info *) adev->virt.fw_reserve.p_vf2pf;
> +
> + if (adev->virt.fw_reserve.p_vf2pf == NULL)
> + return;
> +
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_VCE, adev->vce.fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_UVD, adev->uvd.fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_MC, adev->gmc.fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_ME, adev->gfx.me_fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_PFP, adev->gfx.pfp_fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_CE, adev->gfx.ce_fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_RLC, adev->gfx.rlc_fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_RLC_SRLC, adev->gfx.rlc_srlc_fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_RLC_SRLG, adev->gfx.rlc_srlg_fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_RLC_SRLS, adev->gfx.rlc_srls_fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_MEC, adev->gfx.mec_fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_MEC2, adev->gfx.mec2_fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_SOS, adev->psp.sos_fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_ASD, adev->psp.asd_fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_TA_RAS, adev->psp.ta_ras_ucode_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_TA_XGMI, adev->psp.ta_xgmi_ucode_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_SMC, adev->pm.fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_SDMA, adev->sdma.instance[0].fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_SDMA2, adev->sdma.instance[1].fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_VCN, adev->vcn.fw_version);
> + POPULATE_UCODE_INFO(vf2pf_info, AMD_SRIOV_UCODE_ID_DMCU, adev->dm.dmcu_fw_version);
> +}
> +
> +static int amdgpu_virt_write_vf2pf_data(struct amdgpu_device *adev)
> +{
> + struct amd_sriov_msg_vf2pf_info *vf2pf_info;
> +
> + vf2pf_info = (struct amd_sriov_msg_vf2pf_info *) adev->virt.fw_reserve.p_vf2pf;
> +
> + if (adev->virt.fw_reserve.p_vf2pf == NULL)
> + return -EINVAL;
> +
> + memset(vf2pf_info, 0, sizeof(struct amd_sriov_msg_vf2pf_info));
> +
> + vf2pf_info->header.size = sizeof(struct amd_sriov_msg_vf2pf_info);
> + vf2pf_info->header.version = AMD_SRIOV_MSG_FW_VRAM_VF2PF_VER;
> +
> +#ifdef MODULE
> + if (THIS_MODULE->version != NULL)
> + strcpy(vf2pf_info->driver_version, THIS_MODULE->version);
> + else
> +#endif
> + strcpy(vf2pf_info->driver_version, "N/A");
> +
> + vf2pf_info->pf2vf_version_required = 0; // no requirement, guest understands all
> + vf2pf_info->driver_cert = 0;
> + vf2pf_info->os_info.all = 0;
> +
> + vf2pf_info->fb_usage = amdgpu_vram_mgr_usage(&adev->mman.bdev.man[TTM_PL_VRAM]) >> 20;
> + vf2pf_info->fb_vis_usage = amdgpu_vram_mgr_vis_usage(&adev->mman.bdev.man[TTM_PL_VRAM]) >> 20;
> + vf2pf_info->fb_size = adev->gmc.real_vram_size >> 20;
> + vf2pf_info->fb_vis_size = adev->gmc.visible_vram_size >> 20;
> +
> + amdgpu_virt_populate_vf2pf_ucode_info(adev);
> +
> + /* TODO: read dynamic info */
> + vf2pf_info->gfx_usage = 0;
> + vf2pf_info->compute_usage = 0;
> + vf2pf_info->encode_usage = 0;
> + vf2pf_info->decode_usage = 0;
> +
> + vf2pf_info->checksum =
> + amd_sriov_msg_checksum(
> + vf2pf_info, vf2pf_info->header.size, 0, 0);
> +
> + return 0;
> +}
> +
> +void amdgpu_virt_update_vf2pf_work_item(struct work_struct *work)
> +{
> + struct amdgpu_device *adev = container_of(work, struct amdgpu_device, virt.vf2pf_work.work);
> +
> + amdgpu_virt_read_pf2vf_data(adev);
> + amdgpu_virt_write_vf2pf_data(adev);
> +
> + schedule_delayed_work(&(adev->virt.vf2pf_work), adev->virt.vf2pf_update_interval_ms);
> +}
> +
> +void amdgpu_virt_fini_data_exchange(struct amdgpu_device *adev)
> +{
> + if (adev->virt.vf2pf_update_interval_ms != 0) {
> + DRM_INFO("clean up the vf2pf work item\n");
> + flush_delayed_work(&adev->virt.vf2pf_work);
> + cancel_delayed_work_sync(&adev->virt.vf2pf_work);
> + }
> +}
> +
> +void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev)
> +{
> uint64_t bp_block_offset = 0;
> uint32_t bp_block_size = 0;
> - struct amdgim_pf2vf_info_v2 *pf2vf_v2 = NULL;
> + struct amd_sriov_msg_pf2vf_info *pf2vf_v2 = NULL;
>
> adev->virt.fw_reserve.p_pf2vf = NULL;
> adev->virt.fw_reserve.p_vf2pf = NULL;
> + adev->virt.vf2pf_update_interval_ms = 0;
> +
> + if (adev->fw_vram_usage.va != NULL) {
> + adev->virt.vf2pf_update_interval_ms = 2000;
>
> - if (adev->mman.fw_vram_usage_va != NULL) {
> adev->virt.fw_reserve.p_pf2vf =
> - (struct amd_sriov_msg_pf2vf_info_header *)(
> - adev->mman.fw_vram_usage_va + AMDGIM_DATAEXCHANGE_OFFSET);
> - AMDGPU_FW_VRAM_PF2VF_READ(adev, header.size, &pf2vf_size);
> - AMDGPU_FW_VRAM_PF2VF_READ(adev, checksum, &checksum);
> - AMDGPU_FW_VRAM_PF2VF_READ(adev, feature_flags, &adev->virt.gim_feature);
> -
> - /* pf2vf message must be in 4K */
> - if (pf2vf_size > 0 && pf2vf_size < 4096) {
> - if (adev->virt.fw_reserve.p_pf2vf->version == 2) {
> - pf2vf_v2 = (struct amdgim_pf2vf_info_v2 *)adev->virt.fw_reserve.p_pf2vf;
> - bp_block_offset = ((uint64_t)pf2vf_v2->bp_block_offset_L & 0xFFFFFFFF) |
> - ((((uint64_t)pf2vf_v2->bp_block_offset_H) << 32) & 0xFFFFFFFF00000000);
> + (struct amd_sriov_msg_pf2vf_info_header *)
> + (adev->fw_vram_usage.va + (AMD_SRIOV_MSG_PF2VF_OFFSET_KB << 10));
> + adev->virt.fw_reserve.p_vf2pf =
> + (struct amd_sriov_msg_vf2pf_info_header *)
> + (adev->fw_vram_usage.va + (AMD_SRIOV_MSG_VF2PF_OFFSET_KB << 10));
> +
> + amdgpu_virt_read_pf2vf_data(adev);
> + amdgpu_virt_write_vf2pf_data(adev);
> +
> + /* bad page handling for version 2 */
> + if (adev->virt.fw_reserve.p_pf2vf->version == 2) {
> + pf2vf_v2 = (struct amd_sriov_msg_pf2vf_info *)adev->virt.fw_reserve.p_pf2vf;
> +
> + bp_block_offset = ((uint64_t)pf2vf_v2->bp_block_offset_low & 0xFFFFFFFF) |
> + ((((uint64_t)pf2vf_v2->bp_block_offset_high) << 32) & 0xFFFFFFFF00000000);
> bp_block_size = pf2vf_v2->bp_block_size;
>
> if (bp_block_size && !adev->virt.ras_init_done)
> @@ -450,37 +610,11 @@ void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev)
> if (adev->virt.ras_init_done)
> amdgpu_virt_add_bad_page(adev, bp_block_offset, bp_block_size);
> }
> + }
>
> - checkval = amdgpu_virt_fw_reserve_get_checksum(
> - adev->virt.fw_reserve.p_pf2vf, pf2vf_size,
> - adev->virt.fw_reserve.checksum_key, checksum);
> - if (checkval == checksum) {
> - adev->virt.fw_reserve.p_vf2pf =
> - ((void *)adev->virt.fw_reserve.p_pf2vf +
> - pf2vf_size);
> - memset((void *)adev->virt.fw_reserve.p_vf2pf, 0,
> - sizeof(amdgim_vf2pf_info));
> - AMDGPU_FW_VRAM_VF2PF_WRITE(adev, header.version,
> - AMDGPU_FW_VRAM_VF2PF_VER);
> - AMDGPU_FW_VRAM_VF2PF_WRITE(adev, header.size,
> - sizeof(amdgim_vf2pf_info));
> - AMDGPU_FW_VRAM_VF2PF_READ(adev, driver_version,
> - &str);
> -#ifdef MODULE
> - if (THIS_MODULE->version != NULL)
> - strcpy(str, THIS_MODULE->version);
> - else
> -#endif
> - strcpy(str, "N/A");
> - AMDGPU_FW_VRAM_VF2PF_WRITE(adev, driver_cert,
> - 0);
> - AMDGPU_FW_VRAM_VF2PF_WRITE(adev, checksum,
> - amdgpu_virt_fw_reserve_get_checksum(
> - adev->virt.fw_reserve.p_vf2pf,
> - pf2vf_size,
> - adev->virt.fw_reserve.checksum_key, 0));
> - }
> - }
> + if (adev->virt.vf2pf_update_interval_ms != 0) {
> + INIT_DELAYED_WORK(&adev->virt.vf2pf_work, amdgpu_virt_update_vf2pf_work_item);
> + schedule_delayed_work(&(adev->virt.vf2pf_work), adev->virt.vf2pf_update_interval_ms);
> }
> }
>
> diff --git a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
> index 082fb0736645..8dd624c20f89 100644
> --- a/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
> +++ b/drivers/gpu/drm/amd/amdgpu/amdgpu_virt.h
> @@ -125,45 +125,6 @@ struct amdgim_pf2vf_info_v1 {
> unsigned int checksum;
> } __aligned(4);
>
> -/* TODO: below struct is duplicated to amd_sriov_msg_pf2vf_info */
> -struct amdgim_pf2vf_info_v2 {
> - /* header contains size and version */
> - struct amd_sriov_msg_pf2vf_info_header header;
> - /* use private key from mailbox 2 to create chueksum */
> - uint32_t checksum;
> - /* The features flags of the GIM driver supports. */
> - uint32_t feature_flags;
> - /* max_width * max_height */
> - uint32_t uvd_enc_max_pixels_count;
> - /* 16x16 pixels/sec, codec independent */
> - uint32_t uvd_enc_max_bandwidth;
> - /* max_width * max_height */
> - uint32_t vce_enc_max_pixels_count;
> - /* 16x16 pixels/sec, codec independent */
> - uint32_t vce_enc_max_bandwidth;
> - /* Bad pages block position in BYTE */
> - uint32_t bp_block_offset_L;
> - uint32_t bp_block_offset_H;
> - /* Bad pages block size in BYTE */
> - uint32_t bp_block_size;
> - /* MEC FW position in kb from the start of VF visible frame buffer */
> - uint32_t mecfw_kboffset_L;
> - uint32_t mecfw_kboffset_H;
> - /* MEC FW size in KB */
> - uint32_t mecfw_ksize;
> - /* UVD FW position in kb from the start of VF visible frame buffer */
> - uint32_t uvdfw_kboffset_L;
> - uint32_t uvdfw_kboffset_H;
> - /* UVD FW size in KB */
> - uint32_t uvdfw_ksize;
> - /* VCE FW position in kb from the start of VF visible frame buffer */
> - uint32_t vcefw_kboffset_L;
> - uint32_t vcefw_kboffset_H;
> - /* VCE FW size in KB */
> - uint32_t vcefw_ksize;
> - uint32_t reserved[AMDGIM_GET_STRUCTURE_RESERVED_SIZE(256, 0, 0, (18 + sizeof(struct amd_sriov_msg_pf2vf_info_header)/sizeof(uint32_t)), 0)];
> -} __aligned(4);
> -
> struct amdgim_vf2pf_info_v1 {
> /* header contains size and version */
> struct amd_sriov_msg_vf2pf_info_header header;
> @@ -225,32 +186,6 @@ struct amdgim_vf2pf_info_v2 {
> uint32_t reserved[AMDGIM_GET_STRUCTURE_RESERVED_SIZE(256, 64, 0, (12 + sizeof(struct amd_sriov_msg_vf2pf_info_header)/sizeof(uint32_t)), 0)];
> } __aligned(4);
>
> -/* TODO: below macro and typedef will cause compile error, need to remove */
> -#define AMDGPU_FW_VRAM_VF2PF_VER 2
> -typedef struct amd_sriov_msg_vf2pf_info amdgim_vf2pf_info;
> -
> -#define AMDGPU_FW_VRAM_VF2PF_WRITE(adev, field, val) \
> - do { \
> - ((amdgim_vf2pf_info *)adev->virt.fw_reserve.p_vf2pf)->field = (val); \
> - } while (0)
> -
> -#define AMDGPU_FW_VRAM_VF2PF_READ(adev, field, val) \
> - do { \
> - (*val) = ((amdgim_vf2pf_info *)adev->virt.fw_reserve.p_vf2pf)->field; \
> - } while (0)
> -
> -#define AMDGPU_FW_VRAM_PF2VF_READ(adev, field, val) \
> - do { \
> - if (!adev->virt.fw_reserve.p_pf2vf) \
> - *(val) = 0; \
> - else { \
> - if (adev->virt.fw_reserve.p_pf2vf->version == 1) \
> - *(val) = ((struct amdgim_pf2vf_info_v1 *)adev->virt.fw_reserve.p_pf2vf)->field; \
> - if (adev->virt.fw_reserve.p_pf2vf->version == 2) \
> - *(val) = ((struct amdgim_pf2vf_info_v2 *)adev->virt.fw_reserve.p_pf2vf)->field; \
> - } \
> - } while (0)
> -
> struct amdgpu_virt_ras_err_handler_data {
> /* point to bad page records array */
> struct eeprom_table_record *bps;
> @@ -274,7 +209,7 @@ struct amdgpu_virt {
> struct work_struct flr_work;
> struct amdgpu_mm_table mm_table;
> const struct amdgpu_virt_ops *ops;
> - struct amdgpu_vf_error_buffer vf_errors;
> + struct amdgpu_vf_error_buffer vf_errors;
> struct amdgpu_virt_fw_reserve fw_reserve;
> uint32_t gim_feature;
> uint32_t reg_access_mode;
> @@ -282,6 +217,10 @@ struct amdgpu_virt {
> bool tdr_debug;
> struct amdgpu_virt_ras_err_handler_data *virt_eh_data;
> bool ras_init_done;
> +
> + /* vf2pf message */
> + struct delayed_work vf2pf_work;
> + uint32_t vf2pf_update_interval_ms;
> };
>
> #define amdgpu_sriov_enabled(adev) \
> @@ -330,11 +269,9 @@ void amdgpu_virt_request_init_data(struct amdgpu_device *adev);
> int amdgpu_virt_wait_reset(struct amdgpu_device *adev);
> int amdgpu_virt_alloc_mm_table(struct amdgpu_device *adev);
> void amdgpu_virt_free_mm_table(struct amdgpu_device *adev);
> -int amdgpu_virt_fw_reserve_get_checksum(void *obj, unsigned long obj_size,
> - unsigned int key,
> - unsigned int chksum);
> void amdgpu_virt_release_ras_err_handler_data(struct amdgpu_device *adev);
> void amdgpu_virt_init_data_exchange(struct amdgpu_device *adev);
> +void amdgpu_virt_fini_data_exchange(struct amdgpu_device *adev);
> void amdgpu_detect_virtualization(struct amdgpu_device *adev);
>
> bool amdgpu_virt_can_access_debugfs(struct amdgpu_device *adev);
> --
> 2.20.1
>
> _______________________________________________
> amd-gfx mailing list
> amd-gfx at lists.freedesktop.org
> https://lists.freedesktop.org/mailman/listinfo/amd-gfx
More information about the amd-gfx
mailing list