Donate to e Foundation | Murena handsets with /e/OS | Own a part of Murena! Learn more

Commit 3080e197 authored by Mika Westerberg's avatar Mika Westerberg
Browse files

thunderbolt: Move driver ready handling to struct icm



Intel Titan Ridge uses slightly different format for ICM driver ready
response, so add a new ->driver_ready() callback to struct icm and move
the existing handling to a separate function which we then use in Falcon
Ridge and Alpine Ridge.

No functional changes intended.

Signed-off-by: default avatarMika Westerberg <mika.westerberg@linux.intel.com>
Reviewed-by: default avatarAndy Shevchenko <andy.shevchenko@gmail.com>
parent 0b0a0bd0
Loading
Loading
Loading
Loading
+31 −11
Original line number Original line Diff line number Diff line
@@ -59,6 +59,7 @@
 * @is_supported: Checks if we can support ICM on this controller
 * @is_supported: Checks if we can support ICM on this controller
 * @get_mode: Read and return the ICM firmware mode (optional)
 * @get_mode: Read and return the ICM firmware mode (optional)
 * @get_route: Find a route string for given switch
 * @get_route: Find a route string for given switch
 * @driver_ready: Send driver ready message to ICM
 * @device_connected: Handle device connected ICM message
 * @device_connected: Handle device connected ICM message
 * @device_disconnected: Handle device disconnected ICM message
 * @device_disconnected: Handle device disconnected ICM message
 * @xdomain_connected - Handle XDomain connected ICM message
 * @xdomain_connected - Handle XDomain connected ICM message
@@ -73,6 +74,8 @@ struct icm {
	bool (*is_supported)(struct tb *tb);
	bool (*is_supported)(struct tb *tb);
	int (*get_mode)(struct tb *tb);
	int (*get_mode)(struct tb *tb);
	int (*get_route)(struct tb *tb, u8 link, u8 depth, u64 *route);
	int (*get_route)(struct tb *tb, u8 link, u8 depth, u64 *route);
	int (*driver_ready)(struct tb *tb,
			    enum tb_security_level *security_level);
	void (*device_connected)(struct tb *tb,
	void (*device_connected)(struct tb *tb,
				 const struct icm_pkg_header *hdr);
				 const struct icm_pkg_header *hdr);
	void (*device_disconnected)(struct tb *tb,
	void (*device_disconnected)(struct tb *tb,
@@ -246,6 +249,27 @@ static int icm_fr_get_route(struct tb *tb, u8 link, u8 depth, u64 *route)
	return ret;
	return ret;
}
}


static int
icm_fr_driver_ready(struct tb *tb, enum tb_security_level *security_level)
{
	struct icm_fr_pkg_driver_ready_response reply;
	struct icm_pkg_driver_ready request = {
		.hdr.code = ICM_DRIVER_READY,
	};
	int ret;

	memset(&reply, 0, sizeof(reply));
	ret = icm_request(tb, &request, sizeof(request), &reply, sizeof(reply),
			  1, ICM_TIMEOUT);
	if (ret)
		return ret;

	if (security_level)
		*security_level = reply.security_level & ICM_FR_SLEVEL_MASK;

	return 0;
}

static int icm_fr_approve_switch(struct tb *tb, struct tb_switch *sw)
static int icm_fr_approve_switch(struct tb *tb, struct tb_switch *sw)
{
{
	struct icm_fr_pkg_approve_device request;
	struct icm_fr_pkg_approve_device request;
@@ -869,21 +893,15 @@ static void icm_handle_event(struct tb *tb, enum tb_cfg_pkg_type type,
static int
static int
__icm_driver_ready(struct tb *tb, enum tb_security_level *security_level)
__icm_driver_ready(struct tb *tb, enum tb_security_level *security_level)
{
{
	struct icm_pkg_driver_ready_response reply;
	struct icm *icm = tb_priv(tb);
	struct icm_pkg_driver_ready request = {
		.hdr.code = ICM_DRIVER_READY,
	};
	unsigned int retries = 50;
	unsigned int retries = 50;
	int ret;
	int ret;


	memset(&reply, 0, sizeof(reply));
	ret = icm->driver_ready(tb, security_level);
	ret = icm_request(tb, &request, sizeof(request), &reply, sizeof(reply),
	if (ret) {
			  1, ICM_TIMEOUT);
		tb_err(tb, "failed to send driver ready to ICM\n");
	if (ret)
		return ret;
		return ret;

	}
	if (security_level)
		*security_level = reply.security_level & 0xf;


	/*
	/*
	 * Hold on here until the switch config space is accessible so
	 * Hold on here until the switch config space is accessible so
@@ -1329,6 +1347,7 @@ struct tb *icm_probe(struct tb_nhi *nhi)
	case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_NHI:
	case PCI_DEVICE_ID_INTEL_FALCON_RIDGE_4C_NHI:
		icm->is_supported = icm_fr_is_supported;
		icm->is_supported = icm_fr_is_supported;
		icm->get_route = icm_fr_get_route;
		icm->get_route = icm_fr_get_route;
		icm->driver_ready = icm_fr_driver_ready;
		icm->device_connected = icm_fr_device_connected;
		icm->device_connected = icm_fr_device_connected;
		icm->device_disconnected = icm_fr_device_disconnected;
		icm->device_disconnected = icm_fr_device_disconnected;
		icm->xdomain_connected = icm_fr_xdomain_connected;
		icm->xdomain_connected = icm_fr_xdomain_connected;
@@ -1344,6 +1363,7 @@ struct tb *icm_probe(struct tb_nhi *nhi)
		icm->is_supported = icm_ar_is_supported;
		icm->is_supported = icm_ar_is_supported;
		icm->get_mode = icm_ar_get_mode;
		icm->get_mode = icm_ar_get_mode;
		icm->get_route = icm_ar_get_route;
		icm->get_route = icm_ar_get_route;
		icm->driver_ready = icm_fr_driver_ready;
		icm->device_connected = icm_fr_device_connected;
		icm->device_connected = icm_fr_device_connected;
		icm->device_disconnected = icm_fr_device_disconnected;
		icm->device_disconnected = icm_fr_device_disconnected;
		icm->xdomain_connected = icm_fr_xdomain_connected;
		icm->xdomain_connected = icm_fr_xdomain_connected;
+4 −2
Original line number Original line Diff line number Diff line
@@ -127,14 +127,16 @@ struct icm_pkg_driver_ready {
	struct icm_pkg_header hdr;
	struct icm_pkg_header hdr;
};
};


struct icm_pkg_driver_ready_response {
/* Falcon Ridge & Alpine Ridge common messages */

struct icm_fr_pkg_driver_ready_response {
	struct icm_pkg_header hdr;
	struct icm_pkg_header hdr;
	u8 romver;
	u8 romver;
	u8 ramver;
	u8 ramver;
	u16 security_level;
	u16 security_level;
};
};


/* Falcon Ridge & Alpine Ridge common messages */
#define ICM_FR_SLEVEL_MASK		0xf


struct icm_fr_pkg_get_topology {
struct icm_fr_pkg_get_topology {
	struct icm_pkg_header hdr;
	struct icm_pkg_header hdr;