mirror of
https://github.com/torvalds/linux.git
synced 2026-07-30 11:11:26 +02:00
Merge "mmrm: Adding mmrm header for kalama project"
This commit is contained in:
commit
7b46a82ae4
271
include/linux/soc/qcom/msm_mmrm.h
Normal file
271
include/linux/soc/qcom/msm_mmrm.h
Normal file
|
|
@ -0,0 +1,271 @@
|
|||
/* SPDX-License-Identifier: GPL-2.0-only */
|
||||
/*
|
||||
* Copyright (c) 2020-2021, The Linux Foundation. All rights reserved.
|
||||
*
|
||||
*/
|
||||
|
||||
#ifndef __MSM_MMRM_H__
|
||||
#define __MSM_MMRM_H__
|
||||
|
||||
#include <linux/types.h>
|
||||
|
||||
#define MMRM_CLK_CLIENT_NAME_SIZE 128
|
||||
|
||||
/*
|
||||
* MMRM Client data flags
|
||||
* MMRM_CLIENT_DATA_FLAG_RESERVE_ONLY : Clients can use this flag
|
||||
* to reserve the actual required resource to MMRM (as some clients
|
||||
* have a differnt path to validate the resource availability).
|
||||
* With this flag set for mmrm_set_value, MMRM will skip setting rate
|
||||
* to clk driver & only check if requested clk resource is available.
|
||||
* Client need to call mmrm_set_value again (without this flag) to complete
|
||||
* the rate setting to clk driver. If MMRM driver will not receive
|
||||
* set_value call from client within stipulated time eg: 100ms,
|
||||
* resource will be returned back to pool.
|
||||
*/
|
||||
#define MMRM_CLIENT_DATA_FLAG_RESERVE_ONLY 0x0001
|
||||
|
||||
/**
|
||||
* mmrm_client_domain : MMRM client domain
|
||||
* Clients need to configure this in mmrm_clk_client_desc
|
||||
*/
|
||||
enum mmrm_client_domain {
|
||||
MMRM_CLIENT_DOMAIN_CAMERA = 0x1,
|
||||
MMRM_CLIENT_DOMAIN_CVP = 0x2,
|
||||
MMRM_CLIENT_DOMAIN_DISPLAY = 0x3,
|
||||
MMRM_CLIENT_DOMAIN_VIDEO = 0x4,
|
||||
};
|
||||
|
||||
/**
|
||||
* mmrm_client_type : MMRM Client type
|
||||
*/
|
||||
enum mmrm_client_type {
|
||||
MMRM_CLIENT_CLOCK,
|
||||
};
|
||||
|
||||
/**
|
||||
* mmrm_client_priority: Allowed mmrm client priorities configured by client.
|
||||
* These priorities are used by mmrm clients when regitering client.
|
||||
* Clients registered with low priority can be throttled to a lower
|
||||
* value (if needed to accommodate high priority client
|
||||
* or if current set value exceeds peak threshold).
|
||||
* High priority clients cannot be throttled & if set value cannot
|
||||
* be accommodated (even after throttling low priority clients),
|
||||
* mmrm driver will return error -EDQUOT.
|
||||
* Order of throttling registered low priority clients will be
|
||||
* dependent on chipset and will be decided by MMRM driver.
|
||||
*/
|
||||
enum mmrm_client_priority {
|
||||
MMRM_CLIENT_PRIOR_HIGH = 0x1,
|
||||
MMRM_CLIENT_PRIOR_LOW = 0x2
|
||||
};
|
||||
|
||||
/*
|
||||
* mmrm_cb_type: Callback type for the mmrm client notifier
|
||||
* MMRM_CLIENT_RESOURCE_VALUE_CHANGE: Indicate a change in resource value
|
||||
*/
|
||||
enum mmrm_cb_type {
|
||||
MMRM_CLIENT_RESOURCE_VALUE_CHANGE = 0x1,
|
||||
};
|
||||
|
||||
/**
|
||||
* mmrm_res_val_chng: Change in resource value for mmrm cb type
|
||||
* MMRM_CLIENT_RESOURCE_VALUE_CHANGE
|
||||
* @old_val: Previously configured resource value by client
|
||||
* @new_val: New resource value for this client (throttled value) by mmrm
|
||||
*/
|
||||
struct mmrm_res_val_chng {
|
||||
unsigned long old_val;
|
||||
unsigned long new_val;
|
||||
};
|
||||
|
||||
/**
|
||||
* mmrm_client_notifier_data: Callback used to pass resource data to client
|
||||
* @cb_type: Type of notifier callback (eg: MMRM_CLIENT_RESOURCE_VALUE_CHANGE)
|
||||
* @cb_data: Data corresponding to notifier cb type
|
||||
* @pvt_data: Private data provided by client while registering
|
||||
*/
|
||||
struct mmrm_client_notifier_data {
|
||||
enum mmrm_cb_type cb_type;
|
||||
union {
|
||||
struct mmrm_res_val_chng val_chng;
|
||||
} cb_data;
|
||||
void *pvt_data;
|
||||
};
|
||||
|
||||
/**
|
||||
* mmrm_client_res_value - Resource values for MMRM client
|
||||
* For mmrm_client_set_value_in_range, client will configure min & cur
|
||||
* For mmrm_client_get_value, mmrm driver will return all 3 values.
|
||||
* @min: Min resource value of this client
|
||||
* @cur: Current resource value of this client
|
||||
* @max: Max possible resource value of this client
|
||||
* min and cur are previously set by client, while max is computed by mmrm
|
||||
*/
|
||||
struct mmrm_client_res_value {
|
||||
unsigned long min;
|
||||
unsigned long cur;
|
||||
unsigned long max;
|
||||
};
|
||||
|
||||
/**
|
||||
* mmrm_client : MMRM client structure allocated & returned to client
|
||||
* in register call. This will ensure that right client is configuring
|
||||
* set/get value for its resources.
|
||||
* @client_type: Type of client resource
|
||||
* @client_uid: Unique id of the resource created by MMRM
|
||||
*/
|
||||
struct mmrm_client {
|
||||
enum mmrm_client_type client_type;
|
||||
u32 client_uid;
|
||||
};
|
||||
|
||||
/**
|
||||
* mmrm_clk_client_desc : MMRM clock client descriptor used
|
||||
* for registering client
|
||||
* @client_domain: Client provides MMRM_CLIENT_DOMAIN_XXXX
|
||||
* @client_id: Client provides CLK_SRC_XXXX id
|
||||
* @name : Client name
|
||||
* @clk : Pointer to clock struct
|
||||
*/
|
||||
struct mmrm_clk_client_desc {
|
||||
u32 client_domain;
|
||||
u32 client_id;
|
||||
const char name[MMRM_CLK_CLIENT_NAME_SIZE];
|
||||
struct clk *clk;
|
||||
};
|
||||
|
||||
/**
|
||||
* mmrm_client_desc : MMRM client descriptor used for registering client
|
||||
* @client_type : Type of client (eg: clock)
|
||||
* @client_info : Description of client (eg: clock)
|
||||
* @priority : Client priority
|
||||
* @pvt_data : Client data to be used by clients when mmrm driver
|
||||
* calls notifier function after throttling.
|
||||
* @notifier_callback_fn : Callback function used by mmrm to notify clients
|
||||
* asynchronously. These callbacks are allowed only
|
||||
* when client is actively registered.
|
||||
*/
|
||||
struct mmrm_client_desc {
|
||||
enum mmrm_client_type client_type;
|
||||
union {
|
||||
struct mmrm_clk_client_desc desc;
|
||||
} client_info;
|
||||
enum mmrm_client_priority priority;
|
||||
void *pvt_data;
|
||||
int (*notifier_callback_fn)(
|
||||
struct mmrm_client_notifier_data *notifier_data);
|
||||
};
|
||||
|
||||
/**
|
||||
* mmrm_client_data : Additional data MMRM client data needed to configure
|
||||
* set value.
|
||||
* @num_hw_blocks: Client hw blocks enabled for resource allocation estimation
|
||||
* Default 1 for each client
|
||||
* @flags: Client flags used to provide additional client info
|
||||
* Refer flags MMRM_CLIENT_DATA_FLAG_XXXX
|
||||
*/
|
||||
struct mmrm_client_data {
|
||||
u32 num_hw_blocks;
|
||||
u32 flags;
|
||||
};
|
||||
|
||||
#if IS_ENABLED(CONFIG_MSM_MMRM)
|
||||
/**
|
||||
* mmrm_client_register - register an mmrm client
|
||||
* This call not configure any rate, use set rate to configure desired rate.
|
||||
* @desc: Client description
|
||||
*
|
||||
* Returns pointer to mmrm_client for success or NULL during failure
|
||||
*/
|
||||
struct mmrm_client *mmrm_client_register(struct mmrm_client_desc *desc);
|
||||
|
||||
/**
|
||||
* mmrm_client_deregister - de-register a previously registered mmrm client
|
||||
* @client: Pointer to mmrm client, returned after client registration
|
||||
*
|
||||
* Returns 0 on success or negative errno (-EINVAL)
|
||||
*/
|
||||
int mmrm_client_deregister(struct mmrm_client *client);
|
||||
|
||||
/**
|
||||
* mmrm_client_set_value - set mmrm client resource value to the given value.
|
||||
* MMRM driver will check client priority & configure this value accordingly.
|
||||
* For high priority clients, mmrm driver will try to set the value & will
|
||||
* throttle low priority clients to accommodate the request. If set rate value
|
||||
* cannot be accommodated, then mmrm driver will return errno (-EDQUOT).
|
||||
* For low priority clients, mmrm driver will return error if value cannot
|
||||
* be accommodated.
|
||||
* For clock resource, this will replace clk_set_rate() in client driver.
|
||||
*
|
||||
* @client: Pointer to mmrm client returned after client registration
|
||||
* @client_data : Additional client data provided by mmrm client for set value
|
||||
* @val: Desired resource value
|
||||
*
|
||||
* Returns 0 on success or negative errno (-EDQUOT / -EINVAL)
|
||||
*/
|
||||
int mmrm_client_set_value(struct mmrm_client *client,
|
||||
struct mmrm_client_data *client_data, unsigned long val);
|
||||
|
||||
/**
|
||||
* mmrm_client_set_value_in_range - set mmrm client resource value to the
|
||||
* allowed value in the given range.
|
||||
* This api is primarily for low priority clients, if current value (cur)
|
||||
* cannot be configured then MMRM driver will identify a suitable lower value
|
||||
* using intermediate corners for the client upto minmum value (min).
|
||||
* In case set value cannot be accommodated mmrm driver will return -EDQUOT.
|
||||
* MMRM will store the min value if this client needs to be throttled.
|
||||
* @client: mmrm client returned after client registration
|
||||
* @client_data : additional client data provided by mmrm client for set value
|
||||
* @val : setting resource value triplet
|
||||
*
|
||||
* Returns 0 on success or negative errno (-EDQUOT/ -EINVAL)
|
||||
*/
|
||||
int mmrm_client_set_value_in_range(struct mmrm_client *client,
|
||||
struct mmrm_client_data *client_data,
|
||||
struct mmrm_client_res_value *val);
|
||||
|
||||
/**
|
||||
* mmrm_client_get_value - get mmrm client resource values {min, cur, max}
|
||||
* @client: mmrm client returned after client registration
|
||||
* @val: resource value triplet set by mmrm
|
||||
*
|
||||
* Returns 0 on success or negative errno (-ENOTSUPP)
|
||||
*/
|
||||
int mmrm_client_get_value(struct mmrm_client *client,
|
||||
struct mmrm_client_res_value *val);
|
||||
|
||||
#else
|
||||
static inline struct mmrm_client *mmrm_client_register(
|
||||
struct mmrm_client_desc *desc)
|
||||
{
|
||||
return NULL;
|
||||
}
|
||||
|
||||
static inline int mmrm_client_deregister(struct mmrm_client *client)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
static inline int mmrm_client_set_value(struct mmrm_client *client,
|
||||
struct mmrm_client_data *client_data, unsigned long val)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int mmrm_client_set_value_in_range(struct mmrm_client *client,
|
||||
struct mmrm_client_data *client_data,
|
||||
struct mmrm_client_res_value *val)
|
||||
{
|
||||
return -EINVAL;
|
||||
}
|
||||
|
||||
static inline int mmrm_client_get_value(struct mmrm_client *client,
|
||||
struct mmrm_client_res_value *val)
|
||||
{
|
||||
return 0;
|
||||
}
|
||||
|
||||
#endif
|
||||
|
||||
#endif
|
||||
Loading…
Reference in New Issue
Block a user