135 lines
4.3 KiB
C
Executable File
135 lines
4.3 KiB
C
Executable File
/* Copyright (c) 2010-2011, Code Aurora Forum. All rights reserved.
|
|
*
|
|
* Redistribution and use in source and binary forms, with or without
|
|
* modification, are permitted provided that the following conditions
|
|
* are met:
|
|
* 1. Redistributions of source code must retain the above copyright
|
|
* notice, and the entire permission notice in its entirety,
|
|
* including the disclaimer of warranties.
|
|
* 2. Redistributions in binary form must reproduce the above copyright
|
|
* notice, this list of conditions and the following disclaimer in the
|
|
* documentation and/or other materials provided with the distribution.
|
|
* 3. The name of the author may not be used to endorse or promote
|
|
* products derived from this software without specific prior
|
|
* written permission.
|
|
*
|
|
* ALTERNATIVELY, this product may be distributed under the terms of
|
|
* the GNU General Public License, version 2, in which case the provisions
|
|
* of the GPL version 2 are required INSTEAD OF the BSD license.
|
|
*
|
|
* THIS SOFTWARE IS PROVIDED ``AS IS'' AND ANY EXPRESS OR IMPLIED
|
|
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
|
|
* OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE, ALL OF
|
|
* WHICH ARE HEREBY DISCLAIMED. IN NO EVENT SHALL THE AUTHOR BE
|
|
* LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
|
|
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT
|
|
* OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR
|
|
* BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
|
|
* LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
|
|
* (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE
|
|
* USE OF THIS SOFTWARE, EVEN IF NOT ADVISED OF THE POSSIBILITY OF SUCH
|
|
* DAMAGE.
|
|
*/
|
|
|
|
#ifndef _ARCH_ARM_MACH_MSM_BUS_H
|
|
#define _ARCH_ARM_MACH_MSM_BUS_H
|
|
|
|
#include <linux/types.h>
|
|
#include <linux/input.h>
|
|
|
|
/*
|
|
* Macros for clients to convert their data to ib and ab
|
|
* Ws : Time window over which to transfer the data in SECONDS
|
|
* Bs : Size of the data block in bytes
|
|
* Per : Recurrence period
|
|
* Tb : Throughput bandwidth to prevent stalling
|
|
* R : Ratio of actual bandwidth used to Tb
|
|
* Ib : Instantaneous bandwidth
|
|
* Ab : Arbitrated bandwidth
|
|
*
|
|
* IB_RECURRBLOCK and AB_RECURRBLOCK:
|
|
* These are used if the requirement is to transfer a
|
|
* recurring block of data over a known time window.
|
|
*
|
|
* IB_THROUGHPUTBW and AB_THROUGHPUTBW:
|
|
* These are used for CPU style masters. Here the requirement
|
|
* is to have minimum throughput bandwidth available to avoid
|
|
* stalling.
|
|
*/
|
|
#define IB_RECURRBLOCK(Ws, Bs) ((Ws) == 0 ? 0 : ((Bs)/(Ws)))
|
|
#define AB_RECURRBLOCK(Ws, Per) ((Ws) == 0 ? 0 : ((Bs)/(Per)))
|
|
#define IB_THROUGHPUTBW(Tb) (Tb)
|
|
#define AB_THROUGHPUTBW(Tb, R) ((Tb) * (R))
|
|
|
|
struct msm_bus_vectors {
|
|
int src; /* Master */
|
|
int dst; /* Slave */
|
|
unsigned int ab; /* Arbitrated bandwidth */
|
|
unsigned int ib; /* Instantaneous bandwidth */
|
|
};
|
|
|
|
struct msm_bus_paths {
|
|
int num_paths;
|
|
struct msm_bus_vectors *vectors;
|
|
};
|
|
|
|
struct msm_bus_scale_pdata {
|
|
struct msm_bus_paths *usecase;
|
|
int num_usecases;
|
|
const char *name;
|
|
/*
|
|
* If the active_only flag is set to 1, the BW request is applied
|
|
* only when at least one CPU is active (powered on). If the flag
|
|
* is set to 0, then the BW request is always applied irrespective
|
|
* of the CPU state.
|
|
*/
|
|
unsigned int active_only;
|
|
};
|
|
|
|
/* Scaling APIs */
|
|
|
|
/*
|
|
* This function returns a handle to the client. This should be used to
|
|
* call msm_bus_scale_client_update_request.
|
|
* The function returns 0 if bus driver is unable to register a client
|
|
*/
|
|
|
|
#ifdef CONFIG_MSM_BUS_SCALING
|
|
uint32_t msm_bus_scale_register_client(struct msm_bus_scale_pdata *pdata);
|
|
int msm_bus_scale_client_update_request(uint32_t cl, unsigned int index);
|
|
void msm_bus_scale_unregister_client(uint32_t cl);
|
|
/* AXI Port configuration APIs */
|
|
int msm_bus_axi_porthalt(int master_port);
|
|
int msm_bus_axi_portunhalt(int master_port);
|
|
|
|
#else
|
|
static inline uint32_t
|
|
msm_bus_scale_register_client(struct msm_bus_scale_pdata *pdata)
|
|
{
|
|
return 1;
|
|
}
|
|
|
|
static inline int
|
|
msm_bus_scale_client_update_request(uint32_t cl, unsigned int index)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline void
|
|
msm_bus_scale_unregister_client(uint32_t cl)
|
|
{
|
|
}
|
|
|
|
static inline int msm_bus_axi_porthalt(int master_port)
|
|
{
|
|
return 0;
|
|
}
|
|
|
|
static inline int msm_bus_axi_portunhalt(int master_port)
|
|
{
|
|
return 0;
|
|
}
|
|
#endif
|
|
|
|
#endif /*_ARCH_ARM_MACH_MSM_BUS_H*/
|