Commit d3f557d5 authored by Lucas De Marchi's avatar Lucas De Marchi
Browse files

drm/xe/oa: Move fini to xe_oa



Like done with other functions, cleanup the error handling in
xe_device_probe() by moving the OA fini to be handled by xe_oa
itself, which relies on devm to call the cleanup function.

Reviewed-by: default avatarAshutosh Dixit <ashutosh.dixit@intel.com>
Link: https://patchwork.freedesktop.org/patch/msgid/20250213192909.996148-9-lucas.demarchi@intel.com


Signed-off-by: default avatarLucas De Marchi <lucas.demarchi@intel.com>
parent f5ebe80e
Loading
Loading
Loading
Loading
+1 −6
Original line number Diff line number Diff line
@@ -873,7 +873,7 @@ int xe_device_probe(struct xe_device *xe)

	err = xe_display_init(xe);
	if (err)
		goto err_fini_oa;
		return err;

	err = xe_pxp_init(xe);
	if (err)
@@ -905,9 +905,6 @@ int xe_device_probe(struct xe_device *xe)
err_fini_display:
	xe_display_driver_remove(xe);

err_fini_oa:
	xe_oa_fini(xe);

	return err;
}

@@ -980,8 +977,6 @@ void xe_device_remove(struct xe_device *xe)

	xe_device_remove_display(xe);

	xe_oa_fini(xe);

	xe_heci_gsc_fini(xe);

	xe_device_call_remove_actions(xe);
+24 −24
Original line number Diff line number Diff line
@@ -2641,6 +2641,27 @@ static void xe_oa_init_supported_formats(struct xe_oa *oa)
	}
}

static int destroy_config(int id, void *p, void *data)
{
	xe_oa_config_put(p);

	return 0;
}

static void xe_oa_fini(void *arg)
{
	struct xe_device *xe = arg;
	struct xe_oa *oa = &xe->oa;

	if (!oa->xe)
		return;

	idr_for_each(&oa->metrics_idr, destroy_config, oa);
	idr_destroy(&oa->metrics_idr);

	oa->xe = NULL;
}

/**
 * xe_oa_init - OA initialization during device probe
 * @xe: @xe_device
@@ -2672,31 +2693,10 @@ int xe_oa_init(struct xe_device *xe)
	}

	xe_oa_init_supported_formats(oa);
	return 0;
exit:
	oa->xe = NULL;
	return ret;
}

static int destroy_config(int id, void *p, void *data)
{
	xe_oa_config_put(p);
	return 0;
}

/**
 * xe_oa_fini - OA de-initialization during device remove
 * @xe: @xe_device
 */
void xe_oa_fini(struct xe_device *xe)
{
	struct xe_oa *oa = &xe->oa;

	if (!oa->xe)
		return;

	idr_for_each(&oa->metrics_idr, destroy_config, oa);
	idr_destroy(&oa->metrics_idr);
	return devm_add_action_or_reset(xe->drm.dev, xe_oa_fini, xe);

exit:
	oa->xe = NULL;
	return ret;
}
+0 −1
Original line number Diff line number Diff line
@@ -15,7 +15,6 @@ struct xe_gt;
struct xe_hw_engine;

int xe_oa_init(struct xe_device *xe);
void xe_oa_fini(struct xe_device *xe);
void xe_oa_register(struct xe_device *xe);
void xe_oa_unregister(struct xe_device *xe);
int xe_oa_stream_open_ioctl(struct drm_device *dev, u64 data, struct drm_file *file);