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*/
 |