* [PATCH v9 1/5] genalloc:support memory-allocation with bytes-alignment to genalloc
@ 2015-09-14 1:38 Zhao Qiang
2015-09-14 1:38 ` [PATCH v9 2/5] genalloc:support allocating specific region Zhao Qiang
` (3 more replies)
0 siblings, 4 replies; 11+ messages in thread
From: Zhao Qiang @ 2015-09-14 1:38 UTC (permalink / raw
To: scottwood
Cc: linux-kernel, linuxppc-dev, lauraa, X.xie, benh, leoli, paulus,
Zhao Qiang
Bytes alignment is required to manage some special RAM,
so add gen_pool_first_fit_align to genalloc,
meanwhile add gen_pool_alloc_data to pass data to
gen_pool_first_fit_align(modify gen_pool_alloc as a wrapper)
Signed-off-by: Zhao Qiang <qiang.zhao@freescale.com>
---
Changes for v6:
- patches set v6 include a new patch because of using
- genalloc to manage QE MURAM, patch 0001 is the new
- patch, adding bytes alignment for allocation for use.
Changes for v7:
- cpm muram also need to use genalloc to manage, it has
a function to reserve a specific region of muram,
add offset to genpool_data for start addr to be allocated.
Changes for v8:
- remove supporting reserving a specific region from this patch
add a new patch to support it.
Changes for v9:
- Nil
include/linux/genalloc.h | 24 ++++++++++++++++----
lib/genalloc.c | 58 +++++++++++++++++++++++++++++++++++++++++++-----
2 files changed, 73 insertions(+), 9 deletions(-)
diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h
index 1ccaab4..aaf3dc2 100644
--- a/include/linux/genalloc.h
+++ b/include/linux/genalloc.h
@@ -30,10 +30,12 @@
#ifndef __GENALLOC_H__
#define __GENALLOC_H__
+#include <linux/types.h>
#include <linux/spinlock_types.h>
struct device;
struct device_node;
+struct gen_pool;
/**
* Allocation callback function type definition
@@ -47,7 +49,7 @@ typedef unsigned long (*genpool_algo_t)(unsigned long *map,
unsigned long size,
unsigned long start,
unsigned int nr,
- void *data);
+ void *data, struct gen_pool *pool);
/*
* General purpose special memory pool descriptor.
@@ -73,6 +75,13 @@ struct gen_pool_chunk {
unsigned long bits[0]; /* bitmap for allocating memory chunk */
};
+/*
+ * gen_pool data descriptor for gen_pool_first_fit_align.
+ */
+struct genpool_data_align {
+ int align; /* alignment by bytes for starting address */
+};
+
extern struct gen_pool *gen_pool_create(int, int);
extern phys_addr_t gen_pool_virt_to_phys(struct gen_pool *pool, unsigned long);
extern int gen_pool_add_virt(struct gen_pool *, unsigned long, phys_addr_t,
@@ -96,6 +105,7 @@ static inline int gen_pool_add(struct gen_pool *pool, unsigned long addr,
}
extern void gen_pool_destroy(struct gen_pool *);
extern unsigned long gen_pool_alloc(struct gen_pool *, size_t);
+extern unsigned long gen_pool_alloc_data(struct gen_pool *, size_t, void *data);
extern void *gen_pool_dma_alloc(struct gen_pool *pool, size_t size,
dma_addr_t *dma);
extern void gen_pool_free(struct gen_pool *, unsigned long, size_t);
@@ -108,14 +118,20 @@ extern void gen_pool_set_algo(struct gen_pool *pool, genpool_algo_t algo,
void *data);
extern unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,
- unsigned long start, unsigned int nr, void *data);
+ unsigned long start, unsigned int nr, void *data,
+ struct gen_pool *pool);
+
+extern unsigned long gen_pool_first_fit_align(unsigned long *map,
+ unsigned long size, unsigned long start, unsigned int nr,
+ void *data, struct gen_pool *pool);
extern unsigned long gen_pool_first_fit_order_align(unsigned long *map,
unsigned long size, unsigned long start, unsigned int nr,
- void *data);
+ void *data, struct gen_pool *pool);
extern unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size,
- unsigned long start, unsigned int nr, void *data);
+ unsigned long start, unsigned int nr, void *data,
+ struct gen_pool *pool);
extern struct gen_pool *devm_gen_pool_create(struct device *dev,
int min_alloc_order, int nid);
diff --git a/lib/genalloc.c b/lib/genalloc.c
index d214866..b8762b1 100644
--- a/lib/genalloc.c
+++ b/lib/genalloc.c
@@ -269,6 +269,24 @@ EXPORT_SYMBOL(gen_pool_destroy);
*/
unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size)
{
+ return gen_pool_alloc_data(pool, size, pool->data);
+}
+EXPORT_SYMBOL(gen_pool_alloc);
+
+/**
+ * gen_pool_alloc_data - allocate special memory from the pool
+ * @pool: pool to allocate from
+ * @size: number of bytes to allocate from the pool
+ * @data: data passed to algorithm
+ *
+ * Allocate the requested number of bytes from the specified pool.
+ * Uses the pool allocation function (with first-fit algorithm by default).
+ * Can not be used in NMI handler on architectures without
+ * NMI-safe cmpxchg implementation.
+ */
+unsigned long gen_pool_alloc_data(struct gen_pool *pool, size_t size,
+ void *data)
+{
struct gen_pool_chunk *chunk;
unsigned long addr = 0;
int order = pool->min_alloc_order;
@@ -290,7 +308,7 @@ unsigned long gen_pool_alloc(struct gen_pool *pool, size_t size)
end_bit = chunk_size(chunk) >> order;
retry:
start_bit = pool->algo(chunk->bits, end_bit, start_bit, nbits,
- pool->data);
+ data, pool);
if (start_bit >= end_bit)
continue;
remain = bitmap_set_ll(chunk->bits, start_bit, nbits);
@@ -309,7 +327,7 @@ retry:
rcu_read_unlock();
return addr;
}
-EXPORT_SYMBOL(gen_pool_alloc);
+EXPORT_SYMBOL(gen_pool_alloc_data);
/**
* gen_pool_dma_alloc - allocate special memory from the pool for DMA usage
@@ -500,15 +518,42 @@ EXPORT_SYMBOL(gen_pool_set_algo);
* @start: The bitnumber to start searching at
* @nr: The number of zeroed bits we're looking for
* @data: additional data - unused
+ * @pool: pool to find the fit region memory from
*/
unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,
- unsigned long start, unsigned int nr, void *data)
+ unsigned long start, unsigned int nr, void *data,
+ struct gen_pool *pool)
{
return bitmap_find_next_zero_area(map, size, start, nr, 0);
}
EXPORT_SYMBOL(gen_pool_first_fit);
/**
+ * gen_pool_first_fit_align - find the first available region
+ * of memory matching the size requirement (alignment constraint)
+ * @map: The address to base the search on
+ * @size: The bitmap size in bits
+ * @start: The bitnumber to start searching at
+ * @nr: The number of zeroed bits we're looking for
+ * @data: data for alignment
+ * @pool: pool to get order from
+ */
+unsigned long gen_pool_first_fit_align(unsigned long *map, unsigned long size,
+ unsigned long start, unsigned int nr, void *data,
+ struct gen_pool *pool)
+{
+ struct genpool_data_align *alignment;
+ unsigned long align_mask;
+ int order;
+
+ alignment = data;
+ order = pool->min_alloc_order;
+ align_mask = ((alignment->align + (1UL << order) - 1) >> order) - 1;
+ return bitmap_find_next_zero_area(map, size, start, nr, align_mask);
+}
+EXPORT_SYMBOL(gen_pool_first_fit_align);
+
+/**
* gen_pool_first_fit_order_align - find the first available region
* of memory matching the size requirement. The region will be aligned
* to the order of the size specified.
@@ -517,10 +562,11 @@ EXPORT_SYMBOL(gen_pool_first_fit);
* @start: The bitnumber to start searching at
* @nr: The number of zeroed bits we're looking for
* @data: additional data - unused
+ * @pool: pool to find the fit region memory from
*/
unsigned long gen_pool_first_fit_order_align(unsigned long *map,
unsigned long size, unsigned long start,
- unsigned int nr, void *data)
+ unsigned int nr, void *data, struct gen_pool *pool)
{
unsigned long align_mask = roundup_pow_of_two(nr) - 1;
@@ -536,12 +582,14 @@ EXPORT_SYMBOL(gen_pool_first_fit_order_align);
* @start: The bitnumber to start searching at
* @nr: The number of zeroed bits we're looking for
* @data: additional data - unused
+ * @pool: pool to find the fit region memory from
*
* Iterate over the bitmap to find the smallest free region
* which we can allocate the memory.
*/
unsigned long gen_pool_best_fit(unsigned long *map, unsigned long size,
- unsigned long start, unsigned int nr, void *data)
+ unsigned long start, unsigned int nr, void *data,
+ struct gen_pool *pool)
{
unsigned long start_bit = size;
unsigned long len = size + 1;
--
2.1.0.27.g96db324
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v9 2/5] genalloc:support allocating specific region
2015-09-14 1:38 [PATCH v9 1/5] genalloc:support memory-allocation with bytes-alignment to genalloc Zhao Qiang
@ 2015-09-14 1:38 ` Zhao Qiang
2015-09-17 20:19 ` Scott Wood
2015-09-14 1:38 ` [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram Zhao Qiang
` (2 subsequent siblings)
3 siblings, 1 reply; 11+ messages in thread
From: Zhao Qiang @ 2015-09-14 1:38 UTC (permalink / raw
To: scottwood
Cc: linux-kernel, linuxppc-dev, lauraa, X.xie, benh, leoli, paulus,
Zhao Qiang
Add new algo for genalloc, it reserve a specific region of
memory matching the size requirement (no alignment constraint)
Signed-off-by: Zhao Qiang <qiang.zhao@freescale.com>
---
Changes for v9:
- reserve a specific region, if the return region
- is not during the specific region, return fail.
include/linux/genalloc.h | 11 +++++++++++
lib/genalloc.c | 30 ++++++++++++++++++++++++++++++
2 files changed, 41 insertions(+)
diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h
index aaf3dc2..85e3b2f 100644
--- a/include/linux/genalloc.h
+++ b/include/linux/genalloc.h
@@ -82,6 +82,13 @@ struct genpool_data_align {
int align; /* alignment by bytes for starting address */
};
+/*
+ * gen_pool data descriptor for gen_pool_fixed_fit.
+ */
+struct genpool_data_fixed {
+ unsigned long offset; /* The offset of the specific region */
+};
+
extern struct gen_pool *gen_pool_create(int, int);
extern phys_addr_t gen_pool_virt_to_phys(struct gen_pool *pool, unsigned long);
extern int gen_pool_add_virt(struct gen_pool *, unsigned long, phys_addr_t,
@@ -121,6 +128,10 @@ extern unsigned long gen_pool_first_fit(unsigned long *map, unsigned long size,
unsigned long start, unsigned int nr, void *data,
struct gen_pool *pool);
+extern unsigned long gen_pool_fixed_fit(unsigned long *map,
+ unsigned long size, unsigned long start, unsigned int nr,
+ void *data, struct gen_pool *pool);
+
extern unsigned long gen_pool_first_fit_align(unsigned long *map,
unsigned long size, unsigned long start, unsigned int nr,
void *data, struct gen_pool *pool);
diff --git a/lib/genalloc.c b/lib/genalloc.c
index b8762b1..87a045e 100644
--- a/lib/genalloc.c
+++ b/lib/genalloc.c
@@ -554,6 +554,36 @@ unsigned long gen_pool_first_fit_align(unsigned long *map, unsigned long size,
EXPORT_SYMBOL(gen_pool_first_fit_align);
/**
+ * gen_pool_fixed_fit - reserve a specific region of
+ * matching the size requirement (no alignment constraint)
+ * @map: The address to base the search on
+ * @size: The bitmap size in bits
+ * @start: The bitnumber to start searching at
+ * @nr: The number of zeroed bits we're looking for
+ * @data: data for alignment
+ * @pool: pool to get order from
+ */
+unsigned long gen_pool_fixed_fit(unsigned long *map, unsigned long size,
+ unsigned long start, unsigned int nr, void *data,
+ struct gen_pool *pool)
+{
+ struct genpool_data_fixed *fixed_data;
+ int order;
+ unsigned long offset_bit;
+ unsigned long start_bit;
+
+ fixed_data = data;
+ order = pool->min_alloc_order;
+ offset_bit = fixed_data->offset >> order;
+ start_bit = bitmap_find_next_zero_area(map, size,
+ start + offset_bit, nr, 0);
+ if (start_bit != offset_bit)
+ start_bit = size;
+ return start_bit;
+}
+EXPORT_SYMBOL(gen_pool_fixed_fit);
+
+/**
* gen_pool_first_fit_order_align - find the first available region
* of memory matching the size requirement. The region will be aligned
* to the order of the size specified.
--
2.1.0.27.g96db324
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram
2015-09-14 1:38 [PATCH v9 1/5] genalloc:support memory-allocation with bytes-alignment to genalloc Zhao Qiang
2015-09-14 1:38 ` [PATCH v9 2/5] genalloc:support allocating specific region Zhao Qiang
@ 2015-09-14 1:38 ` Zhao Qiang
2015-09-17 20:28 ` Scott Wood
2015-09-14 1:38 ` [PATCH v9 4/5] CPM: modify cpm_muram_* functions Zhao Qiang
2015-09-14 1:38 ` [PATCH v9 5/5] QE: Move QE from arch/powerpc to drivers/soc Zhao Qiang
3 siblings, 1 reply; 11+ messages in thread
From: Zhao Qiang @ 2015-09-14 1:38 UTC (permalink / raw
To: scottwood
Cc: linux-kernel, linuxppc-dev, lauraa, X.xie, benh, leoli, paulus,
Zhao Qiang
muram is used for qe, add qe_muram_ functions to manage
muram.
Signed-off-by: Zhao Qiang <qiang.zhao@freescale.com>
---
Changes for v2:
- no changes
Changes for v3:
- no changes
Changes for v4:
- no changes
Changes for v5:
- no changes
Changes for v6:
- using genalloc instead rheap to manage QE MURAM
- remove qe_reset from platform file, using
- subsys_initcall to call qe_init function.
Changes for v7:
- move this patch from 3/3 to 2/3
- convert cpm with genalloc
- check for gen_pool allocation failure
Changes for v8:
- rebase
- move BD_SC_* macro instead of copy
Changes for v9:
- doesn't modify CPM, add a new patch to modify.
- rebase
arch/powerpc/include/asm/qe.h | 43 +++++-
arch/powerpc/platforms/83xx/km83xx.c | 2 -
arch/powerpc/platforms/83xx/mpc832x_mds.c | 2 -
arch/powerpc/platforms/83xx/mpc832x_rdb.c | 2 -
arch/powerpc/platforms/83xx/mpc836x_mds.c | 2 -
arch/powerpc/platforms/83xx/mpc836x_rdk.c | 3 -
arch/powerpc/platforms/85xx/common.c | 1 -
arch/powerpc/platforms/Kconfig | 1 +
arch/powerpc/sysdev/qe_lib/Makefile | 2 +-
arch/powerpc/sysdev/qe_lib/qe.c | 15 ++
arch/powerpc/sysdev/qe_lib/qe_common.c | 242 ++++++++++++++++++++++++++++++
11 files changed, 294 insertions(+), 21 deletions(-)
create mode 100644 arch/powerpc/sysdev/qe_lib/qe_common.c
diff --git a/arch/powerpc/include/asm/qe.h b/arch/powerpc/include/asm/qe.h
index 32b9bfa..3af9033 100644
--- a/arch/powerpc/include/asm/qe.h
+++ b/arch/powerpc/include/asm/qe.h
@@ -16,10 +16,13 @@
#define _ASM_POWERPC_QE_H
#ifdef __KERNEL__
+#include <linux/compiler.h>
#include <linux/spinlock.h>
#include <linux/errno.h>
#include <linux/err.h>
-#include <asm/cpm.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/types.h>
#include <asm/immap_qe.h>
#define QE_NUM_OF_SNUM 256 /* There are 256 serial number in QE */
@@ -186,13 +189,16 @@ static inline int qe_alive_during_sleep(void)
#endif
}
-/* we actually use cpm_muram implementation, define this for convenience */
-#define qe_muram_init cpm_muram_init
-#define qe_muram_alloc cpm_muram_alloc
-#define qe_muram_alloc_fixed cpm_muram_alloc_fixed
-#define qe_muram_free cpm_muram_free
-#define qe_muram_addr cpm_muram_addr
-#define qe_muram_offset cpm_muram_offset
+int qe_muram_init(void);
+
+#if defined(CONFIG_QUICC_ENGINE)
+unsigned long qe_muram_alloc(unsigned long size, unsigned long align);
+unsigned long qe_muram_alloc_fixed(unsigned long offset, unsigned long size);
+int qe_muram_free(unsigned long offset);
+void __iomem *qe_muram_addr(unsigned long offset);
+unsigned long qe_muram_offset(void __iomem *addr);
+dma_addr_t qe_muram_dma(void __iomem *addr);
+#endif /* defined(CONFIG_QUICC_ENGINE) */
/* Structure that defines QE firmware binary files.
*
@@ -266,6 +272,27 @@ struct qe_bd {
#define BD_STATUS_MASK 0xffff0000
#define BD_LENGTH_MASK 0x0000ffff
+/* Buffer descriptor control/status used by serial
+ */
+
+#define BD_SC_EMPTY (0x8000) /* Receive is empty */
+#define BD_SC_READY (0x8000) /* Transmit is ready */
+#define BD_SC_WRAP (0x2000) /* Last buffer descriptor */
+#define BD_SC_INTRPT (0x1000) /* Interrupt on change */
+#define BD_SC_LAST (0x0800) /* Last buffer in frame */
+#define BD_SC_TC (0x0400) /* Transmit CRC */
+#define BD_SC_CM (0x0200) /* Continuous mode */
+#define BD_SC_ID (0x0100) /* Rec'd too many idles */
+#define BD_SC_P (0x0100) /* xmt preamble */
+#define BD_SC_BR (0x0020) /* Break received */
+#define BD_SC_FR (0x0010) /* Framing error */
+#define BD_SC_PR (0x0008) /* Parity error */
+#define BD_SC_NAK (0x0004) /* NAK - did not respond */
+#define BD_SC_OV (0x0002) /* Overrun */
+#define BD_SC_UN (0x0002) /* Underrun */
+#define BD_SC_CD (0x0001) /* */
+#define BD_SC_CL (0x0001) /* Collision */
+
/* Alignment */
#define QE_INTR_TABLE_ALIGN 16 /* ??? */
#define QE_ALIGNMENT_OF_BD 8
diff --git a/arch/powerpc/platforms/83xx/km83xx.c b/arch/powerpc/platforms/83xx/km83xx.c
index bf4c447..ae111581 100644
--- a/arch/powerpc/platforms/83xx/km83xx.c
+++ b/arch/powerpc/platforms/83xx/km83xx.c
@@ -136,8 +136,6 @@ static void __init mpc83xx_km_setup_arch(void)
mpc83xx_setup_pci();
#ifdef CONFIG_QUICC_ENGINE
- qe_reset();
-
np = of_find_node_by_name(NULL, "par_io");
if (np != NULL) {
par_io_init(np);
diff --git a/arch/powerpc/platforms/83xx/mpc832x_mds.c b/arch/powerpc/platforms/83xx/mpc832x_mds.c
index 8d76220..aacc43f 100644
--- a/arch/powerpc/platforms/83xx/mpc832x_mds.c
+++ b/arch/powerpc/platforms/83xx/mpc832x_mds.c
@@ -74,8 +74,6 @@ static void __init mpc832x_sys_setup_arch(void)
mpc83xx_setup_pci();
#ifdef CONFIG_QUICC_ENGINE
- qe_reset();
-
if ((np = of_find_node_by_name(NULL, "par_io")) != NULL) {
par_io_init(np);
of_node_put(np);
diff --git a/arch/powerpc/platforms/83xx/mpc832x_rdb.c b/arch/powerpc/platforms/83xx/mpc832x_rdb.c
index eff5baa..0c7a43e 100644
--- a/arch/powerpc/platforms/83xx/mpc832x_rdb.c
+++ b/arch/powerpc/platforms/83xx/mpc832x_rdb.c
@@ -203,8 +203,6 @@ static void __init mpc832x_rdb_setup_arch(void)
mpc83xx_setup_pci();
#ifdef CONFIG_QUICC_ENGINE
- qe_reset();
-
if ((np = of_find_node_by_name(NULL, "par_io")) != NULL) {
par_io_init(np);
of_node_put(np);
diff --git a/arch/powerpc/platforms/83xx/mpc836x_mds.c b/arch/powerpc/platforms/83xx/mpc836x_mds.c
index 1a26d2f..eb24abd 100644
--- a/arch/powerpc/platforms/83xx/mpc836x_mds.c
+++ b/arch/powerpc/platforms/83xx/mpc836x_mds.c
@@ -82,8 +82,6 @@ static void __init mpc836x_mds_setup_arch(void)
mpc83xx_setup_pci();
#ifdef CONFIG_QUICC_ENGINE
- qe_reset();
-
if ((np = of_find_node_by_name(NULL, "par_io")) != NULL) {
par_io_init(np);
of_node_put(np);
diff --git a/arch/powerpc/platforms/83xx/mpc836x_rdk.c b/arch/powerpc/platforms/83xx/mpc836x_rdk.c
index b63b42d..823e370 100644
--- a/arch/powerpc/platforms/83xx/mpc836x_rdk.c
+++ b/arch/powerpc/platforms/83xx/mpc836x_rdk.c
@@ -35,9 +35,6 @@ static void __init mpc836x_rdk_setup_arch(void)
ppc_md.progress("mpc836x_rdk_setup_arch()", 0);
mpc83xx_setup_pci();
-#ifdef CONFIG_QUICC_ENGINE
- qe_reset();
-#endif
}
/*
diff --git a/arch/powerpc/platforms/85xx/common.c b/arch/powerpc/platforms/85xx/common.c
index 7bfb9b1..0f91edc 100644
--- a/arch/powerpc/platforms/85xx/common.c
+++ b/arch/powerpc/platforms/85xx/common.c
@@ -105,7 +105,6 @@ void __init mpc85xx_qe_init(void)
return;
}
- qe_reset();
of_node_put(np);
}
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
index b7f9c40..01f98a2 100644
--- a/arch/powerpc/platforms/Kconfig
+++ b/arch/powerpc/platforms/Kconfig
@@ -276,6 +276,7 @@ config QUICC_ENGINE
bool "Freescale QUICC Engine (QE) Support"
depends on FSL_SOC && PPC32
select PPC_LIB_RHEAP
+ select GENERIC_ALLOCATOR
select CRC32
help
The QUICC Engine (QE) is a new generation of communications
diff --git a/arch/powerpc/sysdev/qe_lib/Makefile b/arch/powerpc/sysdev/qe_lib/Makefile
index f1855c1..9507a27 100644
--- a/arch/powerpc/sysdev/qe_lib/Makefile
+++ b/arch/powerpc/sysdev/qe_lib/Makefile
@@ -1,7 +1,7 @@
#
# Makefile for the linux ppc-specific parts of QE
#
-obj-$(CONFIG_QUICC_ENGINE)+= qe.o qe_ic.o qe_io.o
+obj-$(CONFIG_QUICC_ENGINE)+= qe.o qe_common.o qe_ic.o qe_io.o
obj-$(CONFIG_UCC) += ucc.o
obj-$(CONFIG_UCC_SLOW) += ucc_slow.o
diff --git a/arch/powerpc/sysdev/qe_lib/qe.c b/arch/powerpc/sysdev/qe_lib/qe.c
index c2518cd..3f9f596 100644
--- a/arch/powerpc/sysdev/qe_lib/qe.c
+++ b/arch/powerpc/sysdev/qe_lib/qe.c
@@ -671,6 +671,21 @@ unsigned int qe_get_num_of_snums(void)
}
EXPORT_SYMBOL(qe_get_num_of_snums);
+static int __init qe_init(void)
+{
+ struct device_node *np;
+
+ np = of_find_compatible_node(NULL, NULL, "fsl,qe");
+ if (!np) {
+ pr_err("%s: Could not find Quicc Engine node\n", __func__);
+ return -ENODEV;
+ }
+ qe_reset();
+ of_node_put(np);
+ return 0;
+}
+subsys_initcall(qe_init);
+
#if defined(CONFIG_SUSPEND) && defined(CONFIG_PPC_85xx)
static int qe_resume(struct platform_device *ofdev)
{
diff --git a/arch/powerpc/sysdev/qe_lib/qe_common.c b/arch/powerpc/sysdev/qe_lib/qe_common.c
new file mode 100644
index 0000000..1213458
--- /dev/null
+++ b/arch/powerpc/sysdev/qe_lib/qe_common.c
@@ -0,0 +1,242 @@
+/*
+ * Freescale QE common code
+ *
+ * Author: Zhao Qiang <qiang.zhao@freescale.com>
+ *
+ * Copyright 2015 Freescale Semiconductor, Inc.
+ *
+ * This program is free software; you can redistribute it and/or modify
+ * it under the terms of the GNU General Public License as published by
+ * the Free Software Foundation; either version 2 of the License, or
+ * (at your option) any later version.
+ */
+
+#include <linux/genalloc.h>
+#include <linux/list.h>
+#include <linux/init.h>
+#include <linux/of_device.h>
+#include <linux/spinlock.h>
+#include <linux/export.h>
+#include <linux/of.h>
+#include <linux/of_address.h>
+#include <linux/slab.h>
+
+#include <linux/io.h>
+#include <asm/qe.h>
+
+static struct gen_pool *muram_pool;
+static struct genpool_data_align muram_pool_data;
+static struct genpool_data_fixed muram_pool_data_fixed;
+static spinlock_t qe_muram_lock;
+static u8 __iomem *muram_vbase;
+static phys_addr_t muram_pbase;
+
+struct muram_block {
+ struct list_head head;
+ unsigned long start;
+ int size;
+};
+
+static LIST_HEAD(muram_block_list);
+
+/* max address size we deal with */
+#define OF_MAX_ADDR_CELLS 4
+#define GENPOOL_OFFSET 4096
+
+int qe_muram_init(void)
+{
+ struct device_node *np;
+ struct resource r;
+ u32 zero[OF_MAX_ADDR_CELLS] = {};
+ resource_size_t max = 0;
+ int i = 0;
+ int ret = 0;
+
+ if (muram_pbase)
+ return 0;
+
+ np = of_find_compatible_node(NULL, NULL, "fsl,qe-muram-data");
+ if (!np) {
+ /* try legacy bindings */
+ np = of_find_node_by_name(NULL, "data-only");
+ if (!np) {
+ pr_err("Cannot find CPM muram data node");
+ ret = -ENODEV;
+ goto out;
+ }
+ }
+
+ muram_pool = gen_pool_create(1, -1);
+ muram_pbase = of_translate_address(np, zero);
+ if (muram_pbase == (phys_addr_t)OF_BAD_ADDR) {
+ pr_err("Cannot translate zero through CPM muram node");
+ ret = -ENODEV;
+ goto err;
+ }
+
+ while (of_address_to_resource(np, i++, &r) == 0) {
+ if (r.end > max)
+ max = r.end;
+ ret = gen_pool_add(muram_pool, r.start - muram_pbase +
+ GENPOOL_OFFSET, resource_size(&r), -1);
+ if (ret) {
+ pr_err("QE: couldn't add muram to pool!\n");
+ goto err;
+ }
+
+ }
+
+ muram_vbase = ioremap(muram_pbase, max - muram_pbase + 1);
+ if (!muram_vbase) {
+ pr_err("Cannot map QE muram");
+ ret = -ENOMEM;
+ goto err;
+ }
+ goto out;
+err:
+ gen_pool_destroy(muram_pool);
+out:
+ of_node_put(np);
+ return ret;
+}
+
+/*
+ * qe_muram_alloc - allocate the requested size worth of multi-user ram
+ * @size: number of bytes to allocate
+ * @align: requested alignment, in bytes
+ *
+ * This function returns an offset into the muram area.
+ */
+unsigned long qe_muram_alloc(unsigned long size, unsigned long align)
+{
+ unsigned long start;
+ unsigned long flags;
+ struct muram_block *entry;
+
+ spin_lock_irqsave(&qe_muram_lock, flags);
+ muram_pool_data.align = align;
+ gen_pool_set_algo(muram_pool, gen_pool_first_fit_align,
+ &muram_pool_data);
+ start = gen_pool_alloc(muram_pool, size);
+ if (!start)
+ goto out2;
+ start = start - GENPOOL_OFFSET;
+ memset(qe_muram_addr(start), 0, size);
+ entry = kmalloc(sizeof(*entry), GFP_KERNEL);
+ if (!entry)
+ goto out1;
+ entry->start = start;
+ entry->size = size;
+ list_add(&entry->head, &muram_block_list);
+ spin_unlock_irqrestore(&qe_muram_lock, flags);
+
+ return start;
+out1:
+ gen_pool_free(muram_pool, start, size);
+out2:
+ spin_unlock_irqrestore(&qe_muram_lock, flags);
+ return (unsigned long) -ENOMEM;
+}
+EXPORT_SYMBOL(qe_muram_alloc);
+
+/*
+ * qe_muram_alloc_fixed - reserve a specific region of multi-user ram
+ * @size: number of bytes to allocate
+ * @offset: offset of allocation start address
+ *
+ * This function returns an offset into the muram area.
+ */
+unsigned long qe_muram_alloc_fixed(unsigned long offset, unsigned long size)
+{
+
+ unsigned long start;
+ unsigned long flags;
+ unsigned long size_alloc = size;
+ struct muram_block *entry;
+ int end_bit;
+ int order = muram_pool -> min_alloc_order;
+
+ spin_lock_irqsave(&qe_muram_lock, flags);
+ end_bit = (offset >> order) + ((size + (1UL << order) - 1) >> order);
+ if ((offset + size) > (end_bit << order))
+ size_alloc = size + (1UL << order);
+
+ muram_pool_data_fixed.offset = offset + GENPOOL_OFFSET;
+ gen_pool_set_algo(muram_pool, gen_pool_fixed_fit,
+ &muram_pool_data_fixed);
+ start = gen_pool_alloc(muram_pool, size_alloc);
+ if (!start)
+ goto out2;
+ start = start - GENPOOL_OFFSET;
+ memset(qe_muram_addr(start), 0, size_alloc);
+ entry = kmalloc(sizeof(*entry), GFP_KERNEL);
+ if (!entry)
+ goto out1;
+ entry->start = start;
+ entry->size = size_alloc;
+ list_add(&entry->head, &muram_block_list);
+ spin_unlock_irqrestore(&qe_muram_lock, flags);
+
+ return start;
+out1:
+ gen_pool_free(muram_pool, start, size_alloc);
+out2:
+ spin_unlock_irqrestore(&qe_muram_lock, flags);
+ return (unsigned long) -ENOMEM;
+
+
+}
+EXPORT_SYMBOL(qe_muram_alloc_fixed);
+
+/**
+ * qe_muram_free - free a chunk of multi-user ram
+ * @offset: The beginning of the chunk as returned by qe_muram_alloc().
+ */
+int qe_muram_free(unsigned long offset)
+{
+ unsigned long flags;
+ int size;
+ struct muram_block *tmp;
+
+ size = 0;
+ spin_lock_irqsave(&qe_muram_lock, flags);
+ list_for_each_entry(tmp, &muram_block_list, head) {
+ if (tmp->start == offset) {
+ size = tmp->size;
+ list_del(&tmp->head);
+ kfree(tmp);
+ break;
+ }
+ }
+ gen_pool_free(muram_pool, offset + GENPOOL_OFFSET, size);
+ spin_unlock_irqrestore(&qe_muram_lock, flags);
+
+ return size;
+}
+EXPORT_SYMBOL(qe_muram_free);
+
+/**
+ * qe_muram_addr - turn a muram offset into a virtual address
+ * @offset: muram offset to convert
+ */
+void __iomem *qe_muram_addr(unsigned long offset)
+{
+ return muram_vbase + offset;
+}
+EXPORT_SYMBOL(qe_muram_addr);
+
+unsigned long qe_muram_offset(void __iomem *addr)
+{
+ return addr - (void __iomem *)muram_vbase;
+}
+EXPORT_SYMBOL(qe_muram_offset);
+
+/**
+ * qe_muram_dma - turn a muram virtual address into a DMA address
+ * @offset: virtual address from qe_muram_addr() to convert
+ */
+dma_addr_t qe_muram_dma(void __iomem *addr)
+{
+ return muram_pbase + ((u8 __iomem *)addr - muram_vbase);
+}
+EXPORT_SYMBOL(qe_muram_dma);
--
2.1.0.27.g96db324
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v9 4/5] CPM: modify cpm_muram_* functions
2015-09-14 1:38 [PATCH v9 1/5] genalloc:support memory-allocation with bytes-alignment to genalloc Zhao Qiang
2015-09-14 1:38 ` [PATCH v9 2/5] genalloc:support allocating specific region Zhao Qiang
2015-09-14 1:38 ` [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram Zhao Qiang
@ 2015-09-14 1:38 ` Zhao Qiang
2015-09-14 1:38 ` [PATCH v9 5/5] QE: Move QE from arch/powerpc to drivers/soc Zhao Qiang
3 siblings, 0 replies; 11+ messages in thread
From: Zhao Qiang @ 2015-09-14 1:38 UTC (permalink / raw
To: scottwood
Cc: linux-kernel, linuxppc-dev, lauraa, X.xie, benh, leoli, paulus,
Zhao Qiang
CPM and QE have the same muram, shared the same
muram management functions. Delete cpm_muram_* functions,
using qe_muram_*.
Signed-off-by: Zhao Qiang <qiang.zhao@freescale.com>
---
Changes for v9:
- splitted from patch 3/5, modify cpm muram management functions.
arch/powerpc/include/asm/cpm.h | 59 ----------------
arch/powerpc/include/asm/qe.h | 8 +++
arch/powerpc/sysdev/cpm_common.c | 141 +--------------------------------------
3 files changed, 9 insertions(+), 199 deletions(-)
diff --git a/arch/powerpc/include/asm/cpm.h b/arch/powerpc/include/asm/cpm.h
index 4398a6c..003a736 100644
--- a/arch/powerpc/include/asm/cpm.h
+++ b/arch/powerpc/include/asm/cpm.h
@@ -93,22 +93,6 @@ typedef struct cpm_buf_desc {
*/
#define BD_SC_EMPTY (0x8000) /* Receive is empty */
-#define BD_SC_READY (0x8000) /* Transmit is ready */
-#define BD_SC_WRAP (0x2000) /* Last buffer descriptor */
-#define BD_SC_INTRPT (0x1000) /* Interrupt on change */
-#define BD_SC_LAST (0x0800) /* Last buffer in frame */
-#define BD_SC_TC (0x0400) /* Transmit CRC */
-#define BD_SC_CM (0x0200) /* Continuous mode */
-#define BD_SC_ID (0x0100) /* Rec'd too many idles */
-#define BD_SC_P (0x0100) /* xmt preamble */
-#define BD_SC_BR (0x0020) /* Break received */
-#define BD_SC_FR (0x0010) /* Framing error */
-#define BD_SC_PR (0x0008) /* Parity error */
-#define BD_SC_NAK (0x0004) /* NAK - did not respond */
-#define BD_SC_OV (0x0002) /* Overrun */
-#define BD_SC_UN (0x0002) /* Underrun */
-#define BD_SC_CD (0x0001) /* */
-#define BD_SC_CL (0x0001) /* Collision */
/* Buffer descriptor control/status used by Ethernet receive.
* Common to SCC and FCC.
@@ -155,49 +139,6 @@ typedef struct cpm_buf_desc {
*/
#define BD_I2C_START (0x0400)
-int cpm_muram_init(void);
-
-#if defined(CONFIG_CPM) || defined(CONFIG_QUICC_ENGINE)
-unsigned long cpm_muram_alloc(unsigned long size, unsigned long align);
-int cpm_muram_free(unsigned long offset);
-unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size);
-void __iomem *cpm_muram_addr(unsigned long offset);
-unsigned long cpm_muram_offset(void __iomem *addr);
-dma_addr_t cpm_muram_dma(void __iomem *addr);
-#else
-static inline unsigned long cpm_muram_alloc(unsigned long size,
- unsigned long align)
-{
- return -ENOSYS;
-}
-
-static inline int cpm_muram_free(unsigned long offset)
-{
- return -ENOSYS;
-}
-
-static inline unsigned long cpm_muram_alloc_fixed(unsigned long offset,
- unsigned long size)
-{
- return -ENOSYS;
-}
-
-static inline void __iomem *cpm_muram_addr(unsigned long offset)
-{
- return NULL;
-}
-
-static inline unsigned long cpm_muram_offset(void __iomem *addr)
-{
- return -ENOSYS;
-}
-
-static inline dma_addr_t cpm_muram_dma(void __iomem *addr)
-{
- return 0;
-}
-#endif /* defined(CONFIG_CPM) || defined(CONFIG_QUICC_ENGINE) */
-
#ifdef CONFIG_CPM
int cpm_command(u32 command, u8 opcode);
#else
diff --git a/arch/powerpc/include/asm/qe.h b/arch/powerpc/include/asm/qe.h
index 3af9033..aee968f 100644
--- a/arch/powerpc/include/asm/qe.h
+++ b/arch/powerpc/include/asm/qe.h
@@ -189,6 +189,14 @@ static inline int qe_alive_during_sleep(void)
#endif
}
+/* we actually use qe_muram implementation, define this for convenience */
+#define cpm_muram_init qe_muram_init
+#define cpm_muram_alloc qe_muram_alloc
+#define cpm_muram_alloc_fixed qe_muram_alloc_fixed
+#define cpm_muram_free qe_muram_free
+#define cpm_muram_addr qe_muram_addr
+#define cpm_muram_offset qe_muram_offset
+
int qe_muram_init(void);
#if defined(CONFIG_QUICC_ENGINE)
diff --git a/arch/powerpc/sysdev/cpm_common.c b/arch/powerpc/sysdev/cpm_common.c
index 4f78695..328c3ec 100644
--- a/arch/powerpc/sysdev/cpm_common.c
+++ b/arch/powerpc/sysdev/cpm_common.c
@@ -27,8 +27,8 @@
#include <asm/udbg.h>
#include <asm/io.h>
-#include <asm/rheap.h>
#include <asm/cpm.h>
+#include <asm/qe.h>
#include <mm/mmu_decl.h>
@@ -65,151 +65,12 @@ void __init udbg_init_cpm(void)
}
#endif
-static spinlock_t cpm_muram_lock;
-static rh_block_t cpm_boot_muram_rh_block[16];
-static rh_info_t cpm_muram_info;
static u8 __iomem *muram_vbase;
static phys_addr_t muram_pbase;
/* Max address size we deal with */
#define OF_MAX_ADDR_CELLS 4
-int cpm_muram_init(void)
-{
- struct device_node *np;
- struct resource r;
- u32 zero[OF_MAX_ADDR_CELLS] = {};
- resource_size_t max = 0;
- int i = 0;
- int ret = 0;
-
- if (muram_pbase)
- return 0;
-
- spin_lock_init(&cpm_muram_lock);
- /* initialize the info header */
- rh_init(&cpm_muram_info, 1,
- sizeof(cpm_boot_muram_rh_block) /
- sizeof(cpm_boot_muram_rh_block[0]),
- cpm_boot_muram_rh_block);
-
- np = of_find_compatible_node(NULL, NULL, "fsl,cpm-muram-data");
- if (!np) {
- /* try legacy bindings */
- np = of_find_node_by_name(NULL, "data-only");
- if (!np) {
- printk(KERN_ERR "Cannot find CPM muram data node");
- ret = -ENODEV;
- goto out;
- }
- }
-
- muram_pbase = of_translate_address(np, zero);
- if (muram_pbase == (phys_addr_t)OF_BAD_ADDR) {
- printk(KERN_ERR "Cannot translate zero through CPM muram node");
- ret = -ENODEV;
- goto out;
- }
-
- while (of_address_to_resource(np, i++, &r) == 0) {
- if (r.end > max)
- max = r.end;
-
- rh_attach_region(&cpm_muram_info, r.start - muram_pbase,
- resource_size(&r));
- }
-
- muram_vbase = ioremap(muram_pbase, max - muram_pbase + 1);
- if (!muram_vbase) {
- printk(KERN_ERR "Cannot map CPM muram");
- ret = -ENOMEM;
- }
-
-out:
- of_node_put(np);
- return ret;
-}
-
-/**
- * cpm_muram_alloc - allocate the requested size worth of multi-user ram
- * @size: number of bytes to allocate
- * @align: requested alignment, in bytes
- *
- * This function returns an offset into the muram area.
- * Use cpm_dpram_addr() to get the virtual address of the area.
- * Use cpm_muram_free() to free the allocation.
- */
-unsigned long cpm_muram_alloc(unsigned long size, unsigned long align)
-{
- unsigned long start;
- unsigned long flags;
-
- spin_lock_irqsave(&cpm_muram_lock, flags);
- cpm_muram_info.alignment = align;
- start = rh_alloc(&cpm_muram_info, size, "commproc");
- memset(cpm_muram_addr(start), 0, size);
- spin_unlock_irqrestore(&cpm_muram_lock, flags);
-
- return start;
-}
-EXPORT_SYMBOL(cpm_muram_alloc);
-
-/**
- * cpm_muram_free - free a chunk of multi-user ram
- * @offset: The beginning of the chunk as returned by cpm_muram_alloc().
- */
-int cpm_muram_free(unsigned long offset)
-{
- int ret;
- unsigned long flags;
-
- spin_lock_irqsave(&cpm_muram_lock, flags);
- ret = rh_free(&cpm_muram_info, offset);
- spin_unlock_irqrestore(&cpm_muram_lock, flags);
-
- return ret;
-}
-EXPORT_SYMBOL(cpm_muram_free);
-
-/**
- * cpm_muram_alloc_fixed - reserve a specific region of multi-user ram
- * @offset: the offset into the muram area to reserve
- * @size: the number of bytes to reserve
- *
- * This function returns "start" on success, -ENOMEM on failure.
- * Use cpm_dpram_addr() to get the virtual address of the area.
- * Use cpm_muram_free() to free the allocation.
- */
-unsigned long cpm_muram_alloc_fixed(unsigned long offset, unsigned long size)
-{
- unsigned long start;
- unsigned long flags;
-
- spin_lock_irqsave(&cpm_muram_lock, flags);
- cpm_muram_info.alignment = 1;
- start = rh_alloc_fixed(&cpm_muram_info, offset, size, "commproc");
- spin_unlock_irqrestore(&cpm_muram_lock, flags);
-
- return start;
-}
-EXPORT_SYMBOL(cpm_muram_alloc_fixed);
-
-/**
- * cpm_muram_addr - turn a muram offset into a virtual address
- * @offset: muram offset to convert
- */
-void __iomem *cpm_muram_addr(unsigned long offset)
-{
- return muram_vbase + offset;
-}
-EXPORT_SYMBOL(cpm_muram_addr);
-
-unsigned long cpm_muram_offset(void __iomem *addr)
-{
- return addr - (void __iomem *)muram_vbase;
-}
-EXPORT_SYMBOL(cpm_muram_offset);
-
/**
* cpm_muram_dma - turn a muram virtual address into a DMA address
* @offset: virtual address from cpm_muram_addr() to convert
--
2.1.0.27.g96db324
^ permalink raw reply related [flat|nested] 11+ messages in thread
* [PATCH v9 5/5] QE: Move QE from arch/powerpc to drivers/soc
2015-09-14 1:38 [PATCH v9 1/5] genalloc:support memory-allocation with bytes-alignment to genalloc Zhao Qiang
` (2 preceding siblings ...)
2015-09-14 1:38 ` [PATCH v9 4/5] CPM: modify cpm_muram_* functions Zhao Qiang
@ 2015-09-14 1:38 ` Zhao Qiang
3 siblings, 0 replies; 11+ messages in thread
From: Zhao Qiang @ 2015-09-14 1:38 UTC (permalink / raw
To: scottwood
Cc: linux-kernel, linuxppc-dev, lauraa, X.xie, benh, leoli, paulus,
Zhao Qiang
ls1 has qe and ls1 has arm cpu.
move qe from arch/powerpc to drivers/soc/fsl
to adapt to powerpc and arm
Signed-off-by: Zhao Qiang <qiang.zhao@freescale.com>
---
Changes for v2:
- move code to driver/soc
Changes for v3:
- change drivers/soc/qe to drivers/soc/fsl-qe
Changes for v4:
- move drivers/soc/fsl-qe to drivers/soc/fsl/qe
- move head files for qe from include/linux/fsl to include/soc/fsl
- move qe_ic.c to drivers/irqchip/
Changes for v5:
- update MAINTAINERS
Changes for v6:
- rebase
Changes for v7:
- move this patch from 2/3 to 3/3
Changes for v8:
- Nil
Changes for v9:
- Nil
MAINTAINERS | 5 ++--
arch/powerpc/platforms/83xx/km83xx.c | 4 +--
arch/powerpc/platforms/83xx/misc.c | 2 +-
arch/powerpc/platforms/83xx/mpc832x_mds.c | 4 +--
arch/powerpc/platforms/83xx/mpc832x_rdb.c | 4 +--
arch/powerpc/platforms/83xx/mpc836x_mds.c | 4 +--
arch/powerpc/platforms/83xx/mpc836x_rdk.c | 4 +--
arch/powerpc/platforms/85xx/common.c | 2 +-
arch/powerpc/platforms/85xx/corenet_generic.c | 2 +-
arch/powerpc/platforms/85xx/mpc85xx_mds.c | 4 +--
arch/powerpc/platforms/85xx/mpc85xx_rdb.c | 4 +--
arch/powerpc/platforms/85xx/twr_p102x.c | 4 +--
arch/powerpc/platforms/Kconfig | 20 -------------
arch/powerpc/sysdev/cpm_common.c | 2 +-
arch/powerpc/sysdev/qe_lib/Kconfig | 22 ++++-----------
arch/powerpc/sysdev/qe_lib/Makefile | 6 +---
arch/powerpc/sysdev/qe_lib/gpio.c | 2 +-
arch/powerpc/sysdev/qe_lib/qe_io.c | 2 +-
arch/powerpc/sysdev/qe_lib/usb.c | 4 +--
drivers/irqchip/Makefile | 1 +
.../sysdev/qe_lib => drivers/irqchip}/qe_ic.c | 2 +-
.../sysdev/qe_lib => drivers/irqchip}/qe_ic.h | 4 +--
drivers/net/ethernet/freescale/fsl_pq_mdio.c | 2 +-
drivers/net/ethernet/freescale/ucc_geth.c | 8 +++---
drivers/net/ethernet/freescale/ucc_geth.h | 8 +++---
drivers/soc/Kconfig | 1 +
drivers/soc/Makefile | 1 +
drivers/soc/fsl/Makefile | 5 ++++
drivers/soc/fsl/qe/Kconfig | 33 ++++++++++++++++++++++
drivers/soc/fsl/qe/Makefile | 9 ++++++
.../sysdev/qe_lib => drivers/soc/fsl/qe}/qe.c | 4 +--
.../qe_lib => drivers/soc/fsl/qe}/qe_common.c | 2 +-
.../sysdev/qe_lib => drivers/soc/fsl/qe}/ucc.c | 6 ++--
.../qe_lib => drivers/soc/fsl/qe}/ucc_fast.c | 8 +++---
.../qe_lib => drivers/soc/fsl/qe}/ucc_slow.c | 8 +++---
drivers/spi/spi-fsl-cpm.c | 2 +-
drivers/tty/serial/ucc_uart.c | 2 +-
drivers/usb/gadget/udc/fsl_qe_udc.c | 2 +-
drivers/usb/host/fhci-hcd.c | 2 +-
drivers/usb/host/fhci-hub.c | 2 +-
drivers/usb/host/fhci-sched.c | 2 +-
drivers/usb/host/fhci.h | 4 +--
.../include/asm => include/linux/fsl/qe}/qe_ic.h | 0
.../include/asm => include/soc/fsl/qe}/immap_qe.h | 0
.../include/asm => include/soc/fsl/qe}/qe.h | 2 +-
.../include/asm => include/soc/fsl/qe}/ucc.h | 4 +--
.../include/asm => include/soc/fsl/qe}/ucc_fast.h | 6 ++--
.../include/asm => include/soc/fsl/qe}/ucc_slow.h | 6 ++--
48 files changed, 127 insertions(+), 110 deletions(-)
rename {arch/powerpc/sysdev/qe_lib => drivers/irqchip}/qe_ic.c (99%)
rename {arch/powerpc/sysdev/qe_lib => drivers/irqchip}/qe_ic.h (97%)
create mode 100644 drivers/soc/fsl/Makefile
create mode 100644 drivers/soc/fsl/qe/Kconfig
create mode 100644 drivers/soc/fsl/qe/Makefile
rename {arch/powerpc/sysdev/qe_lib => drivers/soc/fsl/qe}/qe.c (99%)
rename {arch/powerpc/sysdev/qe_lib => drivers/soc/fsl/qe}/qe_common.c (99%)
rename {arch/powerpc/sysdev/qe_lib => drivers/soc/fsl/qe}/ucc.c (98%)
rename {arch/powerpc/sysdev/qe_lib => drivers/soc/fsl/qe}/ucc_fast.c (98%)
rename {arch/powerpc/sysdev/qe_lib => drivers/soc/fsl/qe}/ucc_slow.c (98%)
rename {arch/powerpc/include/asm => include/linux/fsl/qe}/qe_ic.h (100%)
rename {arch/powerpc/include/asm => include/soc/fsl/qe}/immap_qe.h (100%)
rename {arch/powerpc/include/asm => include/soc/fsl/qe}/qe.h (99%)
rename {arch/powerpc/include/asm => include/soc/fsl/qe}/ucc.h (96%)
rename {arch/powerpc/include/asm => include/soc/fsl/qe}/ucc_fast.h (98%)
rename {arch/powerpc/include/asm => include/soc/fsl/qe}/ucc_slow.h (99%)
diff --git a/MAINTAINERS b/MAINTAINERS
index 562ae4e..c688e61 100644
--- a/MAINTAINERS
+++ b/MAINTAINERS
@@ -4155,8 +4155,9 @@ F: include/linux/fs_enet_pd.h
FREESCALE QUICC ENGINE LIBRARY
L: linuxppc-dev@lists.ozlabs.org
S: Orphan
-F: arch/powerpc/sysdev/qe_lib/
-F: arch/powerpc/include/asm/*qe.h
+F: drivers/soc/fsl/qe/
+F: include/soc/fsl/*qe*.h
+F: include/soc/fsl/*ucc*.h
FREESCALE USB PERIPHERAL DRIVERS
M: Li Yang <leoli@freescale.com>
diff --git a/arch/powerpc/platforms/83xx/km83xx.c b/arch/powerpc/platforms/83xx/km83xx.c
index ae111581..7ecd758 100644
--- a/arch/powerpc/platforms/83xx/km83xx.c
+++ b/arch/powerpc/platforms/83xx/km83xx.c
@@ -37,8 +37,8 @@
#include <asm/udbg.h>
#include <sysdev/fsl_soc.h>
#include <sysdev/fsl_pci.h>
-#include <asm/qe.h>
-#include <asm/qe_ic.h>
+#include <soc/fsl/qe/qe.h>
+#include <linux/fsl/qe/qe_ic.h>
#include "mpc83xx.h"
diff --git a/arch/powerpc/platforms/83xx/misc.c b/arch/powerpc/platforms/83xx/misc.c
index ef9d01a..eacf34b 100644
--- a/arch/powerpc/platforms/83xx/misc.c
+++ b/arch/powerpc/platforms/83xx/misc.c
@@ -17,7 +17,7 @@
#include <asm/io.h>
#include <asm/hw_irq.h>
#include <asm/ipic.h>
-#include <asm/qe_ic.h>
+#include <linux/fsl/qe/qe_ic.h>
#include <sysdev/fsl_soc.h>
#include <sysdev/fsl_pci.h>
diff --git a/arch/powerpc/platforms/83xx/mpc832x_mds.c b/arch/powerpc/platforms/83xx/mpc832x_mds.c
index aacc43f..20dce79 100644
--- a/arch/powerpc/platforms/83xx/mpc832x_mds.c
+++ b/arch/powerpc/platforms/83xx/mpc832x_mds.c
@@ -36,8 +36,8 @@
#include <asm/udbg.h>
#include <sysdev/fsl_soc.h>
#include <sysdev/fsl_pci.h>
-#include <asm/qe.h>
-#include <asm/qe_ic.h>
+#include <soc/fsl/qe/qe.h>
+#include <linux/fsl/qe/qe_ic.h>
#include "mpc83xx.h"
diff --git a/arch/powerpc/platforms/83xx/mpc832x_rdb.c b/arch/powerpc/platforms/83xx/mpc832x_rdb.c
index 0c7a43e..2e6a6a4 100644
--- a/arch/powerpc/platforms/83xx/mpc832x_rdb.c
+++ b/arch/powerpc/platforms/83xx/mpc832x_rdb.c
@@ -25,8 +25,8 @@
#include <asm/time.h>
#include <asm/ipic.h>
#include <asm/udbg.h>
-#include <asm/qe.h>
-#include <asm/qe_ic.h>
+#include <soc/fsl/qe/qe.h>
+#include <linux/fsl/qe/qe_ic.h>
#include <sysdev/fsl_soc.h>
#include <sysdev/fsl_pci.h>
diff --git a/arch/powerpc/platforms/83xx/mpc836x_mds.c b/arch/powerpc/platforms/83xx/mpc836x_mds.c
index eb24abd..b1b8ab8 100644
--- a/arch/powerpc/platforms/83xx/mpc836x_mds.c
+++ b/arch/powerpc/platforms/83xx/mpc836x_mds.c
@@ -44,8 +44,8 @@
#include <sysdev/fsl_soc.h>
#include <sysdev/fsl_pci.h>
#include <sysdev/simple_gpio.h>
-#include <asm/qe.h>
-#include <asm/qe_ic.h>
+#include <soc/fsl/qe/qe.h>
+#include <linux/fsl/qe/qe_ic.h>
#include "mpc83xx.h"
diff --git a/arch/powerpc/platforms/83xx/mpc836x_rdk.c b/arch/powerpc/platforms/83xx/mpc836x_rdk.c
index 823e370..9a5a00d 100644
--- a/arch/powerpc/platforms/83xx/mpc836x_rdk.c
+++ b/arch/powerpc/platforms/83xx/mpc836x_rdk.c
@@ -20,8 +20,8 @@
#include <asm/time.h>
#include <asm/ipic.h>
#include <asm/udbg.h>
-#include <asm/qe.h>
-#include <asm/qe_ic.h>
+#include <soc/fsl/qe/qe.h>
+#include <linux/fsl/qe/qe_ic.h>
#include <sysdev/fsl_soc.h>
#include <sysdev/fsl_pci.h>
diff --git a/arch/powerpc/platforms/85xx/common.c b/arch/powerpc/platforms/85xx/common.c
index 0f91edc..d81ea0c 100644
--- a/arch/powerpc/platforms/85xx/common.c
+++ b/arch/powerpc/platforms/85xx/common.c
@@ -9,7 +9,7 @@
#include <linux/of_irq.h>
#include <linux/of_platform.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/qe.h>
#include <sysdev/cpm2_pic.h>
#include "mpc85xx.h"
diff --git a/arch/powerpc/platforms/85xx/corenet_generic.c b/arch/powerpc/platforms/85xx/corenet_generic.c
index bd839dc..1ecbf7f 100644
--- a/arch/powerpc/platforms/85xx/corenet_generic.c
+++ b/arch/powerpc/platforms/85xx/corenet_generic.c
@@ -27,7 +27,7 @@
#include <asm/udbg.h>
#include <asm/mpic.h>
#include <asm/ehv_pic.h>
-#include <asm/qe_ic.h>
+#include <linux/fsl/qe/qe_ic.h>
#include <linux/of_platform.h>
#include <sysdev/fsl_soc.h>
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_mds.c b/arch/powerpc/platforms/85xx/mpc85xx_mds.c
index a392e94..ea4d4f3 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx_mds.c
+++ b/arch/powerpc/platforms/85xx/mpc85xx_mds.c
@@ -47,8 +47,8 @@
#include <sysdev/fsl_soc.h>
#include <sysdev/fsl_pci.h>
#include <sysdev/simple_gpio.h>
-#include <asm/qe.h>
-#include <asm/qe_ic.h>
+#include <soc/fsl/qe/qe.h>
+#include <linux/fsl/qe/qe_ic.h>
#include <asm/mpic.h>
#include <asm/swiotlb.h>
#include <asm/fsl_guts.h>
diff --git a/arch/powerpc/platforms/85xx/mpc85xx_rdb.c b/arch/powerpc/platforms/85xx/mpc85xx_rdb.c
index e358bed..0c5e313 100644
--- a/arch/powerpc/platforms/85xx/mpc85xx_rdb.c
+++ b/arch/powerpc/platforms/85xx/mpc85xx_rdb.c
@@ -25,8 +25,8 @@
#include <asm/prom.h>
#include <asm/udbg.h>
#include <asm/mpic.h>
-#include <asm/qe.h>
-#include <asm/qe_ic.h>
+#include <soc/fsl/qe/qe.h>
+#include <linux/fsl/qe/qe_ic.h>
#include <asm/fsl_guts.h>
#include <sysdev/fsl_soc.h>
diff --git a/arch/powerpc/platforms/85xx/twr_p102x.c b/arch/powerpc/platforms/85xx/twr_p102x.c
index 30e002f..a47654e 100644
--- a/arch/powerpc/platforms/85xx/twr_p102x.c
+++ b/arch/powerpc/platforms/85xx/twr_p102x.c
@@ -21,8 +21,8 @@
#include <asm/pci-bridge.h>
#include <asm/udbg.h>
#include <asm/mpic.h>
-#include <asm/qe.h>
-#include <asm/qe_ic.h>
+#include <soc/fsl/qe/qe.h>
+#include <linux/fsl/qe/qe_ic.h>
#include <asm/fsl_guts.h>
#include <sysdev/fsl_soc.h>
diff --git a/arch/powerpc/platforms/Kconfig b/arch/powerpc/platforms/Kconfig
index 01f98a2..c9541a5 100644
--- a/arch/powerpc/platforms/Kconfig
+++ b/arch/powerpc/platforms/Kconfig
@@ -272,26 +272,6 @@ config TAU_AVERAGE
If in doubt, say N here.
-config QUICC_ENGINE
- bool "Freescale QUICC Engine (QE) Support"
- depends on FSL_SOC && PPC32
- select PPC_LIB_RHEAP
- select GENERIC_ALLOCATOR
- select CRC32
- help
- The QUICC Engine (QE) is a new generation of communications
- coprocessors on Freescale embedded CPUs (akin to CPM in older chips).
- Selecting this option means that you wish to build a kernel
- for a machine with a QE coprocessor.
-
-config QE_GPIO
- bool "QE GPIO support"
- depends on QUICC_ENGINE
- select ARCH_REQUIRE_GPIOLIB
- help
- Say Y here if you're going to use hardware that connects to the
- QE GPIOs.
-
config CPM2
bool "Enable support for the CPM2 (Communications Processor Module)"
depends on (FSL_SOC_BOOKE && PPC32) || 8260
diff --git a/arch/powerpc/sysdev/cpm_common.c b/arch/powerpc/sysdev/cpm_common.c
index 328c3ec..eaee6f6 100644
--- a/arch/powerpc/sysdev/cpm_common.c
+++ b/arch/powerpc/sysdev/cpm_common.c
@@ -28,7 +28,7 @@
#include <asm/udbg.h>
#include <asm/io.h>
#include <asm/cpm.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/qe.h>
#include <mm/mmu_decl.h>
diff --git a/arch/powerpc/sysdev/qe_lib/Kconfig b/arch/powerpc/sysdev/qe_lib/Kconfig
index 3c25199..2f80075 100644
--- a/arch/powerpc/sysdev/qe_lib/Kconfig
+++ b/arch/powerpc/sysdev/qe_lib/Kconfig
@@ -1,24 +1,14 @@
#
# QE Communication options
#
-
-config UCC_SLOW
- bool
- default y if SERIAL_QE
- help
- This option provides qe_lib support to UCC slow
- protocols: UART, BISYNC, QMC
-
-config UCC_FAST
- bool
- default y if UCC_GETH
+config QE_GPIO
+ bool "QE GPIO support"
+ depends on QUICC_ENGINE
+ select ARCH_REQUIRE_GPIOLIB
help
- This option provides qe_lib support to UCC fast
- protocols: HDLC, Ethernet, ATM, transparent
+ Say Y here if you're going to use hardware that connects to the
+ QE GPIOs.
-config UCC
- bool
- default y if UCC_FAST || UCC_SLOW
config QE_USB
bool
diff --git a/arch/powerpc/sysdev/qe_lib/Makefile b/arch/powerpc/sysdev/qe_lib/Makefile
index 9507a27..1b123df 100644
--- a/arch/powerpc/sysdev/qe_lib/Makefile
+++ b/arch/powerpc/sysdev/qe_lib/Makefile
@@ -1,10 +1,6 @@
#
# Makefile for the linux ppc-specific parts of QE
#
-obj-$(CONFIG_QUICC_ENGINE)+= qe.o qe_common.o qe_ic.o qe_io.o
-
-obj-$(CONFIG_UCC) += ucc.o
-obj-$(CONFIG_UCC_SLOW) += ucc_slow.o
-obj-$(CONFIG_UCC_FAST) += ucc_fast.o
+obj-$(CONFIG_QUICC_ENGINE)+= qe_io.o
obj-$(CONFIG_QE_USB) += usb.o
obj-$(CONFIG_QE_GPIO) += gpio.o
diff --git a/arch/powerpc/sysdev/qe_lib/gpio.c b/arch/powerpc/sysdev/qe_lib/gpio.c
index 521e67a..aa5c11ac 100644
--- a/arch/powerpc/sysdev/qe_lib/gpio.c
+++ b/arch/powerpc/sysdev/qe_lib/gpio.c
@@ -21,7 +21,7 @@
#include <linux/gpio.h>
#include <linux/slab.h>
#include <linux/export.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/qe.h>
struct qe_gpio_chip {
struct of_mm_gpio_chip mm_gc;
diff --git a/arch/powerpc/sysdev/qe_lib/qe_io.c b/arch/powerpc/sysdev/qe_lib/qe_io.c
index 7ea0174..7ae59ab 100644
--- a/arch/powerpc/sysdev/qe_lib/qe_io.c
+++ b/arch/powerpc/sysdev/qe_lib/qe_io.c
@@ -21,7 +21,7 @@
#include <linux/ioport.h>
#include <asm/io.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/qe.h>
#include <asm/prom.h>
#include <sysdev/fsl_soc.h>
diff --git a/arch/powerpc/sysdev/qe_lib/usb.c b/arch/powerpc/sysdev/qe_lib/usb.c
index 27f23bd..111f7ab 100644
--- a/arch/powerpc/sysdev/qe_lib/usb.c
+++ b/arch/powerpc/sysdev/qe_lib/usb.c
@@ -17,8 +17,8 @@
#include <linux/errno.h>
#include <linux/export.h>
#include <linux/io.h>
-#include <asm/immap_qe.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/immap_qe.h>
+#include <soc/fsl/qe/qe.h>
int qe_usb_clock_set(enum qe_clock clk, int rate)
{
diff --git a/drivers/irqchip/Makefile b/drivers/irqchip/Makefile
index dda4927..9ff5932 100644
--- a/drivers/irqchip/Makefile
+++ b/drivers/irqchip/Makefile
@@ -47,3 +47,4 @@ obj-$(CONFIG_KEYSTONE_IRQ) += irq-keystone.o
obj-$(CONFIG_MIPS_GIC) += irq-mips-gic.o
obj-$(CONFIG_ARCH_MEDIATEK) += irq-mtk-sysirq.o
obj-$(CONFIG_ARCH_DIGICOLOR) += irq-digicolor.o
+obj-$(CONFIG_QUICC_ENGINE) += qe_ic.o
diff --git a/arch/powerpc/sysdev/qe_lib/qe_ic.c b/drivers/irqchip/qe_ic.c
similarity index 99%
rename from arch/powerpc/sysdev/qe_lib/qe_ic.c
rename to drivers/irqchip/qe_ic.c
index 6512cd8..e31d95b 100644
--- a/arch/powerpc/sysdev/qe_lib/qe_ic.c
+++ b/drivers/irqchip/qe_ic.c
@@ -27,7 +27,7 @@
#include <asm/irq.h>
#include <asm/io.h>
#include <asm/prom.h>
-#include <asm/qe_ic.h>
+#include <linux/fsl/qe/qe_ic.h>
#include "qe_ic.h"
diff --git a/arch/powerpc/sysdev/qe_lib/qe_ic.h b/drivers/irqchip/qe_ic.h
similarity index 97%
rename from arch/powerpc/sysdev/qe_lib/qe_ic.h
rename to drivers/irqchip/qe_ic.h
index efef7ab..9f15cc4 100644
--- a/arch/powerpc/sysdev/qe_lib/qe_ic.h
+++ b/drivers/irqchip/qe_ic.h
@@ -1,5 +1,5 @@
/*
- * arch/powerpc/sysdev/qe_lib/qe_ic.h
+ * drivers/irqchip/qe_ic.h
*
* QUICC ENGINE Interrupt Controller Header
*
@@ -16,7 +16,7 @@
#ifndef _POWERPC_SYSDEV_QE_IC_H
#define _POWERPC_SYSDEV_QE_IC_H
-#include <asm/qe_ic.h>
+#include <linux/fsl/qe/qe_ic.h>
#define NR_QE_IC_INTS 64
diff --git a/drivers/net/ethernet/freescale/fsl_pq_mdio.c b/drivers/net/ethernet/freescale/fsl_pq_mdio.c
index 3c40f6b..21bdf55 100644
--- a/drivers/net/ethernet/freescale/fsl_pq_mdio.c
+++ b/drivers/net/ethernet/freescale/fsl_pq_mdio.c
@@ -29,7 +29,7 @@
#include <asm/io.h>
#if IS_ENABLED(CONFIG_UCC_GETH)
-#include <asm/ucc.h> /* for ucc_set_qe_mux_mii_mng() */
+#include <soc/fsl/qe/ucc.h>
#endif
#include "gianfar.h"
diff --git a/drivers/net/ethernet/freescale/ucc_geth.c b/drivers/net/ethernet/freescale/ucc_geth.c
index 4dd40e0..7d24664 100644
--- a/drivers/net/ethernet/freescale/ucc_geth.c
+++ b/drivers/net/ethernet/freescale/ucc_geth.c
@@ -40,10 +40,10 @@
#include <asm/uaccess.h>
#include <asm/irq.h>
#include <asm/io.h>
-#include <asm/immap_qe.h>
-#include <asm/qe.h>
-#include <asm/ucc.h>
-#include <asm/ucc_fast.h>
+#include <soc/fsl/qe/immap_qe.h>
+#include <soc/fsl/qe/qe.h>
+#include <soc/fsl/qe/ucc.h>
+#include <soc/fsl/qe/ucc_fast.h>
#include <asm/machdep.h>
#include "ucc_geth.h"
diff --git a/drivers/net/ethernet/freescale/ucc_geth.h b/drivers/net/ethernet/freescale/ucc_geth.h
index 75f3371..5da19b4 100644
--- a/drivers/net/ethernet/freescale/ucc_geth.h
+++ b/drivers/net/ethernet/freescale/ucc_geth.h
@@ -22,11 +22,11 @@
#include <linux/list.h>
#include <linux/if_ether.h>
-#include <asm/immap_qe.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/immap_qe.h>
+#include <soc/fsl/qe/qe.h>
-#include <asm/ucc.h>
-#include <asm/ucc_fast.h>
+#include <soc/fsl/qe/ucc.h>
+#include <soc/fsl/qe/ucc_fast.h>
#define DRV_DESC "QE UCC Gigabit Ethernet Controller"
#define DRV_NAME "ucc_geth"
diff --git a/drivers/soc/Kconfig b/drivers/soc/Kconfig
index d8bde82..676737a 100644
--- a/drivers/soc/Kconfig
+++ b/drivers/soc/Kconfig
@@ -1,5 +1,6 @@
menu "SOC (System On Chip) specific Drivers"
+source "drivers/soc/fsl/qe/Kconfig"
source "drivers/soc/mediatek/Kconfig"
source "drivers/soc/qcom/Kconfig"
source "drivers/soc/ti/Kconfig"
diff --git a/drivers/soc/Makefile b/drivers/soc/Makefile
index 70042b2..0259e23 100644
--- a/drivers/soc/Makefile
+++ b/drivers/soc/Makefile
@@ -2,6 +2,7 @@
# Makefile for the Linux Kernel SOC specific device drivers.
#
+obj-y += fsl/
obj-$(CONFIG_ARCH_MEDIATEK) += mediatek/
obj-$(CONFIG_ARCH_QCOM) += qcom/
obj-$(CONFIG_ARCH_TEGRA) += tegra/
diff --git a/drivers/soc/fsl/Makefile b/drivers/soc/fsl/Makefile
new file mode 100644
index 0000000..7c7d045
--- /dev/null
+++ b/drivers/soc/fsl/Makefile
@@ -0,0 +1,5 @@
+#
+# Makefile for the Linux Kernel SOC fsl specific device drivers
+#
+
+obj-$(CONFIG_QUICC_ENGINE) += qe/
diff --git a/drivers/soc/fsl/qe/Kconfig b/drivers/soc/fsl/qe/Kconfig
new file mode 100644
index 0000000..3012571
--- /dev/null
+++ b/drivers/soc/fsl/qe/Kconfig
@@ -0,0 +1,33 @@
+#
+# QE Communication options
+#
+
+config QUICC_ENGINE
+ bool "Freescale QUICC Engine (QE) Support"
+ depends on FSL_SOC && PPC32
+ select PPC_LIB_RHEAP
+ select GENERIC_ALLOCATOR
+ select CRC32
+ help
+ The QUICC Engine (QE) is a new generation of communications
+ coprocessors on Freescale embedded CPUs (akin to CPM in older chips).
+ Selecting this option means that you wish to build a kernel
+ for a machine with a QE coprocessor.
+
+config UCC_SLOW
+ bool
+ default y if SERIAL_QE
+ help
+ This option provides qe_lib support to UCC slow
+ protocols: UART, BISYNC, QMC
+
+config UCC_FAST
+ bool
+ default y if UCC_GETH
+ help
+ This option provides qe_lib support to UCC fast
+ protocols: HDLC, Ethernet, ATM, transparent
+
+config UCC
+ bool
+ default y if UCC_FAST || UCC_SLOW
diff --git a/drivers/soc/fsl/qe/Makefile b/drivers/soc/fsl/qe/Makefile
new file mode 100644
index 0000000..51c9dce
--- /dev/null
+++ b/drivers/soc/fsl/qe/Makefile
@@ -0,0 +1,9 @@
+#
+#Makefile for the Linux fsl parts of QE
+#
+
+
+obj-$(CONFIG_QUICC_ENGINE)+= qe.o qe_common.o
+obj-$(CONFIG_UCC) += ucc.o
+obj-$(CONFIG_UCC_SLOW) += ucc_slow.o
+obj-$(CONFIG_UCC_FAST) += ucc_fast.o
diff --git a/arch/powerpc/sysdev/qe_lib/qe.c b/drivers/soc/fsl/qe/qe.c
similarity index 99%
rename from arch/powerpc/sysdev/qe_lib/qe.c
rename to drivers/soc/fsl/qe/qe.c
index 3f9f596..d8fd4cd 100644
--- a/arch/powerpc/sysdev/qe_lib/qe.c
+++ b/drivers/soc/fsl/qe/qe.c
@@ -31,8 +31,8 @@
#include <asm/irq.h>
#include <asm/page.h>
#include <asm/pgtable.h>
-#include <asm/immap_qe.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/immap_qe.h>
+#include <soc/fsl/qe/qe.h>
#include <asm/prom.h>
#include <asm/rheap.h>
diff --git a/arch/powerpc/sysdev/qe_lib/qe_common.c b/drivers/soc/fsl/qe/qe_common.c
similarity index 99%
rename from arch/powerpc/sysdev/qe_lib/qe_common.c
rename to drivers/soc/fsl/qe/qe_common.c
index 1213458..df17d12 100644
--- a/arch/powerpc/sysdev/qe_lib/qe_common.c
+++ b/drivers/soc/fsl/qe/qe_common.c
@@ -22,7 +22,7 @@
#include <linux/slab.h>
#include <linux/io.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/qe.h>
static struct gen_pool *muram_pool;
static struct genpool_data_align muram_pool_data;
diff --git a/arch/powerpc/sysdev/qe_lib/ucc.c b/drivers/soc/fsl/qe/ucc.c
similarity index 98%
rename from arch/powerpc/sysdev/qe_lib/ucc.c
rename to drivers/soc/fsl/qe/ucc.c
index 621575b..b59d335 100644
--- a/arch/powerpc/sysdev/qe_lib/ucc.c
+++ b/drivers/soc/fsl/qe/ucc.c
@@ -21,9 +21,9 @@
#include <asm/irq.h>
#include <asm/io.h>
-#include <asm/immap_qe.h>
-#include <asm/qe.h>
-#include <asm/ucc.h>
+#include <soc/fsl/qe/immap_qe.h>
+#include <soc/fsl/qe/qe.h>
+#include <soc/fsl/qe/ucc.h>
int ucc_set_qe_mux_mii_mng(unsigned int ucc_num)
{
diff --git a/arch/powerpc/sysdev/qe_lib/ucc_fast.c b/drivers/soc/fsl/qe/ucc_fast.c
similarity index 98%
rename from arch/powerpc/sysdev/qe_lib/ucc_fast.c
rename to drivers/soc/fsl/qe/ucc_fast.c
index 65aaf15..a768931 100644
--- a/arch/powerpc/sysdev/qe_lib/ucc_fast.c
+++ b/drivers/soc/fsl/qe/ucc_fast.c
@@ -21,11 +21,11 @@
#include <linux/export.h>
#include <asm/io.h>
-#include <asm/immap_qe.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/immap_qe.h>
+#include <soc/fsl/qe/qe.h>
-#include <asm/ucc.h>
-#include <asm/ucc_fast.h>
+#include <soc/fsl/qe/ucc.h>
+#include <soc/fsl/qe/ucc_fast.h>
void ucc_fast_dump_regs(struct ucc_fast_private * uccf)
{
diff --git a/arch/powerpc/sysdev/qe_lib/ucc_slow.c b/drivers/soc/fsl/qe/ucc_slow.c
similarity index 98%
rename from arch/powerpc/sysdev/qe_lib/ucc_slow.c
rename to drivers/soc/fsl/qe/ucc_slow.c
index 5f91628..9334bdb 100644
--- a/arch/powerpc/sysdev/qe_lib/ucc_slow.c
+++ b/drivers/soc/fsl/qe/ucc_slow.c
@@ -21,11 +21,11 @@
#include <linux/export.h>
#include <asm/io.h>
-#include <asm/immap_qe.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/immap_qe.h>
+#include <soc/fsl/qe/qe.h>
-#include <asm/ucc.h>
-#include <asm/ucc_slow.h>
+#include <soc/fsl/qe/ucc.h>
+#include <soc/fsl/qe/ucc_slow.h>
u32 ucc_slow_get_qe_cr_subblock(int uccs_num)
{
diff --git a/drivers/spi/spi-fsl-cpm.c b/drivers/spi/spi-fsl-cpm.c
index 9c46a30..bcb26bb 100644
--- a/drivers/spi/spi-fsl-cpm.c
+++ b/drivers/spi/spi-fsl-cpm.c
@@ -16,7 +16,7 @@
* option) any later version.
*/
#include <asm/cpm.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/qe.h>
#include <linux/dma-mapping.h>
#include <linux/fsl_devices.h>
#include <linux/kernel.h>
diff --git a/drivers/tty/serial/ucc_uart.c b/drivers/tty/serial/ucc_uart.c
index 7d2532b..0b2cccd 100644
--- a/drivers/tty/serial/ucc_uart.c
+++ b/drivers/tty/serial/ucc_uart.c
@@ -31,7 +31,7 @@
#include <linux/dma-mapping.h>
#include <linux/fs_uart_pd.h>
-#include <asm/ucc_slow.h>
+#include <soc/fsl/qe/ucc_slow.h>
#include <linux/firmware.h>
#include <asm/reg.h>
diff --git a/drivers/usb/gadget/udc/fsl_qe_udc.c b/drivers/usb/gadget/udc/fsl_qe_udc.c
index e0822f1..f44659e 100644
--- a/drivers/usb/gadget/udc/fsl_qe_udc.c
+++ b/drivers/usb/gadget/udc/fsl_qe_udc.c
@@ -38,7 +38,7 @@
#include <linux/usb/ch9.h>
#include <linux/usb/gadget.h>
#include <linux/usb/otg.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/qe.h>
#include <asm/cpm.h>
#include <asm/dma.h>
#include <asm/reg.h>
diff --git a/drivers/usb/host/fhci-hcd.c b/drivers/usb/host/fhci-hcd.c
index c6cebb9..0960f41 100644
--- a/drivers/usb/host/fhci-hcd.c
+++ b/drivers/usb/host/fhci-hcd.c
@@ -31,7 +31,7 @@
#include <linux/of_platform.h>
#include <linux/of_gpio.h>
#include <linux/slab.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/qe.h>
#include <asm/fsl_gtm.h>
#include "fhci.h"
diff --git a/drivers/usb/host/fhci-hub.c b/drivers/usb/host/fhci-hub.c
index 3bacdd7..60d55eb 100644
--- a/drivers/usb/host/fhci-hub.c
+++ b/drivers/usb/host/fhci-hub.c
@@ -24,7 +24,7 @@
#include <linux/usb.h>
#include <linux/usb/hcd.h>
#include <linux/gpio.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/qe.h>
#include "fhci.h"
/* virtual root hub specific descriptor */
diff --git a/drivers/usb/host/fhci-sched.c b/drivers/usb/host/fhci-sched.c
index 95ca598..a9609a3 100644
--- a/drivers/usb/host/fhci-sched.c
+++ b/drivers/usb/host/fhci-sched.c
@@ -25,7 +25,7 @@
#include <linux/io.h>
#include <linux/usb.h>
#include <linux/usb/hcd.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/qe.h>
#include <asm/fsl_gtm.h>
#include "fhci.h"
diff --git a/drivers/usb/host/fhci.h b/drivers/usb/host/fhci.h
index 154e6a0..3fc82c1 100644
--- a/drivers/usb/host/fhci.h
+++ b/drivers/usb/host/fhci.h
@@ -27,8 +27,8 @@
#include <linux/io.h>
#include <linux/usb.h>
#include <linux/usb/hcd.h>
-#include <asm/qe.h>
-#include <asm/immap_qe.h>
+#include <soc/fsl/qe/qe.h>
+#include <soc/fsl/qe/immap_qe.h>
#define USB_CLOCK 48000000
diff --git a/arch/powerpc/include/asm/qe_ic.h b/include/linux/fsl/qe/qe_ic.h
similarity index 100%
rename from arch/powerpc/include/asm/qe_ic.h
rename to include/linux/fsl/qe/qe_ic.h
diff --git a/arch/powerpc/include/asm/immap_qe.h b/include/soc/fsl/qe/immap_qe.h
similarity index 100%
rename from arch/powerpc/include/asm/immap_qe.h
rename to include/soc/fsl/qe/immap_qe.h
diff --git a/arch/powerpc/include/asm/qe.h b/include/soc/fsl/qe/qe.h
similarity index 99%
rename from arch/powerpc/include/asm/qe.h
rename to include/soc/fsl/qe/qe.h
index aee968f..7210b2b 100644
--- a/arch/powerpc/include/asm/qe.h
+++ b/include/soc/fsl/qe/qe.h
@@ -23,7 +23,7 @@
#include <linux/of.h>
#include <linux/of_address.h>
#include <linux/types.h>
-#include <asm/immap_qe.h>
+#include <soc/fsl/qe/immap_qe.h>
#define QE_NUM_OF_SNUM 256 /* There are 256 serial number in QE */
#define QE_NUM_OF_BRGS 16
diff --git a/arch/powerpc/include/asm/ucc.h b/include/soc/fsl/qe/ucc.h
similarity index 96%
rename from arch/powerpc/include/asm/ucc.h
rename to include/soc/fsl/qe/ucc.h
index 6927ac2..894f14c 100644
--- a/arch/powerpc/include/asm/ucc.h
+++ b/include/soc/fsl/qe/ucc.h
@@ -15,8 +15,8 @@
#ifndef __UCC_H__
#define __UCC_H__
-#include <asm/immap_qe.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/immap_qe.h>
+#include <soc/fsl/qe/qe.h>
#define STATISTICS
diff --git a/arch/powerpc/include/asm/ucc_fast.h b/include/soc/fsl/qe/ucc_fast.h
similarity index 98%
rename from arch/powerpc/include/asm/ucc_fast.h
rename to include/soc/fsl/qe/ucc_fast.h
index 72ea9ba..df8ea79 100644
--- a/arch/powerpc/include/asm/ucc_fast.h
+++ b/include/soc/fsl/qe/ucc_fast.h
@@ -16,10 +16,10 @@
#include <linux/kernel.h>
-#include <asm/immap_qe.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/immap_qe.h>
+#include <soc/fsl/qe/qe.h>
-#include <asm/ucc.h>
+#include <soc/fsl/qe/ucc.h>
/* Receive BD's status */
#define R_E 0x80000000 /* buffer empty */
diff --git a/arch/powerpc/include/asm/ucc_slow.h b/include/soc/fsl/qe/ucc_slow.h
similarity index 99%
rename from arch/powerpc/include/asm/ucc_slow.h
rename to include/soc/fsl/qe/ucc_slow.h
index 233ef5f..6c0573a 100644
--- a/arch/powerpc/include/asm/ucc_slow.h
+++ b/include/soc/fsl/qe/ucc_slow.h
@@ -17,10 +17,10 @@
#include <linux/kernel.h>
-#include <asm/immap_qe.h>
-#include <asm/qe.h>
+#include <soc/fsl/qe/immap_qe.h>
+#include <soc/fsl/qe/qe.h>
-#include <asm/ucc.h>
+#include <soc/fsl/qe/ucc.h>
/* transmit BD's status */
#define T_R 0x80000000 /* ready bit */
--
2.1.0.27.g96db324
^ permalink raw reply related [flat|nested] 11+ messages in thread
* Re: [PATCH v9 2/5] genalloc:support allocating specific region
2015-09-14 1:38 ` [PATCH v9 2/5] genalloc:support allocating specific region Zhao Qiang
@ 2015-09-17 20:19 ` Scott Wood
2015-09-17 20:25 ` Scott Wood
0 siblings, 1 reply; 11+ messages in thread
From: Scott Wood @ 2015-09-17 20:19 UTC (permalink / raw
To: Zhao Qiang; +Cc: linux-kernel, linuxppc-dev, lauraa, X.xie, benh, leoli, paulus
On Mon, 2015-09-14 at 09:38 +0800, Zhao Qiang wrote:
> Add new algo for genalloc, it reserve a specific region of
> memory matching the size requirement (no alignment constraint)
>
> Signed-off-by: Zhao Qiang <qiang.zhao@freescale.com>
> ---
> Changes for v9:
> - reserve a specific region, if the return region
> - is not during the specific region, return fail.
>
> include/linux/genalloc.h | 11 +++++++++++
> lib/genalloc.c | 30 ++++++++++++++++++++++++++++++
> 2 files changed, 41 insertions(+)
>
> diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h
> index aaf3dc2..85e3b2f 100644
> --- a/include/linux/genalloc.h
> +++ b/include/linux/genalloc.h
> @@ -82,6 +82,13 @@ struct genpool_data_align {
> int align; /* alignment by bytes for starting address */
> };
>
> +/*
> + * gen_pool data descriptor for gen_pool_fixed_fit.
> + */
> +struct genpool_data_fixed {
> + unsigned long offset; /* The offset of the specific region */
> +};
> +
> extern struct gen_pool *gen_pool_create(int, int);
> extern phys_addr_t gen_pool_virt_to_phys(struct gen_pool *pool, unsigned
> long);
> extern int gen_pool_add_virt(struct gen_pool *, unsigned long, phys_addr_t,
> @@ -121,6 +128,10 @@ extern unsigned long gen_pool_first_fit(unsigned long
> *map, unsigned long size,
> unsigned long start, unsigned int nr, void *data,
> struct gen_pool *pool);
>
> +extern unsigned long gen_pool_fixed_fit(unsigned long *map,
> + unsigned long size, unsigned long start, unsigned int nr,
> + void *data, struct gen_pool *pool);
> +
"fixed fit" doesn't make much sense... How about "fixed_alloc"?
/**
> + * gen_pool_fixed_fit - reserve a specific region of
> + * matching the size requirement (no alignment constraint)
> + * @map: The address to base the search on
> + * @size: The bitmap size in bits
> + * @start: The bitnumber to start searching at
> + * @nr: The number of zeroed bits we're looking for
> + * @data: data for alignment
> + * @pool: pool to get order from
> + */
> +unsigned long gen_pool_fixed_fit(unsigned long *map, unsigned long size,
> + unsigned long start, unsigned int nr, void *data,
> + struct gen_pool *pool)
> +{
> + struct genpool_data_fixed *fixed_data;
> + int order;
> + unsigned long offset_bit;
> + unsigned long start_bit;
> +
> + fixed_data = data;
> + order = pool->min_alloc_order;
> + offset_bit = fixed_data->offset >> order;
> + start_bit = bitmap_find_next_zero_area(map, size,
> + start + offset_bit, nr, 0);
> + if (start_bit != offset_bit)
> + start_bit = size;
> + return start_bit;
> +}
> +EXPORT_SYMBOL(gen_pool_fixed_fit);
This would be simpler with bitmap_allocate_region().
-Scott
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v9 2/5] genalloc:support allocating specific region
2015-09-17 20:19 ` Scott Wood
@ 2015-09-17 20:25 ` Scott Wood
0 siblings, 0 replies; 11+ messages in thread
From: Scott Wood @ 2015-09-17 20:25 UTC (permalink / raw
To: Zhao Qiang; +Cc: linux-kernel, linuxppc-dev, lauraa, X.xie, benh, leoli, paulus
On Thu, 2015-09-17 at 15:19 -0500, Scott Wood wrote:
> On Mon, 2015-09-14 at 09:38 +0800, Zhao Qiang wrote:
> > Add new algo for genalloc, it reserve a specific region of
> > memory matching the size requirement (no alignment constraint)
> >
> > Signed-off-by: Zhao Qiang <qiang.zhao@freescale.com>
> > ---
> > Changes for v9:
> > - reserve a specific region, if the return region
> > - is not during the specific region, return fail.
> >
> > include/linux/genalloc.h | 11 +++++++++++
> > lib/genalloc.c | 30 ++++++++++++++++++++++++++++++
> > 2 files changed, 41 insertions(+)
> >
> > diff --git a/include/linux/genalloc.h b/include/linux/genalloc.h
> > index aaf3dc2..85e3b2f 100644
> > --- a/include/linux/genalloc.h
> > +++ b/include/linux/genalloc.h
> > @@ -82,6 +82,13 @@ struct genpool_data_align {
> > int align; /* alignment by bytes for starting address
> > */
> > };
> >
> > +/*
> > + * gen_pool data descriptor for gen_pool_fixed_fit.
> > + */
> > +struct genpool_data_fixed {
> > + unsigned long offset; /* The offset of the specific
> > region */
> > +};
> > +
> > extern struct gen_pool *gen_pool_create(int, int);
> > extern phys_addr_t gen_pool_virt_to_phys(struct gen_pool *pool, unsigned
> > long);
> > extern int gen_pool_add_virt(struct gen_pool *, unsigned long,
> > phys_addr_t,
> > @@ -121,6 +128,10 @@ extern unsigned long gen_pool_first_fit(unsigned
> > long
> > *map, unsigned long size,
> > unsigned long start, unsigned int nr, void *data,
> > struct gen_pool *pool);
> >
> > +extern unsigned long gen_pool_fixed_fit(unsigned long *map,
> > + unsigned long size, unsigned long start, unsigned int nr,
> > + void *data, struct gen_pool *pool);
> > +
>
> "fixed fit" doesn't make much sense... How about "fixed_alloc"?
>
> /**
> > + * gen_pool_fixed_fit - reserve a specific region of
> > + * matching the size requirement (no alignment constraint)
> > + * @map: The address to base the search on
> > + * @size: The bitmap size in bits
> > + * @start: The bitnumber to start searching at
> > + * @nr: The number of zeroed bits we're looking for
> > + * @data: data for alignment
> > + * @pool: pool to get order from
> > + */
> > +unsigned long gen_pool_fixed_fit(unsigned long *map, unsigned long size,
> > + unsigned long start, unsigned int nr, void *data,
> > + struct gen_pool *pool)
> > +{
> > + struct genpool_data_fixed *fixed_data;
> > + int order;
> > + unsigned long offset_bit;
> > + unsigned long start_bit;
> > +
> > + fixed_data = data;
> > + order = pool->min_alloc_order;
> > + offset_bit = fixed_data->offset >> order;
> > + start_bit = bitmap_find_next_zero_area(map, size,
> > + start + offset_bit, nr, 0);
> > + if (start_bit != offset_bit)
> > + start_bit = size;
> > + return start_bit;
> > +}
> > +EXPORT_SYMBOL(gen_pool_fixed_fit);
>
> This would be simpler with bitmap_allocate_region().
Never mind, that doesn't fit with how the algorithm is used by the caller,
and unlike genalloc isn't atomic.
-Scott
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram
2015-09-14 1:38 ` [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram Zhao Qiang
@ 2015-09-17 20:28 ` Scott Wood
2015-09-18 2:35 ` Zhao Qiang
0 siblings, 1 reply; 11+ messages in thread
From: Scott Wood @ 2015-09-17 20:28 UTC (permalink / raw
To: Zhao Qiang; +Cc: linux-kernel, linuxppc-dev, lauraa, X.xie, benh, leoli, paulus
On Mon, 2015-09-14 at 09:38 +0800, Zhao Qiang wrote:
> diff --git a/arch/powerpc/sysdev/qe_lib/qe_common.c
> b/arch/powerpc/sysdev/qe_lib/qe_common.c
> new file mode 100644
> index 0000000..1213458
> --- /dev/null
> +++ b/arch/powerpc/sysdev/qe_lib/qe_common.c
> @@ -0,0 +1,242 @@
> +/*
> + * Freescale QE common code
> + *
> + * Author: Zhao Qiang <qiang.zhao@freescale.com>
> + *
> + * Copyright 2015 Freescale Semiconductor, Inc.
> + *
> + * This program is free software; you can redistribute it and/or modify
> + * it under the terms of the GNU General Public License as published by
> + * the Free Software Foundation; either version 2 of the License, or
> + * (at your option) any later version.
> + */
> +
> +#include <linux/genalloc.h>
> +#include <linux/list.h>
> +#include <linux/init.h>
> +#include <linux/of_device.h>
> +#include <linux/spinlock.h>
> +#include <linux/export.h>
> +#include <linux/of.h>
> +#include <linux/of_address.h>
> +#include <linux/slab.h>
> +
> +#include <linux/io.h>
> +#include <asm/qe.h>
> +
> +static struct gen_pool *muram_pool;
> +static struct genpool_data_align muram_pool_data;
> +static struct genpool_data_fixed muram_pool_data_fixed;
> +static spinlock_t qe_muram_lock;
> +static u8 __iomem *muram_vbase;
> +static phys_addr_t muram_pbase;
> +
> +struct muram_block {
> + struct list_head head;
> + unsigned long start;
> + int size;
> +};
> +
> +static LIST_HEAD(muram_block_list);
> +
> +/* max address size we deal with */
> +#define OF_MAX_ADDR_CELLS 4
> +#define GENPOOL_OFFSET 4096
> +
> +int qe_muram_init(void)
> +{
> + struct device_node *np;
> + struct resource r;
> + u32 zero[OF_MAX_ADDR_CELLS] = {};
> + resource_size_t max = 0;
> + int i = 0;
> + int ret = 0;
> +
> + if (muram_pbase)
> + return 0;
> +
> + np = of_find_compatible_node(NULL, NULL, "fsl,qe-muram-data");
> + if (!np) {
> + /* try legacy bindings */
> + np = of_find_node_by_name(NULL, "data-only");
> + if (!np) {
> + pr_err("Cannot find CPM muram data node");
> + ret = -ENODEV;
> + goto out;
> + }
> + }
> +
> + muram_pool = gen_pool_create(1, -1);
> + muram_pbase = of_translate_address(np, zero);
> + if (muram_pbase == (phys_addr_t)OF_BAD_ADDR) {
> + pr_err("Cannot translate zero through CPM muram node");
> + ret = -ENODEV;
> + goto err;
> + }
> +
> + while (of_address_to_resource(np, i++, &r) == 0) {
> + if (r.end > max)
> + max = r.end;
> + ret = gen_pool_add(muram_pool, r.start - muram_pbase +
> + GENPOOL_OFFSET, resource_size(&r), -1);
> + if (ret) {
> + pr_err("QE: couldn't add muram to pool!\n");
> + goto err;
> + }
> +
> + }
> +
> + muram_vbase = ioremap(muram_pbase, max - muram_pbase + 1);
> + if (!muram_vbase) {
> + pr_err("Cannot map QE muram");
> + ret = -ENOMEM;
> + goto err;
> + }
> + goto out;
> +err:
> + gen_pool_destroy(muram_pool);
> +out:
> + of_node_put(np);
> + return ret;
> +}
> +
> +/*
> + * qe_muram_alloc - allocate the requested size worth of multi-user ram
> + * @size: number of bytes to allocate
> + * @align: requested alignment, in bytes
> + *
> + * This function returns an offset into the muram area.
> + */
> +unsigned long qe_muram_alloc(unsigned long size, unsigned long align)
> +{
> + unsigned long start;
> + unsigned long flags;
> + struct muram_block *entry;
> +
> + spin_lock_irqsave(&qe_muram_lock, flags);
> + muram_pool_data.align = align;
> + gen_pool_set_algo(muram_pool, gen_pool_first_fit_align,
> + &muram_pool_data);
> + start = gen_pool_alloc(muram_pool, size);
> + if (!start)
> + goto out2;
> + start = start - GENPOOL_OFFSET;
> + memset(qe_muram_addr(start), 0, size);
> + entry = kmalloc(sizeof(*entry), GFP_KERNEL);
> + if (!entry)
> + goto out1;
> + entry->start = start;
> + entry->size = size;
> + list_add(&entry->head, &muram_block_list);
> + spin_unlock_irqrestore(&qe_muram_lock, flags);
> +
> + return start;
> +out1:
> + gen_pool_free(muram_pool, start, size);
> +out2:
> + spin_unlock_irqrestore(&qe_muram_lock, flags);
> + return (unsigned long) -ENOMEM;
> +}
> +EXPORT_SYMBOL(qe_muram_alloc);
> +
> +/*
> + * qe_muram_alloc_fixed - reserve a specific region of multi-user ram
> + * @size: number of bytes to allocate
> + * @offset: offset of allocation start address
> + *
> + * This function returns an offset into the muram area.
> + */
> +unsigned long qe_muram_alloc_fixed(unsigned long offset, unsigned long
> size)
> +{
> +
> + unsigned long start;
> + unsigned long flags;
> + unsigned long size_alloc = size;
> + struct muram_block *entry;
> + int end_bit;
> + int order = muram_pool -> min_alloc_order;
> +
> + spin_lock_irqsave(&qe_muram_lock, flags);
> + end_bit = (offset >> order) + ((size + (1UL << order) - 1) >> order);
> + if ((offset + size) > (end_bit << order))
> + size_alloc = size + (1UL << order);
> +
> + muram_pool_data_fixed.offset = offset + GENPOOL_OFFSET;
> + gen_pool_set_algo(muram_pool, gen_pool_fixed_fit,
> + &muram_pool_data_fixed);
> + start = gen_pool_alloc(muram_pool, size_alloc);
> + if (!start)
> + goto out2;
> + start = start - GENPOOL_OFFSET;
> + memset(qe_muram_addr(start), 0, size_alloc);
> + entry = kmalloc(sizeof(*entry), GFP_KERNEL);
> + if (!entry)
> + goto out1;
> + entry->start = start;
> + entry->size = size_alloc;
> + list_add(&entry->head, &muram_block_list);
> + spin_unlock_irqrestore(&qe_muram_lock, flags);
> +
> + return start;
> +out1:
> + gen_pool_free(muram_pool, start, size_alloc);
> +out2:
> + spin_unlock_irqrestore(&qe_muram_lock, flags);
> + return (unsigned long) -ENOMEM;
> +
> +
> +}
> +EXPORT_SYMBOL(qe_muram_alloc_fixed);
> +
> +/**
> + * qe_muram_free - free a chunk of multi-user ram
> + * @offset: The beginning of the chunk as returned by qe_muram_alloc().
> + */
> +int qe_muram_free(unsigned long offset)
> +{
> + unsigned long flags;
> + int size;
> + struct muram_block *tmp;
> +
> + size = 0;
> + spin_lock_irqsave(&qe_muram_lock, flags);
> + list_for_each_entry(tmp, &muram_block_list, head) {
> + if (tmp->start == offset) {
> + size = tmp->size;
> + list_del(&tmp->head);
> + kfree(tmp);
> + break;
> + }
> + }
> + gen_pool_free(muram_pool, offset + GENPOOL_OFFSET, size);
> + spin_unlock_irqrestore(&qe_muram_lock, flags);
> +
> + return size;
> +}
> +EXPORT_SYMBOL(qe_muram_free);
> +
> +/**
> + * qe_muram_addr - turn a muram offset into a virtual address
> + * @offset: muram offset to convert
> + */
> +void __iomem *qe_muram_addr(unsigned long offset)
> +{
> + return muram_vbase + offset;
> +}
> +EXPORT_SYMBOL(qe_muram_addr);
> +
> +unsigned long qe_muram_offset(void __iomem *addr)
> +{
> + return addr - (void __iomem *)muram_vbase;
> +}
> +EXPORT_SYMBOL(qe_muram_offset);
> +
> +/**
> + * qe_muram_dma - turn a muram virtual address into a DMA address
> + * @offset: virtual address from qe_muram_addr() to convert
> + */
> +dma_addr_t qe_muram_dma(void __iomem *addr)
> +{
> + return muram_pbase + ((u8 __iomem *)addr - muram_vbase);
> +}
> +EXPORT_SYMBOL(qe_muram_dma);
Why are you adding new functions rather than replacing the implementation of
the old ones?
Again, I don't want to see a big addition in one place and a big deletion
elsewhere. I want to see the actual code changes as a diff. Any moving
around of code must be a separate patch from making changes to it that are
significant enough that git format-patch doesn't detect it as a move.
-Scott
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram
2015-09-17 20:28 ` Scott Wood
@ 2015-09-18 2:35 ` Zhao Qiang
0 siblings, 0 replies; 11+ messages in thread
From: Zhao Qiang @ 2015-09-18 2:35 UTC (permalink / raw
To: Scott Wood
Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
lauraa@codeaurora.org, Xiaobo Xie, benh@kernel.crashing.org,
Li Leo, paulus@samba.org
[-- Warning: decoded text below may be mangled, UTF-8 assumed --]
[-- Attachment #1: Type: text/plain; charset="utf-8", Size: 9443 bytes --]
On Mon, 2015-09-18 at 04:28 +0800, Wood Scott-B07421 wrote:
> -----Original Message-----
> From: Wood Scott-B07421
> Sent: Friday, September 18, 2015 4:28 AM
> To: Zhao Qiang-B45475
> Cc: linux-kernel@vger.kernel.org; linuxppc-dev@lists.ozlabs.org;
> lauraa@codeaurora.org; Xie Xiaobo-R63061; benh@kernel.crashing.org; Li
> Yang-Leo-R58472; paulus@samba.org
> Subject: Re: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage
> muram
>
> On Mon, 2015-09-14 at 09:38 +0800, Zhao Qiang wrote:
> > diff --git a/arch/powerpc/sysdev/qe_lib/qe_common.c
> > b/arch/powerpc/sysdev/qe_lib/qe_common.c
> > new file mode 100644
> > index 0000000..1213458
> > --- /dev/null
> > +++ b/arch/powerpc/sysdev/qe_lib/qe_common.c
> > @@ -0,0 +1,242 @@
> > +/*
> > + * Freescale QE common code
> > + *
> > + * Author: Zhao Qiang <qiang.zhao@freescale.com>
> > + *
> > + * Copyright 2015 Freescale Semiconductor, Inc.
> > + *
> > + * This program is free software; you can redistribute it and/or
> > +modify
> > + * it under the terms of the GNU General Public License as published
> > +by
> > + * the Free Software Foundation; either version 2 of the License, or
> > + * (at your option) any later version.
> > + */
> > +
> > +#include <linux/genalloc.h>
> > +#include <linux/list.h>
> > +#include <linux/init.h>
> > +#include <linux/of_device.h>
> > +#include <linux/spinlock.h>
> > +#include <linux/export.h>
> > +#include <linux/of.h>
> > +#include <linux/of_address.h>
> > +#include <linux/slab.h>
> > +
> > +#include <linux/io.h>
> > +#include <asm/qe.h>
> > +
> > +static struct gen_pool *muram_pool;
> > +static struct genpool_data_align muram_pool_data; static struct
> > +genpool_data_fixed muram_pool_data_fixed; static spinlock_t
> > +qe_muram_lock; static u8 __iomem *muram_vbase; static phys_addr_t
> > +muram_pbase;
> > +
> > +struct muram_block {
> > + struct list_head head;
> > + unsigned long start;
> > + int size;
> > +};
> > +
> > +static LIST_HEAD(muram_block_list);
> > +
> > +/* max address size we deal with */
> > +#define OF_MAX_ADDR_CELLS 4
> > +#define GENPOOL_OFFSET 4096
> > +
> > +int qe_muram_init(void)
> > +{
> > + struct device_node *np;
> > + struct resource r;
> > + u32 zero[OF_MAX_ADDR_CELLS] = {};
> > + resource_size_t max = 0;
> > + int i = 0;
> > + int ret = 0;
> > +
> > + if (muram_pbase)
> > + return 0;
> > +
> > + np = of_find_compatible_node(NULL, NULL, "fsl,qe-muram-data");
> > + if (!np) {
> > + /* try legacy bindings */
> > + np = of_find_node_by_name(NULL, "data-only");
> > + if (!np) {
> > + pr_err("Cannot find CPM muram data node");
> > + ret = -ENODEV;
> > + goto out;
> > + }
> > + }
> > +
> > + muram_pool = gen_pool_create(1, -1);
> > + muram_pbase = of_translate_address(np, zero);
> > + if (muram_pbase == (phys_addr_t)OF_BAD_ADDR) {
> > + pr_err("Cannot translate zero through CPM muram node");
> > + ret = -ENODEV;
> > + goto err;
> > + }
> > +
> > + while (of_address_to_resource(np, i++, &r) == 0) {
> > + if (r.end > max)
> > + max = r.end;
> > + ret = gen_pool_add(muram_pool, r.start - muram_pbase +
> > + GENPOOL_OFFSET, resource_size(&r), -1);
> > + if (ret) {
> > + pr_err("QE: couldn't add muram to
> pool!\n");
> > + goto err;
> > + }
> > +
> > + }
> > +
> > + muram_vbase = ioremap(muram_pbase, max - muram_pbase + 1);
> > + if (!muram_vbase) {
> > + pr_err("Cannot map QE muram");
> > + ret = -ENOMEM;
> > + goto err;
> > + }
> > + goto out;
> > +err:
> > + gen_pool_destroy(muram_pool);
> > +out:
> > + of_node_put(np);
> > + return ret;
> > +}
> > +
> > +/*
> > + * qe_muram_alloc - allocate the requested size worth of multi-user
> > +ram
> > + * @size: number of bytes to allocate
> > + * @align: requested alignment, in bytes
> > + *
> > + * This function returns an offset into the muram area.
> > + */
> > +unsigned long qe_muram_alloc(unsigned long size, unsigned long align)
> > +{
> > + unsigned long start;
> > + unsigned long flags;
> > + struct muram_block *entry;
> > +
> > + spin_lock_irqsave(&qe_muram_lock, flags);
> > + muram_pool_data.align = align;
> > + gen_pool_set_algo(muram_pool, gen_pool_first_fit_align,
> > + &muram_pool_data);
> > + start = gen_pool_alloc(muram_pool, size);
> > + if (!start)
> > + goto out2;
> > + start = start - GENPOOL_OFFSET;
> > + memset(qe_muram_addr(start), 0, size);
> > + entry = kmalloc(sizeof(*entry), GFP_KERNEL);
> > + if (!entry)
> > + goto out1;
> > + entry->start = start;
> > + entry->size = size;
> > + list_add(&entry->head, &muram_block_list);
> > + spin_unlock_irqrestore(&qe_muram_lock, flags);
> > +
> > + return start;
> > +out1:
> > + gen_pool_free(muram_pool, start, size);
> > +out2:
> > + spin_unlock_irqrestore(&qe_muram_lock, flags);
> > + return (unsigned long) -ENOMEM;
> > +}
> > +EXPORT_SYMBOL(qe_muram_alloc);
> > +
> > +/*
> > + * qe_muram_alloc_fixed - reserve a specific region of multi-user ram
> > + * @size: number of bytes to allocate
> > + * @offset: offset of allocation start address
> > + *
> > + * This function returns an offset into the muram area.
> > + */
> > +unsigned long qe_muram_alloc_fixed(unsigned long offset, unsigned
> > +long
> > size)
> > +{
> > +
> > + unsigned long start;
> > + unsigned long flags;
> > + unsigned long size_alloc = size;
> > + struct muram_block *entry;
> > + int end_bit;
> > + int order = muram_pool -> min_alloc_order;
> > +
> > + spin_lock_irqsave(&qe_muram_lock, flags);
> > + end_bit = (offset >> order) + ((size + (1UL << order) - 1) >>
> order);
> > + if ((offset + size) > (end_bit << order))
> > + size_alloc = size + (1UL << order);
> > +
> > + muram_pool_data_fixed.offset = offset + GENPOOL_OFFSET;
> > + gen_pool_set_algo(muram_pool, gen_pool_fixed_fit,
> > + &muram_pool_data_fixed);
> > + start = gen_pool_alloc(muram_pool, size_alloc);
> > + if (!start)
> > + goto out2;
> > + start = start - GENPOOL_OFFSET;
> > + memset(qe_muram_addr(start), 0, size_alloc);
> > + entry = kmalloc(sizeof(*entry), GFP_KERNEL);
> > + if (!entry)
> > + goto out1;
> > + entry->start = start;
> > + entry->size = size_alloc;
> > + list_add(&entry->head, &muram_block_list);
> > + spin_unlock_irqrestore(&qe_muram_lock, flags);
> > +
> > + return start;
> > +out1:
> > + gen_pool_free(muram_pool, start, size_alloc);
> > +out2:
> > + spin_unlock_irqrestore(&qe_muram_lock, flags);
> > + return (unsigned long) -ENOMEM;
> > +
> > +
> > +}
> > +EXPORT_SYMBOL(qe_muram_alloc_fixed);
> > +
> > +/**
> > + * qe_muram_free - free a chunk of multi-user ram
> > + * @offset: The beginning of the chunk as returned by qe_muram_alloc().
> > + */
> > +int qe_muram_free(unsigned long offset) {
> > + unsigned long flags;
> > + int size;
> > + struct muram_block *tmp;
> > +
> > + size = 0;
> > + spin_lock_irqsave(&qe_muram_lock, flags);
> > + list_for_each_entry(tmp, &muram_block_list, head) {
> > + if (tmp->start == offset) {
> > + size = tmp->size;
> > + list_del(&tmp->head);
> > + kfree(tmp);
> > + break;
> > + }
> > + }
> > + gen_pool_free(muram_pool, offset + GENPOOL_OFFSET, size);
> > + spin_unlock_irqrestore(&qe_muram_lock, flags);
> > +
> > + return size;
> > +}
> > +EXPORT_SYMBOL(qe_muram_free);
> > +
> > +/**
> > + * qe_muram_addr - turn a muram offset into a virtual address
> > + * @offset: muram offset to convert
> > + */
> > +void __iomem *qe_muram_addr(unsigned long offset) {
> > + return muram_vbase + offset;
> > +}
> > +EXPORT_SYMBOL(qe_muram_addr);
> > +
> > +unsigned long qe_muram_offset(void __iomem *addr) {
> > + return addr - (void __iomem *)muram_vbase; }
> > +EXPORT_SYMBOL(qe_muram_offset);
> > +
> > +/**
> > + * qe_muram_dma - turn a muram virtual address into a DMA address
> > + * @offset: virtual address from qe_muram_addr() to convert */
> > +dma_addr_t qe_muram_dma(void __iomem *addr) {
> > + return muram_pbase + ((u8 __iomem *)addr - muram_vbase); }
> > +EXPORT_SYMBOL(qe_muram_dma);
>
> Why are you adding new functions rather than replacing the implementation
> of the old ones?
>
> Again, I don't want to see a big addition in one place and a big deletion
> elsewhere. I want to see the actual code changes as a diff. Any moving
> around of code must be a separate patch from making changes to it that
> are significant enough that git format-patch doesn't detect it as a move.
Modify cpm_muram functions with genalloc first, Then move it to qe_muram with
churn of cpm_muram_* and qe_mura_*? Or other method?
>
> -Scott
ÿôèº{.nÇ+·®+%Ëÿ±éݶ\x17¥wÿº{.nÇ+·¥{±þG«éÿ{ayº\x1dÊÚë,j\a¢f£¢·hïêÿêçz_è®\x03(éÝ¢j"ú\x1a¶^[m§ÿÿ¾\a«þG«éÿ¢¸?¨èÚ&£ø§~á¶iOæ¬z·vØ^\x14\x04\x1a¶^[m§ÿÿÃ\fÿ¶ìÿ¢¸?I¥
^ permalink raw reply [flat|nested] 11+ messages in thread
* RE: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram
@ 2015-09-18 2:35 ` Zhao Qiang
0 siblings, 0 replies; 11+ messages in thread
From: Zhao Qiang @ 2015-09-18 2:35 UTC (permalink / raw
To: Scott Wood
Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
lauraa@codeaurora.org, Xiaobo Xie, benh@kernel.crashing.org,
Li Leo, paulus@samba.org
T24gTW9uLCAyMDE1LTA5LTE4IGF0IDA0OjI4ICswODAwLCBXb29kIFNjb3R0LUIwNzQyMSB3cm90
ZToNCj4gLS0tLS1PcmlnaW5hbCBNZXNzYWdlLS0tLS0NCj4gRnJvbTogV29vZCBTY290dC1CMDc0
MjENCj4gU2VudDogRnJpZGF5LCBTZXB0ZW1iZXIgMTgsIDIwMTUgNDoyOCBBTQ0KPiBUbzogWmhh
byBRaWFuZy1CNDU0NzUNCj4gQ2M6IGxpbnV4LWtlcm5lbEB2Z2VyLmtlcm5lbC5vcmc7IGxpbnV4
cHBjLWRldkBsaXN0cy5vemxhYnMub3JnOw0KPiBsYXVyYWFAY29kZWF1cm9yYS5vcmc7IFhpZSBY
aWFvYm8tUjYzMDYxOyBiZW5oQGtlcm5lbC5jcmFzaGluZy5vcmc7IExpDQo+IFlhbmctTGVvLVI1
ODQ3MjsgcGF1bHVzQHNhbWJhLm9yZw0KPiBTdWJqZWN0OiBSZTogW1BBVENIIHY5IDMvNV0gcWVf
Y29tbW9uOiBhZGQgcWVfbXVyYW1fIGZ1bmN0aW9ucyB0byBtYW5hZ2UNCj4gbXVyYW0NCj4gDQo+
IE9uIE1vbiwgMjAxNS0wOS0xNCBhdCAwOTozOCArMDgwMCwgWmhhbyBRaWFuZyB3cm90ZToNCj4g
PiBkaWZmIC0tZ2l0IGEvYXJjaC9wb3dlcnBjL3N5c2Rldi9xZV9saWIvcWVfY29tbW9uLmMNCj4g
PiBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlX2NvbW1vbi5jDQo+ID4gbmV3IGZpbGUg
bW9kZSAxMDA2NDQNCj4gPiBpbmRleCAwMDAwMDAwLi4xMjEzNDU4DQo+ID4gLS0tIC9kZXYvbnVs
bA0KPiA+ICsrKyBiL2FyY2gvcG93ZXJwYy9zeXNkZXYvcWVfbGliL3FlX2NvbW1vbi5jDQo+ID4g
QEAgLTAsMCArMSwyNDIgQEANCj4gPiArLyoNCj4gPiArICogRnJlZXNjYWxlIFFFIGNvbW1vbiBj
b2RlDQo+ID4gKyAqDQo+ID4gKyAqIEF1dGhvcjogWmhhbyBRaWFuZyAgPHFpYW5nLnpoYW9AZnJl
ZXNjYWxlLmNvbT4NCj4gPiArICoNCj4gPiArICogQ29weXJpZ2h0IDIwMTUgRnJlZXNjYWxlIFNl
bWljb25kdWN0b3IsIEluYy4NCj4gPiArICoNCj4gPiArICogVGhpcyBwcm9ncmFtIGlzIGZyZWUg
c29mdHdhcmU7IHlvdSBjYW4gcmVkaXN0cmlidXRlIGl0IGFuZC9vcg0KPiA+ICttb2RpZnkNCj4g
PiArICogaXQgdW5kZXIgdGhlIHRlcm1zIG9mIHRoZSBHTlUgR2VuZXJhbCBQdWJsaWMgTGljZW5z
ZSBhcyBwdWJsaXNoZWQNCj4gPiArYnkNCj4gPiArICogdGhlIEZyZWUgU29mdHdhcmUgRm91bmRh
dGlvbjsgZWl0aGVyIHZlcnNpb24gMiBvZiB0aGUgTGljZW5zZSwgb3INCj4gPiArICogKGF0IHlv
dXIgb3B0aW9uKSBhbnkgbGF0ZXIgdmVyc2lvbi4NCj4gPiArICovDQo+ID4gKw0KPiA+ICsjaW5j
bHVkZSA8bGludXgvZ2VuYWxsb2MuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L2xpc3QuaD4NCj4g
PiArI2luY2x1ZGUgPGxpbnV4L2luaXQuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L29mX2Rldmlj
ZS5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvc3BpbmxvY2suaD4NCj4gPiArI2luY2x1ZGUgPGxp
bnV4L2V4cG9ydC5oPg0KPiA+ICsjaW5jbHVkZSA8bGludXgvb2YuaD4NCj4gPiArI2luY2x1ZGUg
PGxpbnV4L29mX2FkZHJlc3MuaD4NCj4gPiArI2luY2x1ZGUgPGxpbnV4L3NsYWIuaD4NCj4gPiAr
DQo+ID4gKyNpbmNsdWRlIDxsaW51eC9pby5oPg0KPiA+ICsjaW5jbHVkZSA8YXNtL3FlLmg+DQo+
ID4gKw0KPiA+ICtzdGF0aWMgc3RydWN0IGdlbl9wb29sICptdXJhbV9wb29sOw0KPiA+ICtzdGF0
aWMgc3RydWN0IGdlbnBvb2xfZGF0YV9hbGlnbiBtdXJhbV9wb29sX2RhdGE7IHN0YXRpYyBzdHJ1
Y3QNCj4gPiArZ2VucG9vbF9kYXRhX2ZpeGVkIG11cmFtX3Bvb2xfZGF0YV9maXhlZDsgc3RhdGlj
IHNwaW5sb2NrX3QNCj4gPiArcWVfbXVyYW1fbG9jazsgc3RhdGljIHU4IF9faW9tZW0gKm11cmFt
X3ZiYXNlOyBzdGF0aWMgcGh5c19hZGRyX3QNCj4gPiArbXVyYW1fcGJhc2U7DQo+ID4gKw0KPiA+
ICtzdHJ1Y3QgbXVyYW1fYmxvY2sgew0KPiA+ICsgICAgIHN0cnVjdCBsaXN0X2hlYWQgaGVhZDsN
Cj4gPiArICAgICB1bnNpZ25lZCBsb25nIHN0YXJ0Ow0KPiA+ICsgICAgIGludCBzaXplOw0KPiA+
ICt9Ow0KPiA+ICsNCj4gPiArc3RhdGljIExJU1RfSEVBRChtdXJhbV9ibG9ja19saXN0KTsNCj4g
PiArDQo+ID4gKy8qIG1heCBhZGRyZXNzIHNpemUgd2UgZGVhbCB3aXRoICovDQo+ID4gKyNkZWZp
bmUgT0ZfTUFYX0FERFJfQ0VMTFMgICAgNA0KPiA+ICsjZGVmaW5lIEdFTlBPT0xfT0ZGU0VUICAg
ICAgICAgICAgICAgNDA5Ng0KPiA+ICsNCj4gPiAraW50IHFlX211cmFtX2luaXQodm9pZCkNCj4g
PiArew0KPiA+ICsgICAgIHN0cnVjdCBkZXZpY2Vfbm9kZSAqbnA7DQo+ID4gKyAgICAgc3RydWN0
IHJlc291cmNlIHI7DQo+ID4gKyAgICAgdTMyIHplcm9bT0ZfTUFYX0FERFJfQ0VMTFNdID0ge307
DQo+ID4gKyAgICAgcmVzb3VyY2Vfc2l6ZV90IG1heCA9IDA7DQo+ID4gKyAgICAgaW50IGkgPSAw
Ow0KPiA+ICsgICAgIGludCByZXQgPSAwOw0KPiA+ICsNCj4gPiArICAgICBpZiAobXVyYW1fcGJh
c2UpDQo+ID4gKyAgICAgICAgICAgICByZXR1cm4gMDsNCj4gPiArDQo+ID4gKyAgICAgbnAgPSBv
Zl9maW5kX2NvbXBhdGlibGVfbm9kZShOVUxMLCBOVUxMLCAiZnNsLHFlLW11cmFtLWRhdGEiKTsN
Cj4gPiArICAgICBpZiAoIW5wKSB7DQo+ID4gKyAgICAgICAgICAgICAvKiB0cnkgbGVnYWN5IGJp
bmRpbmdzICovDQo+ID4gKyAgICAgICAgICAgICBucCA9IG9mX2ZpbmRfbm9kZV9ieV9uYW1lKE5V
TEwsICJkYXRhLW9ubHkiKTsNCj4gPiArICAgICAgICAgICAgIGlmICghbnApIHsNCj4gPiArICAg
ICAgICAgICAgICAgICAgICAgcHJfZXJyKCJDYW5ub3QgZmluZCBDUE0gbXVyYW0gZGF0YSBub2Rl
Iik7DQo+ID4gKyAgICAgICAgICAgICAgICAgICAgIHJldCA9IC1FTk9ERVY7DQo+ID4gKyAgICAg
ICAgICAgICAgICAgICAgIGdvdG8gb3V0Ow0KPiA+ICsgICAgICAgICAgICAgfQ0KPiA+ICsgICAg
IH0NCj4gPiArDQo+ID4gKyAgICAgbXVyYW1fcG9vbCA9IGdlbl9wb29sX2NyZWF0ZSgxLCAtMSk7
DQo+ID4gKyAgICAgbXVyYW1fcGJhc2UgPSBvZl90cmFuc2xhdGVfYWRkcmVzcyhucCwgemVybyk7
DQo+ID4gKyAgICAgaWYgKG11cmFtX3BiYXNlID09IChwaHlzX2FkZHJfdClPRl9CQURfQUREUikg
ew0KPiA+ICsgICAgICAgICAgICAgcHJfZXJyKCJDYW5ub3QgdHJhbnNsYXRlIHplcm8gdGhyb3Vn
aCBDUE0gbXVyYW0gbm9kZSIpOw0KPiA+ICsgICAgICAgICAgICAgcmV0ID0gLUVOT0RFVjsNCj4g
PiArICAgICAgICAgICAgIGdvdG8gZXJyOw0KPiA+ICsgICAgIH0NCj4gPiArDQo+ID4gKyAgICAg
d2hpbGUgKG9mX2FkZHJlc3NfdG9fcmVzb3VyY2UobnAsIGkrKywgJnIpID09IDApIHsNCj4gPiAr
ICAgICAgICAgICAgIGlmIChyLmVuZCA+IG1heCkNCj4gPiArICAgICAgICAgICAgICAgICAgICAg
bWF4ID0gci5lbmQ7DQo+ID4gKyAgICAgICAgICAgICByZXQgPSBnZW5fcG9vbF9hZGQobXVyYW1f
cG9vbCwgci5zdGFydCAtIG11cmFtX3BiYXNlICsNCj4gPiArICAgICAgICAgICAgICAgICAgICAg
ICAgICAgICAgICBHRU5QT09MX09GRlNFVCwgcmVzb3VyY2Vfc2l6ZSgmciksIC0xKTsNCj4gPiAr
ICAgICAgICAgICAgIGlmIChyZXQpIHsNCj4gPiArICAgICAgICAgICAgICAgICAgICAgICAgICAg
ICBwcl9lcnIoIlFFOiBjb3VsZG4ndCBhZGQgbXVyYW0gdG8NCj4gcG9vbCFcbiIpOw0KPiA+ICsg
ICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gZXJyOw0KPiA+ICsgICAgICAgICAgICAg
ICAgICAgICB9DQo+ID4gKw0KPiA+ICsgICAgIH0NCj4gPiArDQo+ID4gKyAgICAgbXVyYW1fdmJh
c2UgPSBpb3JlbWFwKG11cmFtX3BiYXNlLCBtYXggLSBtdXJhbV9wYmFzZSArIDEpOw0KPiA+ICsg
ICAgIGlmICghbXVyYW1fdmJhc2UpIHsNCj4gPiArICAgICAgICAgICAgIHByX2VycigiQ2Fubm90
IG1hcCBRRSBtdXJhbSIpOw0KPiA+ICsgICAgICAgICAgICAgcmV0ID0gLUVOT01FTTsNCj4gPiAr
ICAgICAgICAgICAgIGdvdG8gZXJyOw0KPiA+ICsgICAgIH0NCj4gPiArICAgICBnb3RvIG91dDsN
Cj4gPiArZXJyOg0KPiA+ICsgICAgIGdlbl9wb29sX2Rlc3Ryb3kobXVyYW1fcG9vbCk7DQo+ID4g
K291dDoNCj4gPiArICAgICBvZl9ub2RlX3B1dChucCk7DQo+ID4gKyAgICAgcmV0dXJuIHJldDsN
Cj4gPiArfQ0KPiA+ICsNCj4gPiArLyoNCj4gPiArICogcWVfbXVyYW1fYWxsb2MgLSBhbGxvY2F0
ZSB0aGUgcmVxdWVzdGVkIHNpemUgd29ydGggb2YgbXVsdGktdXNlcg0KPiA+ICtyYW0NCj4gPiAr
ICogQHNpemU6IG51bWJlciBvZiBieXRlcyB0byBhbGxvY2F0ZQ0KPiA+ICsgKiBAYWxpZ246IHJl
cXVlc3RlZCBhbGlnbm1lbnQsIGluIGJ5dGVzDQo+ID4gKyAqDQo+ID4gKyAqIFRoaXMgZnVuY3Rp
b24gcmV0dXJucyBhbiBvZmZzZXQgaW50byB0aGUgbXVyYW0gYXJlYS4NCj4gPiArICovDQo+ID4g
K3Vuc2lnbmVkIGxvbmcgcWVfbXVyYW1fYWxsb2ModW5zaWduZWQgbG9uZyBzaXplLCB1bnNpZ25l
ZCBsb25nIGFsaWduKQ0KPiA+ICt7DQo+ID4gKyAgICAgdW5zaWduZWQgbG9uZyBzdGFydDsNCj4g
PiArICAgICB1bnNpZ25lZCBsb25nIGZsYWdzOw0KPiA+ICsgICAgIHN0cnVjdCBtdXJhbV9ibG9j
ayAqZW50cnk7DQo+ID4gKw0KPiA+ICsgICAgIHNwaW5fbG9ja19pcnFzYXZlKCZxZV9tdXJhbV9s
b2NrLCBmbGFncyk7DQo+ID4gKyAgICAgbXVyYW1fcG9vbF9kYXRhLmFsaWduID0gYWxpZ247DQo+
ID4gKyAgICAgZ2VuX3Bvb2xfc2V0X2FsZ28obXVyYW1fcG9vbCwgZ2VuX3Bvb2xfZmlyc3RfZml0
X2FsaWduLA0KPiA+ICsgICAgICAgICAgICAgICAgICAgICAgICZtdXJhbV9wb29sX2RhdGEpOw0K
PiA+ICsgICAgIHN0YXJ0ID0gZ2VuX3Bvb2xfYWxsb2MobXVyYW1fcG9vbCwgc2l6ZSk7DQo+ID4g
KyAgICAgaWYgKCFzdGFydCkNCj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0MjsNCj4gPiArICAg
ICBzdGFydCA9IHN0YXJ0IC0gR0VOUE9PTF9PRkZTRVQ7DQo+ID4gKyAgICAgbWVtc2V0KHFlX211
cmFtX2FkZHIoc3RhcnQpLCAwLCBzaXplKTsNCj4gPiArICAgICBlbnRyeSA9IGttYWxsb2Moc2l6
ZW9mKCplbnRyeSksIEdGUF9LRVJORUwpOw0KPiA+ICsgICAgIGlmICghZW50cnkpDQo+ID4gKyAg
ICAgICAgICAgICBnb3RvIG91dDE7DQo+ID4gKyAgICAgZW50cnktPnN0YXJ0ID0gc3RhcnQ7DQo+
ID4gKyAgICAgZW50cnktPnNpemUgPSBzaXplOw0KPiA+ICsgICAgIGxpc3RfYWRkKCZlbnRyeS0+
aGVhZCwgJm11cmFtX2Jsb2NrX2xpc3QpOw0KPiA+ICsgICAgIHNwaW5fdW5sb2NrX2lycXJlc3Rv
cmUoJnFlX211cmFtX2xvY2ssIGZsYWdzKTsNCj4gPiArDQo+ID4gKyAgICAgcmV0dXJuIHN0YXJ0
Ow0KPiA+ICtvdXQxOg0KPiA+ICsgICAgIGdlbl9wb29sX2ZyZWUobXVyYW1fcG9vbCwgc3RhcnQs
IHNpemUpOw0KPiA+ICtvdXQyOg0KPiA+ICsgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFl
X211cmFtX2xvY2ssIGZsYWdzKTsNCj4gPiArICAgICByZXR1cm4gKHVuc2lnbmVkIGxvbmcpIC1F
Tk9NRU07DQo+ID4gK30NCj4gPiArRVhQT1JUX1NZTUJPTChxZV9tdXJhbV9hbGxvYyk7DQo+ID4g
Kw0KPiA+ICsvKg0KPiA+ICsgKiBxZV9tdXJhbV9hbGxvY19maXhlZCAtIHJlc2VydmUgYSBzcGVj
aWZpYyByZWdpb24gb2YgbXVsdGktdXNlciByYW0NCj4gPiArICogQHNpemU6IG51bWJlciBvZiBi
eXRlcyB0byBhbGxvY2F0ZQ0KPiA+ICsgKiBAb2Zmc2V0OiBvZmZzZXQgb2YgYWxsb2NhdGlvbiBz
dGFydCBhZGRyZXNzDQo+ID4gKyAqDQo+ID4gKyAqIFRoaXMgZnVuY3Rpb24gcmV0dXJucyBhbiBv
ZmZzZXQgaW50byB0aGUgbXVyYW0gYXJlYS4NCj4gPiArICovDQo+ID4gK3Vuc2lnbmVkIGxvbmcg
cWVfbXVyYW1fYWxsb2NfZml4ZWQodW5zaWduZWQgbG9uZyBvZmZzZXQsIHVuc2lnbmVkDQo+ID4g
K2xvbmcNCj4gPiBzaXplKQ0KPiA+ICt7DQo+ID4gKw0KPiA+ICsgICAgIHVuc2lnbmVkIGxvbmcg
c3RhcnQ7DQo+ID4gKyAgICAgdW5zaWduZWQgbG9uZyBmbGFnczsNCj4gPiArICAgICB1bnNpZ25l
ZCBsb25nIHNpemVfYWxsb2MgPSBzaXplOw0KPiA+ICsgICAgIHN0cnVjdCBtdXJhbV9ibG9jayAq
ZW50cnk7DQo+ID4gKyAgICAgaW50IGVuZF9iaXQ7DQo+ID4gKyAgICAgaW50IG9yZGVyID0gbXVy
YW1fcG9vbCAtPiBtaW5fYWxsb2Nfb3JkZXI7DQo+ID4gKw0KPiA+ICsgICAgIHNwaW5fbG9ja19p
cnFzYXZlKCZxZV9tdXJhbV9sb2NrLCBmbGFncyk7DQo+ID4gKyAgICAgZW5kX2JpdCA9IChvZmZz
ZXQgPj4gb3JkZXIpICsgKChzaXplICsgKDFVTCA8PCBvcmRlcikgLSAxKSA+Pg0KPiBvcmRlcik7
DQo+ID4gKyAgICAgaWYgKChvZmZzZXQgKyBzaXplKSA+IChlbmRfYml0IDw8IG9yZGVyKSkNCj4g
PiArICAgICAgICAgICAgIHNpemVfYWxsb2MgPSBzaXplICsgKDFVTCA8PCBvcmRlcik7DQo+ID4g
Kw0KPiA+ICsgICAgIG11cmFtX3Bvb2xfZGF0YV9maXhlZC5vZmZzZXQgPSBvZmZzZXQgKyBHRU5Q
T09MX09GRlNFVDsNCj4gPiArICAgICBnZW5fcG9vbF9zZXRfYWxnbyhtdXJhbV9wb29sLCBnZW5f
cG9vbF9maXhlZF9maXQsDQo+ID4gKyAgICAgICAgICAgICAgICAgICAgICAgJm11cmFtX3Bvb2xf
ZGF0YV9maXhlZCk7DQo+ID4gKyAgICAgc3RhcnQgPSBnZW5fcG9vbF9hbGxvYyhtdXJhbV9wb29s
LCBzaXplX2FsbG9jKTsNCj4gPiArICAgICBpZiAoIXN0YXJ0KQ0KPiA+ICsgICAgICAgICAgICAg
Z290byBvdXQyOw0KPiA+ICsgICAgIHN0YXJ0ID0gc3RhcnQgLSBHRU5QT09MX09GRlNFVDsNCj4g
PiArICAgICBtZW1zZXQocWVfbXVyYW1fYWRkcihzdGFydCksIDAsIHNpemVfYWxsb2MpOw0KPiA+
ICsgICAgIGVudHJ5ID0ga21hbGxvYyhzaXplb2YoKmVudHJ5KSwgR0ZQX0tFUk5FTCk7DQo+ID4g
KyAgICAgaWYgKCFlbnRyeSkNCj4gPiArICAgICAgICAgICAgIGdvdG8gb3V0MTsNCj4gPiArICAg
ICBlbnRyeS0+c3RhcnQgPSBzdGFydDsNCj4gPiArICAgICBlbnRyeS0+c2l6ZSA9IHNpemVfYWxs
b2M7DQo+ID4gKyAgICAgbGlzdF9hZGQoJmVudHJ5LT5oZWFkLCAmbXVyYW1fYmxvY2tfbGlzdCk7
DQo+ID4gKyAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWVfbXVyYW1fbG9jaywgZmxhZ3Mp
Ow0KPiA+ICsNCj4gPiArICAgICByZXR1cm4gc3RhcnQ7DQo+ID4gK291dDE6DQo+ID4gKyAgICAg
Z2VuX3Bvb2xfZnJlZShtdXJhbV9wb29sLCBzdGFydCwgc2l6ZV9hbGxvYyk7DQo+ID4gK291dDI6
DQo+ID4gKyAgICAgc3Bpbl91bmxvY2tfaXJxcmVzdG9yZSgmcWVfbXVyYW1fbG9jaywgZmxhZ3Mp
Ow0KPiA+ICsgICAgIHJldHVybiAodW5zaWduZWQgbG9uZykgLUVOT01FTTsNCj4gPiArDQo+ID4g
Kw0KPiA+ICt9DQo+ID4gK0VYUE9SVF9TWU1CT0wocWVfbXVyYW1fYWxsb2NfZml4ZWQpOw0KPiA+
ICsNCj4gPiArLyoqDQo+ID4gKyAqIHFlX211cmFtX2ZyZWUgLSBmcmVlIGEgY2h1bmsgb2YgbXVs
dGktdXNlciByYW0NCj4gPiArICogQG9mZnNldDogVGhlIGJlZ2lubmluZyBvZiB0aGUgY2h1bmsg
YXMgcmV0dXJuZWQgYnkgcWVfbXVyYW1fYWxsb2MoKS4NCj4gPiArICovDQo+ID4gK2ludCBxZV9t
dXJhbV9mcmVlKHVuc2lnbmVkIGxvbmcgb2Zmc2V0KSB7DQo+ID4gKyAgICAgdW5zaWduZWQgbG9u
ZyBmbGFnczsNCj4gPiArICAgICBpbnQgc2l6ZTsNCj4gPiArICAgICBzdHJ1Y3QgbXVyYW1fYmxv
Y2sgKnRtcDsNCj4gPiArDQo+ID4gKyAgICAgc2l6ZSA9IDA7DQo+ID4gKyAgICAgc3Bpbl9sb2Nr
X2lycXNhdmUoJnFlX211cmFtX2xvY2ssIGZsYWdzKTsNCj4gPiArICAgICBsaXN0X2Zvcl9lYWNo
X2VudHJ5KHRtcCwgJm11cmFtX2Jsb2NrX2xpc3QsIGhlYWQpIHsNCj4gPiArICAgICAgICAgICAg
IGlmICh0bXAtPnN0YXJ0ID09IG9mZnNldCkgew0KPiA+ICsgICAgICAgICAgICAgICAgICAgICBz
aXplID0gdG1wLT5zaXplOw0KPiA+ICsgICAgICAgICAgICAgICAgICAgICBsaXN0X2RlbCgmdG1w
LT5oZWFkKTsNCj4gPiArICAgICAgICAgICAgICAgICAgICAga2ZyZWUodG1wKTsNCj4gPiArICAg
ICAgICAgICAgICAgICAgICAgYnJlYWs7DQo+ID4gKyAgICAgICAgICAgICB9DQo+ID4gKyAgICAg
fQ0KPiA+ICsgICAgIGdlbl9wb29sX2ZyZWUobXVyYW1fcG9vbCwgb2Zmc2V0ICsgR0VOUE9PTF9P
RkZTRVQsIHNpemUpOw0KPiA+ICsgICAgIHNwaW5fdW5sb2NrX2lycXJlc3RvcmUoJnFlX211cmFt
X2xvY2ssIGZsYWdzKTsNCj4gPiArDQo+ID4gKyAgICAgcmV0dXJuIHNpemU7DQo+ID4gK30NCj4g
PiArRVhQT1JUX1NZTUJPTChxZV9tdXJhbV9mcmVlKTsNCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsg
KiBxZV9tdXJhbV9hZGRyIC0gdHVybiBhIG11cmFtIG9mZnNldCBpbnRvIGEgdmlydHVhbCBhZGRy
ZXNzDQo+ID4gKyAqIEBvZmZzZXQ6IG11cmFtIG9mZnNldCB0byBjb252ZXJ0DQo+ID4gKyAqLw0K
PiA+ICt2b2lkIF9faW9tZW0gKnFlX211cmFtX2FkZHIodW5zaWduZWQgbG9uZyBvZmZzZXQpIHsN
Cj4gPiArICAgICByZXR1cm4gbXVyYW1fdmJhc2UgKyBvZmZzZXQ7DQo+ID4gK30NCj4gPiArRVhQ
T1JUX1NZTUJPTChxZV9tdXJhbV9hZGRyKTsNCj4gPiArDQo+ID4gK3Vuc2lnbmVkIGxvbmcgcWVf
bXVyYW1fb2Zmc2V0KHZvaWQgX19pb21lbSAqYWRkcikgew0KPiA+ICsgICAgIHJldHVybiBhZGRy
IC0gKHZvaWQgX19pb21lbSAqKW11cmFtX3ZiYXNlOyB9DQo+ID4gK0VYUE9SVF9TWU1CT0wocWVf
bXVyYW1fb2Zmc2V0KTsNCj4gPiArDQo+ID4gKy8qKg0KPiA+ICsgKiBxZV9tdXJhbV9kbWEgLSB0
dXJuIGEgbXVyYW0gdmlydHVhbCBhZGRyZXNzIGludG8gYSBETUEgYWRkcmVzcw0KPiA+ICsgKiBA
b2Zmc2V0OiB2aXJ0dWFsIGFkZHJlc3MgZnJvbSBxZV9tdXJhbV9hZGRyKCkgdG8gY29udmVydCAg
Ki8NCj4gPiArZG1hX2FkZHJfdCBxZV9tdXJhbV9kbWEodm9pZCBfX2lvbWVtICphZGRyKSB7DQo+
ID4gKyAgICAgcmV0dXJuIG11cmFtX3BiYXNlICsgKCh1OCBfX2lvbWVtICopYWRkciAtIG11cmFt
X3ZiYXNlKTsgfQ0KPiA+ICtFWFBPUlRfU1lNQk9MKHFlX211cmFtX2RtYSk7DQo+IA0KPiBXaHkg
YXJlIHlvdSBhZGRpbmcgbmV3IGZ1bmN0aW9ucyByYXRoZXIgdGhhbiByZXBsYWNpbmcgdGhlIGlt
cGxlbWVudGF0aW9uDQo+IG9mIHRoZSBvbGQgb25lcz8NCj4gDQo+IEFnYWluLCBJIGRvbid0IHdh
bnQgdG8gc2VlIGEgYmlnIGFkZGl0aW9uIGluIG9uZSBwbGFjZSBhbmQgYSBiaWcgZGVsZXRpb24N
Cj4gZWxzZXdoZXJlLiAgSSB3YW50IHRvIHNlZSB0aGUgYWN0dWFsIGNvZGUgY2hhbmdlcyBhcyBh
IGRpZmYuICBBbnkgbW92aW5nDQo+IGFyb3VuZCBvZiBjb2RlIG11c3QgYmUgYSBzZXBhcmF0ZSBw
YXRjaCBmcm9tIG1ha2luZyBjaGFuZ2VzIHRvIGl0IHRoYXQNCj4gYXJlIHNpZ25pZmljYW50IGVu
b3VnaCB0aGF0IGdpdCBmb3JtYXQtcGF0Y2ggZG9lc24ndCBkZXRlY3QgaXQgYXMgYSBtb3ZlLg0K
DQpNb2RpZnkgY3BtX211cmFtIGZ1bmN0aW9ucyB3aXRoIGdlbmFsbG9jIGZpcnN0LCBUaGVuIG1v
dmUgaXQgdG8gcWVfbXVyYW0gd2l0aA0KY2h1cm4gb2YgY3BtX211cmFtXyogYW5kIHFlX211cmFf
Kj8gT3Igb3RoZXIgbWV0aG9kPw0KDQo+IA0KPiAtU2NvdHQNCg0K
^ permalink raw reply [flat|nested] 11+ messages in thread
* Re: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram
2015-09-18 2:35 ` Zhao Qiang
(?)
@ 2015-09-18 2:39 ` Scott Wood
-1 siblings, 0 replies; 11+ messages in thread
From: Scott Wood @ 2015-09-18 2:39 UTC (permalink / raw
To: Zhao Qiang-B45475
Cc: linux-kernel@vger.kernel.org, linuxppc-dev@lists.ozlabs.org,
lauraa@codeaurora.org, Xie Xiaobo-R63061,
benh@kernel.crashing.org, Li Yang-Leo-R58472, paulus@samba.org
On Thu, 2015-09-17 at 21:35 -0500, Zhao Qiang-B45475 wrote:
> On Mon, 2015-09-18 at 04:28 +0800, Wood Scott-B07421 wrote:
> > -----Original Message-----
> > From: Wood Scott-B07421
> > Sent: Friday, September 18, 2015 4:28 AM
> > To: Zhao Qiang-B45475
> > Cc: linux-kernel@vger.kernel.org; linuxppc-dev@lists.ozlabs.org;
> > lauraa@codeaurora.org; Xie Xiaobo-R63061; benh@kernel.crashing.org; Li
> > Yang-Leo-R58472; paulus@samba.org
> > Subject: Re: [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage
> > muram
> >
> > On Mon, 2015-09-14 at 09:38 +0800, Zhao Qiang wrote:
> > > diff --git a/arch/powerpc/sysdev/qe_lib/qe_common.c
> > > b/arch/powerpc/sysdev/qe_lib/qe_common.c
> > > new file mode 100644
> > > index 0000000..1213458
> > > --- /dev/null
> > > +++ b/arch/powerpc/sysdev/qe_lib/qe_common.c
> > > @@ -0,0 +1,242 @@
> > > +/*
> > > + * Freescale QE common code
> > > + *
> > > + * Author: Zhao Qiang <qiang.zhao@freescale.com>
> > > + *
> > > + * Copyright 2015 Freescale Semiconductor, Inc.
> > > + *
> > > + * This program is free software; you can redistribute it and/or
> > > +modify
> > > + * it under the terms of the GNU General Public License as published
> > > +by
> > > + * the Free Software Foundation; either version 2 of the License, or
> > > + * (at your option) any later version.
> > > + */
> > > +
> > > +#include <linux/genalloc.h>
> > > +#include <linux/list.h>
> > > +#include <linux/init.h>
> > > +#include <linux/of_device.h>
> > > +#include <linux/spinlock.h>
> > > +#include <linux/export.h>
> > > +#include <linux/of.h>
> > > +#include <linux/of_address.h>
> > > +#include <linux/slab.h>
> > > +
> > > +#include <linux/io.h>
> > > +#include <asm/qe.h>
> > > +
> > > +static struct gen_pool *muram_pool;
> > > +static struct genpool_data_align muram_pool_data; static struct
> > > +genpool_data_fixed muram_pool_data_fixed; static spinlock_t
> > > +qe_muram_lock; static u8 __iomem *muram_vbase; static phys_addr_t
> > > +muram_pbase;
> > > +
> > > +struct muram_block {
> > > + struct list_head head;
> > > + unsigned long start;
> > > + int size;
> > > +};
> > > +
> > > +static LIST_HEAD(muram_block_list);
> > > +
> > > +/* max address size we deal with */
> > > +#define OF_MAX_ADDR_CELLS 4
> > > +#define GENPOOL_OFFSET 4096
> > > +
> > > +int qe_muram_init(void)
> > > +{
> > > + struct device_node *np;
> > > + struct resource r;
> > > + u32 zero[OF_MAX_ADDR_CELLS] = {};
> > > + resource_size_t max = 0;
> > > + int i = 0;
> > > + int ret = 0;
> > > +
> > > + if (muram_pbase)
> > > + return 0;
> > > +
> > > + np = of_find_compatible_node(NULL, NULL, "fsl,qe-muram-data");
> > > + if (!np) {
> > > + /* try legacy bindings */
> > > + np = of_find_node_by_name(NULL, "data-only");
> > > + if (!np) {
> > > + pr_err("Cannot find CPM muram data node");
> > > + ret = -ENODEV;
> > > + goto out;
> > > + }
> > > + }
> > > +
> > > + muram_pool = gen_pool_create(1, -1);
> > > + muram_pbase = of_translate_address(np, zero);
> > > + if (muram_pbase == (phys_addr_t)OF_BAD_ADDR) {
> > > + pr_err("Cannot translate zero through CPM muram node");
> > > + ret = -ENODEV;
> > > + goto err;
> > > + }
> > > +
> > > + while (of_address_to_resource(np, i++, &r) == 0) {
> > > + if (r.end > max)
> > > + max = r.end;
> > > + ret = gen_pool_add(muram_pool, r.start - muram_pbase +
> > > + GENPOOL_OFFSET, resource_size(&r), -1);
> > > + if (ret) {
> > > + pr_err("QE: couldn't add muram to
> > pool!\n");
> > > + goto err;
> > > + }
> > > +
> > > + }
> > > +
> > > + muram_vbase = ioremap(muram_pbase, max - muram_pbase + 1);
> > > + if (!muram_vbase) {
> > > + pr_err("Cannot map QE muram");
> > > + ret = -ENOMEM;
> > > + goto err;
> > > + }
> > > + goto out;
> > > +err:
> > > + gen_pool_destroy(muram_pool);
> > > +out:
> > > + of_node_put(np);
> > > + return ret;
> > > +}
> > > +
> > > +/*
> > > + * qe_muram_alloc - allocate the requested size worth of multi-user
> > > +ram
> > > + * @size: number of bytes to allocate
> > > + * @align: requested alignment, in bytes
> > > + *
> > > + * This function returns an offset into the muram area.
> > > + */
> > > +unsigned long qe_muram_alloc(unsigned long size, unsigned long align)
> > > +{
> > > + unsigned long start;
> > > + unsigned long flags;
> > > + struct muram_block *entry;
> > > +
> > > + spin_lock_irqsave(&qe_muram_lock, flags);
> > > + muram_pool_data.align = align;
> > > + gen_pool_set_algo(muram_pool, gen_pool_first_fit_align,
> > > + &muram_pool_data);
> > > + start = gen_pool_alloc(muram_pool, size);
> > > + if (!start)
> > > + goto out2;
> > > + start = start - GENPOOL_OFFSET;
> > > + memset(qe_muram_addr(start), 0, size);
> > > + entry = kmalloc(sizeof(*entry), GFP_KERNEL);
> > > + if (!entry)
> > > + goto out1;
> > > + entry->start = start;
> > > + entry->size = size;
> > > + list_add(&entry->head, &muram_block_list);
> > > + spin_unlock_irqrestore(&qe_muram_lock, flags);
> > > +
> > > + return start;
> > > +out1:
> > > + gen_pool_free(muram_pool, start, size);
> > > +out2:
> > > + spin_unlock_irqrestore(&qe_muram_lock, flags);
> > > + return (unsigned long) -ENOMEM;
> > > +}
> > > +EXPORT_SYMBOL(qe_muram_alloc);
> > > +
> > > +/*
> > > + * qe_muram_alloc_fixed - reserve a specific region of multi-user ram
> > > + * @size: number of bytes to allocate
> > > + * @offset: offset of allocation start address
> > > + *
> > > + * This function returns an offset into the muram area.
> > > + */
> > > +unsigned long qe_muram_alloc_fixed(unsigned long offset, unsigned
> > > +long
> > > size)
> > > +{
> > > +
> > > + unsigned long start;
> > > + unsigned long flags;
> > > + unsigned long size_alloc = size;
> > > + struct muram_block *entry;
> > > + int end_bit;
> > > + int order = muram_pool -> min_alloc_order;
> > > +
> > > + spin_lock_irqsave(&qe_muram_lock, flags);
> > > + end_bit = (offset >> order) + ((size + (1UL << order) - 1) >>
> > order);
> > > + if ((offset + size) > (end_bit << order))
> > > + size_alloc = size + (1UL << order);
> > > +
> > > + muram_pool_data_fixed.offset = offset + GENPOOL_OFFSET;
> > > + gen_pool_set_algo(muram_pool, gen_pool_fixed_fit,
> > > + &muram_pool_data_fixed);
> > > + start = gen_pool_alloc(muram_pool, size_alloc);
> > > + if (!start)
> > > + goto out2;
> > > + start = start - GENPOOL_OFFSET;
> > > + memset(qe_muram_addr(start), 0, size_alloc);
> > > + entry = kmalloc(sizeof(*entry), GFP_KERNEL);
> > > + if (!entry)
> > > + goto out1;
> > > + entry->start = start;
> > > + entry->size = size_alloc;
> > > + list_add(&entry->head, &muram_block_list);
> > > + spin_unlock_irqrestore(&qe_muram_lock, flags);
> > > +
> > > + return start;
> > > +out1:
> > > + gen_pool_free(muram_pool, start, size_alloc);
> > > +out2:
> > > + spin_unlock_irqrestore(&qe_muram_lock, flags);
> > > + return (unsigned long) -ENOMEM;
> > > +
> > > +
> > > +}
> > > +EXPORT_SYMBOL(qe_muram_alloc_fixed);
> > > +
> > > +/**
> > > + * qe_muram_free - free a chunk of multi-user ram
> > > + * @offset: The beginning of the chunk as returned by qe_muram_alloc().
> > > + */
> > > +int qe_muram_free(unsigned long offset) {
> > > + unsigned long flags;
> > > + int size;
> > > + struct muram_block *tmp;
> > > +
> > > + size = 0;
> > > + spin_lock_irqsave(&qe_muram_lock, flags);
> > > + list_for_each_entry(tmp, &muram_block_list, head) {
> > > + if (tmp->start == offset) {
> > > + size = tmp->size;
> > > + list_del(&tmp->head);
> > > + kfree(tmp);
> > > + break;
> > > + }
> > > + }
> > > + gen_pool_free(muram_pool, offset + GENPOOL_OFFSET, size);
> > > + spin_unlock_irqrestore(&qe_muram_lock, flags);
> > > +
> > > + return size;
> > > +}
> > > +EXPORT_SYMBOL(qe_muram_free);
> > > +
> > > +/**
> > > + * qe_muram_addr - turn a muram offset into a virtual address
> > > + * @offset: muram offset to convert
> > > + */
> > > +void __iomem *qe_muram_addr(unsigned long offset) {
> > > + return muram_vbase + offset;
> > > +}
> > > +EXPORT_SYMBOL(qe_muram_addr);
> > > +
> > > +unsigned long qe_muram_offset(void __iomem *addr) {
> > > + return addr - (void __iomem *)muram_vbase; }
> > > +EXPORT_SYMBOL(qe_muram_offset);
> > > +
> > > +/**
> > > + * qe_muram_dma - turn a muram virtual address into a DMA address
> > > + * @offset: virtual address from qe_muram_addr() to convert */
> > > +dma_addr_t qe_muram_dma(void __iomem *addr) {
> > > + return muram_pbase + ((u8 __iomem *)addr - muram_vbase); }
> > > +EXPORT_SYMBOL(qe_muram_dma);
> >
> > Why are you adding new functions rather than replacing the implementation
> > of the old ones?
> >
> > Again, I don't want to see a big addition in one place and a big deletion
> > elsewhere. I want to see the actual code changes as a diff. Any moving
> > around of code must be a separate patch from making changes to it that
> > are significant enough that git format-patch doesn't detect it as a move.
>
> Modify cpm_muram functions with genalloc first, Then move it to qe_muram
> with
> churn of cpm_muram_* and qe_mura_*? Or other method?
All modifications first (both genalloc and, if you must, renaming), then
move. Or move, then all modifications. I don't care which order, just don't
make changes in the same patch as moving the code.
-Scott
^ permalink raw reply [flat|nested] 11+ messages in thread
end of thread, other threads:[~2015-09-18 2:39 UTC | newest]
Thread overview: 11+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2015-09-14 1:38 [PATCH v9 1/5] genalloc:support memory-allocation with bytes-alignment to genalloc Zhao Qiang
2015-09-14 1:38 ` [PATCH v9 2/5] genalloc:support allocating specific region Zhao Qiang
2015-09-17 20:19 ` Scott Wood
2015-09-17 20:25 ` Scott Wood
2015-09-14 1:38 ` [PATCH v9 3/5] qe_common: add qe_muram_ functions to manage muram Zhao Qiang
2015-09-17 20:28 ` Scott Wood
2015-09-18 2:35 ` Zhao Qiang
2015-09-18 2:35 ` Zhao Qiang
2015-09-18 2:39 ` Scott Wood
2015-09-14 1:38 ` [PATCH v9 4/5] CPM: modify cpm_muram_* functions Zhao Qiang
2015-09-14 1:38 ` [PATCH v9 5/5] QE: Move QE from arch/powerpc to drivers/soc Zhao Qiang
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.