firmware: ti_sci: Allow for device shared and exclusive requests
Sysfw provides an option for requesting exclusive access for a device using the flags MSG_FLAG_DEVICE_EXCLUSIVE. If this flag is not used, the device is meant to be shared across hosts. Once a device is requested from a host with this flag set, any request to this device from a different host will be nacked by sysfw. Current tisci driver enables this flag for every device requests. But this may not be true for all the devices. So provide a separate commands in driver for exclusive and shared device requests. Reviewed-by: Nishanth Menon <nm@ti.com> Signed-off-by: Lokesh Vutla <lokeshvutla@ti.com> Signed-off-by: Santosh Shilimkar <santosh.shilimkar@oracle.com> Signed-off-by: Arnd Bergmann <arnd@arndb.de>
This commit is contained in:
Родитель
3b1261fb72
Коммит
45b659ee75
|
@ -635,6 +635,7 @@ fail:
|
|||
|
||||
/**
|
||||
* ti_sci_cmd_get_device() - command to request for device managed by TISCI
|
||||
* that can be shared with other hosts.
|
||||
* @handle: Pointer to TISCI handle as retrieved by *ti_sci_get_handle
|
||||
* @id: Device Identifier
|
||||
*
|
||||
|
@ -642,11 +643,29 @@ fail:
|
|||
* usage count by balancing get_device with put_device. No refcounting is
|
||||
* managed by driver for that purpose.
|
||||
*
|
||||
* NOTE: The request is for exclusive access for the processor.
|
||||
*
|
||||
* Return: 0 if all went fine, else return appropriate error.
|
||||
*/
|
||||
static int ti_sci_cmd_get_device(const struct ti_sci_handle *handle, u32 id)
|
||||
{
|
||||
return ti_sci_set_device_state(handle, id, 0,
|
||||
MSG_DEVICE_SW_STATE_ON);
|
||||
}
|
||||
|
||||
/**
|
||||
* ti_sci_cmd_get_device_exclusive() - command to request for device managed by
|
||||
* TISCI that is exclusively owned by the
|
||||
* requesting host.
|
||||
* @handle: Pointer to TISCI handle as retrieved by *ti_sci_get_handle
|
||||
* @id: Device Identifier
|
||||
*
|
||||
* Request for the device - NOTE: the client MUST maintain integrity of
|
||||
* usage count by balancing get_device with put_device. No refcounting is
|
||||
* managed by driver for that purpose.
|
||||
*
|
||||
* Return: 0 if all went fine, else return appropriate error.
|
||||
*/
|
||||
static int ti_sci_cmd_get_device_exclusive(const struct ti_sci_handle *handle,
|
||||
u32 id)
|
||||
{
|
||||
return ti_sci_set_device_state(handle, id,
|
||||
MSG_FLAG_DEVICE_EXCLUSIVE,
|
||||
|
@ -665,6 +684,26 @@ static int ti_sci_cmd_get_device(const struct ti_sci_handle *handle, u32 id)
|
|||
* Return: 0 if all went fine, else return appropriate error.
|
||||
*/
|
||||
static int ti_sci_cmd_idle_device(const struct ti_sci_handle *handle, u32 id)
|
||||
{
|
||||
return ti_sci_set_device_state(handle, id, 0,
|
||||
MSG_DEVICE_SW_STATE_RETENTION);
|
||||
}
|
||||
|
||||
/**
|
||||
* ti_sci_cmd_idle_device_exclusive() - Command to idle a device managed by
|
||||
* TISCI that is exclusively owned by
|
||||
* requesting host.
|
||||
* @handle: Pointer to TISCI handle as retrieved by *ti_sci_get_handle
|
||||
* @id: Device Identifier
|
||||
*
|
||||
* Request for the device - NOTE: the client MUST maintain integrity of
|
||||
* usage count by balancing get_device with put_device. No refcounting is
|
||||
* managed by driver for that purpose.
|
||||
*
|
||||
* Return: 0 if all went fine, else return appropriate error.
|
||||
*/
|
||||
static int ti_sci_cmd_idle_device_exclusive(const struct ti_sci_handle *handle,
|
||||
u32 id)
|
||||
{
|
||||
return ti_sci_set_device_state(handle, id,
|
||||
MSG_FLAG_DEVICE_EXCLUSIVE,
|
||||
|
@ -2894,7 +2933,9 @@ static void ti_sci_setup_ops(struct ti_sci_info *info)
|
|||
core_ops->reboot_device = ti_sci_cmd_core_reboot;
|
||||
|
||||
dops->get_device = ti_sci_cmd_get_device;
|
||||
dops->get_device_exclusive = ti_sci_cmd_get_device_exclusive;
|
||||
dops->idle_device = ti_sci_cmd_idle_device;
|
||||
dops->idle_device_exclusive = ti_sci_cmd_idle_device_exclusive;
|
||||
dops->put_device = ti_sci_cmd_put_device;
|
||||
|
||||
dops->is_valid = ti_sci_cmd_dev_is_valid;
|
||||
|
|
|
@ -97,7 +97,10 @@ struct ti_sci_core_ops {
|
|||
*/
|
||||
struct ti_sci_dev_ops {
|
||||
int (*get_device)(const struct ti_sci_handle *handle, u32 id);
|
||||
int (*get_device_exclusive)(const struct ti_sci_handle *handle, u32 id);
|
||||
int (*idle_device)(const struct ti_sci_handle *handle, u32 id);
|
||||
int (*idle_device_exclusive)(const struct ti_sci_handle *handle,
|
||||
u32 id);
|
||||
int (*put_device)(const struct ti_sci_handle *handle, u32 id);
|
||||
int (*is_valid)(const struct ti_sci_handle *handle, u32 id);
|
||||
int (*get_context_loss_count)(const struct ti_sci_handle *handle,
|
||||
|
|
Загрузка…
Ссылка в новой задаче