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: Mika Westerberg <mika.westerberg@linux.intel.com> Reviewed-by: Andy Shevchenko <andy.shevchenko@gmail.com>
This commit is contained in:
parent
0b0a0bd06e
commit
3080e197e9
|
@ -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 @@ err_free:
|
||||||
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;
|
||||||
|
|
|
@ -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;
|
||||||
|
|
Loading…
Reference in New Issue