Commit dffa11b4 authored by Monk Liu's avatar Monk Liu Committed by Alex Deucher
Browse files

drm/amdgpu: adjust sequence of ip_discovery init and timeout_setting



what:
1)move timtout setting before ip_early_init to reduce exclusive mode
cost for SRIOV

2)move ip_discovery_init() to inside of amdgpu_discovery_reg_base_init()
it is a prepare for the later upcoming patches.

why:
in later upcoming patches we would use a new mailbox event --
"req_gpu_init_data", which is a callback hooked in adev->virt.ops and
this callback send a new event "REQ_GPU_INIT_DAT" to host to notify
host to do some preparation like "IP discovery/vbios on the VF FB"
and this callback must be:

A) invoked after set_ip_block() because virt.ops is configured during
set_ip_block()

B) invoked before ip_discovery_init() becausen ip_discovery_init()
need host side prepares everything in VF FB first.

current place of ip_discovery_init() is before we can invoke callback
of adev->virt.ops, thus we must move ip_discovery_init() to a place
after the adev->virt.ops all settle done, and the perfect place is in
amdgpu_discovery_reg_base_init()

Signed-off-by: default avatarMonk Liu <Monk.Liu@amd.com>
Reviewed-by: default avatarEmily Deng <Emily.Deng@amd.com>
Signed-off-by: default avatarAlex Deucher <alexander.deucher@amd.com>
parent 122078de
Loading
Loading
Loading
Loading
+4 −12
Original line number Diff line number Diff line
@@ -3077,25 +3077,17 @@ int amdgpu_device_init(struct amdgpu_device *adev,
	/* detect hw virtualization here */
	amdgpu_detect_virtualization(adev);

	if (amdgpu_discovery && adev->asic_type >= CHIP_NAVI10) {
		r = amdgpu_discovery_init(adev);
	r = amdgpu_device_get_job_timeout_settings(adev);
	if (r) {
			dev_err(adev->dev, "amdgpu_discovery_init failed\n");
		dev_err(adev->dev, "invalid lockup_timeout parameter syntax\n");
		return r;
	}
	}

	/* early init functions */
	r = amdgpu_device_ip_early_init(adev);
	if (r)
		return r;

	r = amdgpu_device_get_job_timeout_settings(adev);
	if (r) {
		dev_err(adev->dev, "invalid lockup_timeout parameter syntax\n");
		return r;
	}

	/* doorbell bar mapping and doorbell index init*/
	amdgpu_device_doorbell_init(adev);

+6 −4
Original line number Diff line number Diff line
@@ -156,7 +156,7 @@ static inline bool amdgpu_discovery_verify_checksum(uint8_t *data, uint32_t size
	return !!(amdgpu_discovery_calculate_checksum(data, size) == expected);
}

int amdgpu_discovery_init(struct amdgpu_device *adev)
static int amdgpu_discovery_init(struct amdgpu_device *adev)
{
	struct table_info *info;
	struct binary_header *bhdr;
@@ -255,10 +255,12 @@ int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev)
	uint8_t num_base_address;
	int hw_ip;
	int i, j, k;
	int r;

	if (!adev->discovery) {
		DRM_ERROR("ip discovery uninitialized\n");
		return -EINVAL;
	r = amdgpu_discovery_init(adev);
	if (r) {
		DRM_ERROR("amdgpu_discovery_init failed\n");
		return r;
	}

	bhdr = (struct binary_header *)adev->discovery;
+0 −1
Original line number Diff line number Diff line
@@ -26,7 +26,6 @@

#define DISCOVERY_TMR_SIZE  (64 << 10)

int amdgpu_discovery_init(struct amdgpu_device *adev);
void amdgpu_discovery_fini(struct amdgpu_device *adev);
int amdgpu_discovery_reg_base_init(struct amdgpu_device *adev);
int amdgpu_discovery_get_ip_version(struct amdgpu_device *adev, int hw_id,