blob: a4adfb8270e6634e2f9fe76734de18b4f53fb122 [file] [log] [blame]
Duy Truong790f06d2013-02-13 16:38:12 -08001/* Copyright (c) 2012, The Linux Foundation. All rights reserved.
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -07002 *
3 * This program is free software; you can redistribute it and/or modify
4 * it under the terms of the GNU General Public License version 2 and
5 * only version 2 as published by the Free Software Foundation.
6 *
7 * This program is distributed in the hope that it will be useful,
8 * but WITHOUT ANY WARRANTY; without even the implied warranty of
9 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
10 * GNU General Public License for more details.
11 */
12
Naveen Ramaraj6a92b262012-07-30 17:36:24 -070013#ifndef _ARCH_ARM_MACH_MSM_OCMEM_PRIV_H
14#define _ARCH_ARM_MACH_MSM_OCMEM_PRIV_H
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -070015
16/** All interfaces in this header should only be used by OCMEM driver
17 * Client drivers should use wrappers available in ocmem.h
18 **/
Naveen Ramarajcc4ec152012-05-14 09:55:29 -070019#include <linux/platform_device.h>
Naveen Ramarajbea2d5d2012-08-15 17:26:43 -070020#include <linux/clk.h>
Naveen Ramaraj99b07562012-05-28 20:57:09 -070021#include <asm/io.h>
22#include <mach/msm_iomap.h>
23#include "ocmem.h"
24
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -070025
26#define OCMEM_PHYS_BASE 0xFEC00000
27#define OCMEM_PHYS_SIZE 0x180000
28
Naveen Ramarajcc4ec152012-05-14 09:55:29 -070029#define TO_OCMEM 0x0
30#define TO_DDR 0x1
Naveen Ramarajb9da05782012-05-07 09:07:35 -070031
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -070032struct ocmem_zone;
33
34struct ocmem_zone_ops {
35 unsigned long (*allocate) (struct ocmem_zone *, unsigned long);
36 int (*free) (struct ocmem_zone *, unsigned long, unsigned long);
37};
38
Naveen Ramaraj6a92b262012-07-30 17:36:24 -070039/* OCMEM Zone specific counters */
40/* Must be in sync with zstat_names */
41enum ocmem_zstat_item {
42 NR_REQUESTS = 0x0,
43 NR_SYNC_ALLOCATIONS,
44 NR_RANGE_ALLOCATIONS,
45 NR_ASYNC_ALLOCATIONS,
46 NR_ALLOCATION_FAILS,
47 NR_GROWTHS,
48 NR_FREES,
49 NR_SHRINKS,
50 NR_MAPS,
51 NR_MAP_FAILS,
52 NR_UNMAPS,
53 NR_UNMAP_FAILS,
54 NR_TRANSFERS_TO_OCMEM,
55 NR_TRANSFERS_TO_DDR,
56 NR_TRANSFER_FAILS,
57 NR_EVICTIONS,
58 NR_RESTORES,
Naveen Ramaraj55ed8902012-09-26 13:18:06 -070059 NR_DUMP_REQUESTS,
60 NR_DUMP_COMPLETE,
Naveen Ramaraj6a92b262012-07-30 17:36:24 -070061 NR_OCMEM_ZSTAT_ITEMS,
62};
63
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -070064struct ocmem_zone {
Naveen Ramaraj4d5e3542012-08-12 21:55:49 -070065 bool active;
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -070066 int owner;
67 int active_regions;
68 int max_regions;
Naveen Ramarajcc4ec152012-05-14 09:55:29 -070069 struct list_head req_list;
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -070070 unsigned long z_start;
71 unsigned long z_end;
72 unsigned long z_head;
73 unsigned long z_tail;
74 unsigned long z_free;
Naveen Ramaraj6a92b262012-07-30 17:36:24 -070075 atomic_long_t z_stat[NR_OCMEM_ZSTAT_ITEMS];
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -070076 struct gen_pool *z_pool;
77 struct ocmem_zone_ops *z_ops;
78};
79
Naveen Ramarajb9da05782012-05-07 09:07:35 -070080enum op_code {
81 SCHED_NOP = 0x0,
82 SCHED_ALLOCATE,
83 SCHED_FREE,
84 SCHED_GROW,
85 SCHED_SHRINK,
86 SCHED_MAP,
87 SCHED_UNMAP,
88 SCHED_EVICT,
89 SCHED_RESTORE,
90 SCHED_DUMP,
91};
92
Naveen Ramaraj99b07562012-05-28 20:57:09 -070093/* Operational modes of each region */
94enum region_mode {
Naveen Ramaraje43d9bb2012-08-20 14:41:13 -070095 MODE_NOT_SET = 0x0,
96 WIDE_MODE,
Naveen Ramaraj99b07562012-05-28 20:57:09 -070097 THIN_MODE,
Naveen Ramaraje43d9bb2012-08-20 14:41:13 -070098 MODE_DEFAULT = MODE_NOT_SET,
Naveen Ramaraj99b07562012-05-28 20:57:09 -070099};
100
Naveen Ramaraj8ad63602012-05-09 20:50:39 -0700101struct ocmem_plat_data {
102 void __iomem *vbase;
103 unsigned long size;
104 unsigned long base;
Naveen Ramarajbea2d5d2012-08-15 17:26:43 -0700105 struct clk *core_clk;
106 struct clk *iface_clk;
Naveen Ramaraj5da54542012-08-21 13:26:17 -0700107 struct clk *br_clk;
Naveen Ramaraj8ad63602012-05-09 20:50:39 -0700108 struct ocmem_partition *parts;
109 int nr_parts;
110 void __iomem *reg_base;
111 void __iomem *br_base;
112 void __iomem *dm_base;
Naveen Ramaraj6a92b262012-07-30 17:36:24 -0700113 struct dentry *debug_node;
Naveen Ramaraj8ad63602012-05-09 20:50:39 -0700114 unsigned nr_regions;
115 unsigned nr_macros;
116 unsigned nr_ports;
117 int ocmem_irq;
118 int dm_irq;
119 bool interleaved;
Naveen Ramaraj99b07562012-05-28 20:57:09 -0700120 bool rpm_pwr_ctrl;
121 unsigned rpm_rsc_type;
Naveen Ramaraj8ad63602012-05-09 20:50:39 -0700122};
123
Naveen Ramarajcc4ec152012-05-14 09:55:29 -0700124struct ocmem_eviction_data {
125 struct completion completion;
126 struct list_head victim_list;
127 struct list_head req_list;
128 struct work_struct work;
129 int prio;
Naveen Ramaraj0cd880a2012-10-16 17:38:06 -0700130 atomic_t pending;
Naveen Ramarajcc4ec152012-05-14 09:55:29 -0700131 bool passive;
132};
133
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -0700134struct ocmem_req {
135 struct rw_semaphore rw_sem;
136 /* Chain in sched queue */
137 struct list_head sched_list;
138 /* Chain in zone list */
139 struct list_head zone_list;
Naveen Ramarajcc4ec152012-05-14 09:55:29 -0700140 /* Chain in eviction list */
141 struct list_head eviction_list;
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -0700142 int owner;
143 int prio;
144 uint32_t req_id;
145 unsigned long req_min;
146 unsigned long req_max;
147 unsigned long req_step;
148 /* reverse pointers */
149 struct ocmem_zone *zone;
150 struct ocmem_buf *buffer;
Naveen Ramarajb9da05782012-05-07 09:07:35 -0700151 struct ocmem_map_list *mlist;
152 enum op_code op;
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -0700153 unsigned long state;
154 /* Request assignments */
155 unsigned long req_start;
156 unsigned long req_end;
157 unsigned long req_sz;
Naveen Ramaraj99b07562012-05-28 20:57:09 -0700158 /* Request Power State */
159 unsigned power_state;
Naveen Ramarajcc4ec152012-05-14 09:55:29 -0700160 struct ocmem_eviction_data *edata;
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -0700161};
162
163struct ocmem_handle {
164 struct ocmem_buf buffer;
165 struct mutex handle_mutex;
166 struct ocmem_req *req;
167};
168
Naveen Ramaraj3b6c5a92012-08-19 18:50:44 -0700169struct ocmem_buf *handle_to_buffer(struct ocmem_handle *);
170struct ocmem_handle *buffer_to_handle(struct ocmem_buf *);
171struct ocmem_req *handle_to_req(struct ocmem_handle *);
172struct ocmem_handle *req_to_handle(struct ocmem_req *);
173int ocmem_read(void *);
174int ocmem_write(unsigned long, void *);
Naveen Ramaraj6a92b262012-07-30 17:36:24 -0700175void inc_ocmem_stat(struct ocmem_zone *, enum ocmem_zstat_item);
176unsigned long get_ocmem_stat(struct ocmem_zone *z,
177 enum ocmem_zstat_item item);
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -0700178struct ocmem_zone *get_zone(unsigned);
Naveen Ramaraj4d5e3542012-08-12 21:55:49 -0700179int zone_active(int);
Naveen Ramarajb9da05782012-05-07 09:07:35 -0700180unsigned long offset_to_phys(unsigned long);
181unsigned long phys_to_offset(unsigned long);
Naveen Ramaraj959d37f2012-04-23 11:59:01 -0700182unsigned long allocate_head(struct ocmem_zone *, unsigned long);
183int free_head(struct ocmem_zone *, unsigned long, unsigned long);
Naveen Ramaraj135cd672012-04-23 12:13:28 -0700184unsigned long allocate_tail(struct ocmem_zone *, unsigned long);
185int free_tail(struct ocmem_zone *, unsigned long, unsigned long);
Naveen Ramarajbdf4dfe2012-04-23 14:09:50 -0700186
187int ocmem_notifier_init(void);
188int check_notifier(int);
Naveen Ramarajcc4ec152012-05-14 09:55:29 -0700189const char *get_name(int);
190int check_id(int);
Naveen Ramarajbdf4dfe2012-04-23 14:09:50 -0700191int dispatch_notification(int, enum ocmem_notif_type, struct ocmem_buf *);
Naveen Ramarajb9da05782012-05-07 09:07:35 -0700192
Naveen Ramaraj6a92b262012-07-30 17:36:24 -0700193int ocmem_sched_init(struct platform_device *);
Naveen Ramarajcc4ec152012-05-14 09:55:29 -0700194int ocmem_rdm_init(struct platform_device *);
Naveen Ramaraj99b07562012-05-28 20:57:09 -0700195int ocmem_core_init(struct platform_device *);
Naveen Ramarajb9da05782012-05-07 09:07:35 -0700196int process_allocate(int, struct ocmem_handle *, unsigned long, unsigned long,
197 unsigned long, bool, bool);
198int process_free(int, struct ocmem_handle *);
Naveen Ramarajcc4ec152012-05-14 09:55:29 -0700199int process_xfer(int, struct ocmem_handle *, struct ocmem_map_list *, int);
200int process_evict(int);
201int process_restore(int);
202int process_shrink(int, struct ocmem_handle *, unsigned long);
Naveen Ramaraj55ed8902012-09-26 13:18:06 -0700203int process_dump(int, struct ocmem_handle *, unsigned long);
Naveen Ramarajcc4ec152012-05-14 09:55:29 -0700204int ocmem_rdm_transfer(int, struct ocmem_map_list *,
205 unsigned long, int);
Naveen Ramaraje43d9bb2012-08-20 14:41:13 -0700206int ocmem_clear(unsigned long, unsigned long);
Naveen Ramarajb9da05782012-05-07 09:07:35 -0700207unsigned long process_quota(int);
Naveen Ramaraj99b07562012-05-28 20:57:09 -0700208int ocmem_memory_off(int, unsigned long, unsigned long);
209int ocmem_memory_on(int, unsigned long, unsigned long);
Naveen Ramarajbea2d5d2012-08-15 17:26:43 -0700210int ocmem_enable_core_clock(void);
211int ocmem_enable_iface_clock(void);
Naveen Ramaraj5da54542012-08-21 13:26:17 -0700212int ocmem_enable_br_clock(void);
Naveen Ramarajbea2d5d2012-08-15 17:26:43 -0700213void ocmem_disable_core_clock(void);
214void ocmem_disable_iface_clock(void);
Naveen Ramaraj5da54542012-08-21 13:26:17 -0700215void ocmem_disable_br_clock(void);
Naveen Ramaraje43d9bb2012-08-20 14:41:13 -0700216int ocmem_lock(enum ocmem_client, unsigned long, unsigned long,
217 enum region_mode);
218int ocmem_unlock(enum ocmem_client, unsigned long, unsigned long);
Naveen Ramaraj51f5e8b2012-04-09 15:58:40 -0700219#endif