/*
 * Copyright 2018 Advanced Micro Devices, Inc.
 *
 * 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 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 COPYRIGHT HOLDER(S) OR AUTHOR(S) 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 __AMDGPU_DISCOVERY__
#define __AMDGPU_DISCOVERY__

#include <linux/debugfs.h>

#define DISCOVERY_TMR_SIZE      (10 << 10)
#define DISCOVERY_TMR_OFFSET    (64 << 10)

struct ip_discovery_top;
struct drm_printer;

struct amdgpu_discovery_info {
	struct debugfs_blob_wrapper debugfs_blob;
	struct ip_discovery_top *ip_top;
	uint64_t offset;
	uint32_t size;
	uint8_t *bin;
	bool reserve_tmr;
};

void amdgpu_discovery_sysfs_fini(struct amdgpu_device *adev);
void amdgpu_discovery_fini(struct amdgpu_device *adev);
int amdgpu_discovery_set_ip_blocks(struct amdgpu_device *adev);

int amdgpu_discovery_get_nps_info(struct amdgpu_device *adev,
				  uint32_t *nps_type,
				  struct amdgpu_gmc_memrange *ranges,
				  int *range_cnt, bool refresh);
int amdgpu_discovery_get_gc_major_minor_version(struct amdgpu_device *adev,
						uint16_t *major, uint16_t *minor);

void amdgpu_discovery_dump(struct amdgpu_device *adev, struct drm_printer *p);

/* Early sysfs functions for persistent ip_discovery export */
int amdgpu_discovery_sysfs_early_init(struct amdgpu_device *adev,
				       struct pci_dev *pdev);
void amdgpu_discovery_sysfs_early_fini(struct pci_dev *pdev);

#endif /* __AMDGPU_DISCOVERY__ */
