Lines Matching refs:ocmem

23 #include <soc/qcom/ocmem.h>
52 struct ocmem {
108 static inline void ocmem_write(struct ocmem *ocmem, u32 reg, u32 data)
110 writel(data, ocmem->mmio + reg);
113 static inline u32 ocmem_read(struct ocmem *ocmem, u32 reg)
115 return readl(ocmem->mmio + reg);
118 static void update_ocmem(struct ocmem *ocmem)
124 for (i = 0; i < ocmem->config->num_regions; i++) {
125 struct ocmem_region *region = &ocmem->regions[i];
131 dev_dbg(ocmem->dev, "ocmem_region_mode_control %x\n",
133 ocmem_write(ocmem, OCMEM_REG_REGION_MODE_CTL, region_mode_ctrl);
136 for (i = 0; i < ocmem->config->num_regions; i++) {
137 struct ocmem_region *region = &ocmem->regions[i];
145 ocmem_write(ocmem, OCMEM_REG_PSGSC_CTL(i), data);
149 static unsigned long phys_to_offset(struct ocmem *ocmem,
152 if (addr < ocmem->memory->start || addr >= ocmem->memory->end)
155 return addr - ocmem->memory->start;
158 static unsigned long device_address(struct ocmem *ocmem,
165 return phys_to_offset(ocmem, addr);
168 static void update_range(struct ocmem *ocmem, struct ocmem_buf *buf,
174 for (i = 0; i < ocmem->config->num_regions; i++) {
175 struct ocmem_region *region = &ocmem->regions[i];
189 update_ocmem(ocmem);
192 struct ocmem *of_get_ocmem(struct device *dev)
196 struct ocmem *ocmem;
213 ocmem = platform_get_drvdata(pdev);
214 if (!ocmem) {
215 dev_err(dev, "Cannot get ocmem\n");
219 return ocmem;
223 struct ocmem_buf *ocmem_allocate(struct ocmem *ocmem, enum ocmem_client client,
236 if (test_and_set_bit_lock(BIT(client), &ocmem->active_allocations))
246 buf->addr = device_address(ocmem, client, buf->offset);
249 update_range(ocmem, buf, CORE_ON, WIDE_MODE);
255 dev_err(ocmem->dev, "could not lock: %d\n", ret);
260 ocmem_write(ocmem, OCMEM_REG_GFX_MPU_START, buf->offset);
261 ocmem_write(ocmem, OCMEM_REG_GFX_MPU_END,
265 dev_dbg(ocmem->dev, "using %ldK of OCMEM at 0x%08lx for client %d\n",
273 clear_bit_unlock(BIT(client), &ocmem->active_allocations);
279 void ocmem_free(struct ocmem *ocmem, enum ocmem_client client,
286 update_range(ocmem, buf, CLK_OFF, MODE_DEFAULT);
294 dev_err(ocmem->dev, "could not unlock: %d\n", ret);
296 ocmem_write(ocmem, OCMEM_REG_GFX_MPU_START, 0x0);
297 ocmem_write(ocmem, OCMEM_REG_GFX_MPU_END, 0x0);
302 clear_bit_unlock(BIT(client), &ocmem->active_allocations);
312 struct ocmem *ocmem;
317 ocmem = devm_kzalloc(dev, sizeof(*ocmem), GFP_KERNEL);
318 if (!ocmem)
321 ocmem->dev = dev;
322 ocmem->config = device_get_match_data(dev);
333 ocmem->mmio = devm_ioremap_resource(&pdev->dev, res);
334 if (IS_ERR(ocmem->mmio)) {
336 return PTR_ERR(ocmem->mmio);
339 ocmem->memory = platform_get_resource_byname(pdev, IORESOURCE_MEM,
341 if (!ocmem->memory) {
351 dev_info(ocmem->dev, "Failed to enable clocks\n");
364 reg = ocmem_read(ocmem, OCMEM_REG_HW_VERSION);
370 reg = ocmem_read(ocmem, OCMEM_REG_HW_PROFILE);
371 ocmem->num_ports = OCMEM_HW_PROFILE_NUM_PORTS(reg);
372 ocmem->num_macros = OCMEM_HW_PROFILE_NUM_MACROS(reg);
373 ocmem->interleaved = !!(reg & OCMEM_HW_PROFILE_INTERLEAVING);
375 num_banks = ocmem->num_ports / 2;
376 region_size = ocmem->config->macro_size * num_banks;
379 ocmem->num_ports, ocmem->config->num_regions,
380 ocmem->num_macros, ocmem->interleaved ? "" : "not ");
382 ocmem->regions = devm_kcalloc(dev, ocmem->config->num_regions,
384 if (!ocmem->regions) {
389 for (i = 0; i < ocmem->config->num_regions; i++) {
390 struct ocmem_region *region = &ocmem->regions[i];
400 if (i == (ocmem->config->num_regions - 1) &&
402 region->macro_size = ocmem->config->macro_size / 2;
405 region->macro_size = ocmem->config->macro_size;
413 platform_set_drvdata(pdev, ocmem);
435 { .compatible = "qcom,msm8974-ocmem", .data = &ocmem_8974_config },
445 .name = "ocmem",