* [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction
@ 2010-06-20 14:00 Eric Miao
2010-06-20 14:00 ` [PATCH 2/2] [ARM] pxa: make use of 'struct machine_class' Eric Miao
2010-06-21 7:27 ` [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction Jeremy Kerr
0 siblings, 2 replies; 10+ messages in thread
From: Eric Miao @ 2010-06-20 14:00 UTC (permalink / raw)
To: linux-arm-kernel
From: Eric Miao <eric.y.miao@gmail.com>
For machine class (mostly equivalent to SoC) level abstraction.
The modification to head.S is preliminary, working but possibly
can be made more elegant.
Signed-off-by: Eric Miao <eric.miao@canonical.com>
---
arch/arm/include/asm/mach/arch.h | 13 +++++++++++++
arch/arm/kernel/asm-offsets.c | 4 ++++
arch/arm/kernel/head-common.S | 3 +++
arch/arm/kernel/head.S | 12 +++++++++---
arch/arm/kernel/setup.c | 14 ++++++++++----
arch/arm/mm/mmu.c | 5 ++++-
6 files changed, 43 insertions(+), 8 deletions(-)
diff --git a/arch/arm/include/asm/mach/arch.h b/arch/arm/include/asm/mach/arch.h
index c59842d..214ca29 100644
--- a/arch/arm/include/asm/mach/arch.h
+++ b/arch/arm/include/asm/mach/arch.h
@@ -14,6 +14,18 @@ struct tag;
struct meminfo;
struct sys_timer;
+struct machine_class {
+ unsigned int phys_io; /* start of physical io */
+ unsigned int io_pg_offst; /* byte offset for io
+ * page tabe entry */
+ const char *name; /* machine class name */
+ unsigned long boot_params; /* tagged list */
+
+ void (*map_io)(void);/* IO mapping function */
+ void (*init_irq)(void);
+ struct sys_timer *timer;
+};
+
struct machine_desc {
/*
* Note! The first four elements are used
@@ -25,6 +37,7 @@ struct machine_desc {
* page tabe entry */
const char *name; /* architecture name */
+ struct machine_class *class; /* machine class */
unsigned long boot_params; /* tagged list */
unsigned int video_start; /* start of video RAM */
diff --git a/arch/arm/kernel/asm-offsets.c b/arch/arm/kernel/asm-offsets.c
index 8835115..5c9038a 100644
--- a/arch/arm/kernel/asm-offsets.c
+++ b/arch/arm/kernel/asm-offsets.c
@@ -101,6 +101,10 @@ int main(void)
DEFINE(MACHINFO_NAME, offsetof(struct machine_desc, name));
DEFINE(MACHINFO_PHYSIO, offsetof(struct machine_desc, phys_io));
DEFINE(MACHINFO_PGOFFIO, offsetof(struct machine_desc, io_pg_offst));
+ DEFINE(MACHINFO_CLASS, offsetof(struct machine_desc, class));
+ BLANK();
+ DEFINE(MACHCLASS_PHYSIO, offsetof(struct machine_class, phys_io));
+ DEFINE(MACHCLASS_PGOFFIO, offsetof(struct machine_class, io_pg_offst));
BLANK();
DEFINE(PROC_INFO_SZ, sizeof(struct proc_info_list));
DEFINE(PROCINFO_INITFUNC, offsetof(struct proc_info_list, __cpu_flush));
diff --git a/arch/arm/kernel/head-common.S b/arch/arm/kernel/head-common.S
index b9505aa..660756b 100644
--- a/arch/arm/kernel/head-common.S
+++ b/arch/arm/kernel/head-common.S
@@ -207,6 +207,7 @@ ENDPROC(lookup_processor_type)
* Returns:
* r3, r4, r6 corrupted
* r5 = mach_info pointer in physical address space
+ * r7 = machine_class pointer in physical address space
*/
__lookup_machine_type:
adr r3, 4b
@@ -214,6 +215,8 @@ __lookup_machine_type:
sub r3, r3, r4 @ get offset between virt&phys
add r5, r5, r3 @ convert virt addresses to
add r6, r6, r3 @ physical address space
+ ldr r7, [r5, #MACHINFO_CLASS] @ get machine class
+ add r7, r7, r3
1: ldr r3, [r5, #MACHINFO_TYPE] @ get machine type
teq r3, r1 @ matches loader number?
beq 2f @ found
diff --git a/arch/arm/kernel/head.S b/arch/arm/kernel/head.S
index eb62bf9..06f8834 100644
--- a/arch/arm/kernel/head.S
+++ b/arch/arm/kernel/head.S
@@ -82,8 +82,9 @@ ENTRY(stext)
bl __lookup_processor_type @ r5=procinfo r9=cpuid
movs r10, r5 @ invalid processor (r5=0)?
beq __error_p @ yes, error 'p'
- bl __lookup_machine_type @ r5=machinfo
+ bl __lookup_machine_type @ r5=machinfo,r7=machine_class
movs r8, r5 @ invalid machine (r5=0)?
+ mov r11, r7
beq __error_a @ yes, error 'a'
bl __vet_atags
bl __create_page_tables
@@ -211,6 +212,7 @@ ENDPROC(__turn_mmu_on)
* r8 = machinfo
* r9 = cpuid
* r10 = procinfo
+ * r11 = machine_class
*
* Returns:
* r0, r3, r6, r7 corrupted
@@ -295,13 +297,17 @@ __create_page_tables:
* This allows debug messages to be output
* via a serial console before paging_init.
*/
- ldr r3, [r8, #MACHINFO_PGOFFIO]
+ cmp r11, #0
+ ldrne r3, [r11, #MACHCLASS_PGOFFIO]
+ ldreq r3, [r8, #MACHINFO_PGOFFIO]
add r0, r4, r3
rsb r3, r3, #0x4000 @ PTRS_PER_PGD*sizeof(long)
cmp r3, #0x0800 @ limit to 512MB
movhi r3, #0x0800
add r6, r0, r3
- ldr r3, [r8, #MACHINFO_PHYSIO]
+ cmp r11, #0
+ ldrne r3, [r11, #MACHCLASS_PHYSIO]
+ ldreq r3, [r8, #MACHINFO_PHYSIO]
orr r3, r3, r7
1: str r3, [r0], #4
add r3, r3, #1 << 20
diff --git a/arch/arm/kernel/setup.c b/arch/arm/kernel/setup.c
index 122d999..e5627da 100644
--- a/arch/arm/kernel/setup.c
+++ b/arch/arm/kernel/setup.c
@@ -667,12 +667,14 @@ void __init setup_arch(char **cmdline_p)
{
struct tag *tags = (struct tag *)&init_tags;
struct machine_desc *mdesc;
+ struct machine_class *class;
char *from = default_command_line;
unwind_init();
setup_processor();
mdesc = setup_machine(machine_arch_type);
+ class = mdesc->class;
machine_name = mdesc->name;
if (mdesc->soft_reboot)
@@ -680,8 +682,12 @@ void __init setup_arch(char **cmdline_p)
if (__atags_pointer)
tags = phys_to_virt(__atags_pointer);
- else if (mdesc->boot_params)
- tags = phys_to_virt(mdesc->boot_params);
+ else {
+ unsigned long boot_params = class ? class->boot_params :
+ mdesc->boot_params;
+ if (boot_params)
+ tags = phys_to_virt(boot_params);
+ }
/*
* If we have the old style parameters, convert them to
@@ -729,8 +735,8 @@ void __init setup_arch(char **cmdline_p)
/*
* Set up various architecture-specific pointers
*/
- init_arch_irq = mdesc->init_irq;
- system_timer = mdesc->timer;
+ init_arch_irq = class ? class->init_irq : mdesc->init_irq;
+ system_timer = class ? class->timer : mdesc->timer;
init_machine = mdesc->init_machine;
#ifdef CONFIG_VT
diff --git a/arch/arm/mm/mmu.c b/arch/arm/mm/mmu.c
index 2858941..2af11dc 100644
--- a/arch/arm/mm/mmu.c
+++ b/arch/arm/mm/mmu.c
@@ -933,6 +933,7 @@ void __init reserve_node_zero(pg_data_t *pgdat)
*/
static void __init devicemaps_init(struct machine_desc *mdesc)
{
+ struct machine_class *class = mdesc->class;
struct map_desc map;
unsigned long addr;
void *vectors;
@@ -995,7 +996,9 @@ static void __init devicemaps_init(struct machine_desc *mdesc)
/*
* Ask the machine support to map in the statically mapped devices.
*/
- if (mdesc->map_io)
+ if (class && class->map_io)
+ class->map_io();
+ else if (mdesc->map_io)
mdesc->map_io();
/*
--
1.7.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/2] [ARM] pxa: make use of 'struct machine_class'
2010-06-20 14:00 [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction Eric Miao
@ 2010-06-20 14:00 ` Eric Miao
2010-06-20 16:08 ` Antonio Ospite
2010-06-21 7:27 ` [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction Jeremy Kerr
1 sibling, 1 reply; 10+ messages in thread
From: Eric Miao @ 2010-06-20 14:00 UTC (permalink / raw)
To: linux-arm-kernel
From: Eric Miao <eric.y.miao@gmail.com>
Signed-off-by: Eric Miao <eric.miao@canonical.com>
---
arch/arm/mach-pxa/ezx.c | 60 ++++-------------------------------------
arch/arm/mach-pxa/generic.h | 15 ++++++++++
arch/arm/mach-pxa/hx4700.c | 10 +------
arch/arm/mach-pxa/magician.c | 9 +-----
arch/arm/mach-pxa/pxa25x.c | 11 +++++++
arch/arm/mach-pxa/pxa27x.c | 11 +++++++
6 files changed, 46 insertions(+), 70 deletions(-)
diff --git a/arch/arm/mach-pxa/ezx.c b/arch/arm/mach-pxa/ezx.c
index 626c82b..2f4c8f1 100644
--- a/arch/arm/mach-pxa/ezx.c
+++ b/arch/arm/mach-pxa/ezx.c
@@ -795,15 +795,7 @@ static void __init a780_init(void)
platform_add_devices(ARRAY_AND_SIZE(a780_devices));
}
-MACHINE_START(EZX_A780, "Motorola EZX A780")
- .phys_io = 0x40000000,
- .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
- .boot_params = 0xa0000100,
- .map_io = pxa_map_io,
- .init_irq = pxa27x_init_irq,
- .timer = &pxa_timer,
- .init_machine = a780_init,
-MACHINE_END
+PXA27X_MACHINE(EZX_A780, a780_init, "Motorola EZX A780");
#endif
#ifdef CONFIG_MACH_EZX_E680
@@ -861,15 +853,7 @@ static void __init e680_init(void)
platform_add_devices(ARRAY_AND_SIZE(e680_devices));
}
-MACHINE_START(EZX_E680, "Motorola EZX E680")
- .phys_io = 0x40000000,
- .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
- .boot_params = 0xa0000100,
- .map_io = pxa_map_io,
- .init_irq = pxa27x_init_irq,
- .timer = &pxa_timer,
- .init_machine = e680_init,
-MACHINE_END
+PXA27X_MACHINE(EZX_E680, e680_init, "Motorola EZX E680");
#endif
#ifdef CONFIG_MACH_EZX_A1200
@@ -927,15 +911,7 @@ static void __init a1200_init(void)
platform_add_devices(ARRAY_AND_SIZE(a1200_devices));
}
-MACHINE_START(EZX_A1200, "Motorola EZX A1200")
- .phys_io = 0x40000000,
- .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
- .boot_params = 0xa0000100,
- .map_io = pxa_map_io,
- .init_irq = pxa27x_init_irq,
- .timer = &pxa_timer,
- .init_machine = a1200_init,
-MACHINE_END
+PXA27X_MACHINE(EZX_A1200, a1200_init, "Motorola EZX A1200");
#endif
#ifdef CONFIG_MACH_EZX_A910
@@ -1119,15 +1095,7 @@ static void __init a910_init(void)
platform_add_devices(ARRAY_AND_SIZE(a910_devices));
}
-MACHINE_START(EZX_A910, "Motorola EZX A910")
- .phys_io = 0x40000000,
- .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
- .boot_params = 0xa0000100,
- .map_io = pxa_map_io,
- .init_irq = pxa27x_init_irq,
- .timer = &pxa_timer,
- .init_machine = a910_init,
-MACHINE_END
+PXA27X_MACHINE(EZX_A910, a910_init, "Motorola EZX A910");
#endif
#ifdef CONFIG_MACH_EZX_E6
@@ -1185,15 +1153,7 @@ static void __init e6_init(void)
platform_add_devices(ARRAY_AND_SIZE(e6_devices));
}
-MACHINE_START(EZX_E6, "Motorola EZX E6")
- .phys_io = 0x40000000,
- .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
- .boot_params = 0xa0000100,
- .map_io = pxa_map_io,
- .init_irq = pxa27x_init_irq,
- .timer = &pxa_timer,
- .init_machine = e6_init,
-MACHINE_END
+PXA27X_MACHINE(EZX_E6, e6_init, "Motorola EZX E6");
#endif
#ifdef CONFIG_MACH_EZX_E2
@@ -1225,13 +1185,5 @@ static void __init e2_init(void)
platform_add_devices(ARRAY_AND_SIZE(e2_devices));
}
-MACHINE_START(EZX_E2, "Motorola EZX E2")
- .phys_io = 0x40000000,
- .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
- .boot_params = 0xa0000100,
- .map_io = pxa_map_io,
- .init_irq = pxa27x_init_irq,
- .timer = &pxa_timer,
- .init_machine = e2_init,
-MACHINE_END
+PXA27X_MACHINE(EZX_E2, e2_init, "Motorola EZX E2");
#endif
diff --git a/arch/arm/mach-pxa/generic.h b/arch/arm/mach-pxa/generic.h
index 890fb90..6b6d767 100644
--- a/arch/arm/mach-pxa/generic.h
+++ b/arch/arm/mach-pxa/generic.h
@@ -72,3 +72,18 @@ void __init pxa_set_ffuart_info(void *info);
void __init pxa_set_btuart_info(void *info);
void __init pxa_set_stuart_info(void *info);
void __init pxa_set_hwuart_info(void *info);
+
+extern struct machine_class machine_class_pxa25x;
+extern struct machine_class machine_class_pxa27x;
+
+#define PXA25X_MACHINE(_type,_init,_name) \
+MACHINE_START(_type,_name) \
+ .class = &machine_class_pxa25x, \
+ .init_machine = _init, \
+}
+
+#define PXA27X_MACHINE(_type,_init,_name) \
+MACHINE_START(_type,_name) \
+ .class = &machine_class_pxa27x, \
+ .init_machine = _init, \
+}
diff --git a/arch/arm/mach-pxa/hx4700.c b/arch/arm/mach-pxa/hx4700.c
index 848c861..a1b1587 100644
--- a/arch/arm/mach-pxa/hx4700.c
+++ b/arch/arm/mach-pxa/hx4700.c
@@ -869,12 +869,4 @@ static void __init hx4700_init(void)
mdelay(10);
}
-MACHINE_START(H4700, "HP iPAQ HX4700")
- .phys_io = 0x40000000,
- .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
- .boot_params = 0xa0000100,
- .map_io = pxa_map_io,
- .init_irq = pxa27x_init_irq,
- .init_machine = hx4700_init,
- .timer = &pxa_timer,
-MACHINE_END
+PXA27X_MACHINE_START(H4700, hx4700_init, "HP iPAQ HX4700");
diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c
index e81dd0c..6a86f22 100644
--- a/arch/arm/mach-pxa/magician.c
+++ b/arch/arm/mach-pxa/magician.c
@@ -764,11 +764,6 @@ static void __init magician_init(void)
MACHINE_START(MAGICIAN, "HTC Magician")
- .phys_io = 0x40000000,
- .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
- .boot_params = 0xa0000100,
- .map_io = pxa_map_io,
- .init_irq = pxa27x_init_irq,
- .init_machine = magician_init,
- .timer = &pxa_timer,
+ .class = &machine_class_pxa27x,
+ .init_machine = magician_init,
MACHINE_END
diff --git a/arch/arm/mach-pxa/pxa25x.c b/arch/arm/mach-pxa/pxa25x.c
index 0b9ad30..8993df6 100644
--- a/arch/arm/mach-pxa/pxa25x.c
+++ b/arch/arm/mach-pxa/pxa25x.c
@@ -23,6 +23,7 @@
#include <linux/suspend.h>
#include <linux/sysdev.h>
+#include <asm/mach/arch.h>
#include <mach/hardware.h>
#include <mach/irqs.h>
#include <mach/gpio.h>
@@ -341,6 +342,16 @@ static struct sys_device pxa25x_sysdev[] = {
},
};
+struct machine_class machine_class_pxa25x __initdata = {
+ .name = "PXA25x",
+ .phys_io = 0x40000000,
+ .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
+ .boot_params = 0xa0000100,
+ .timer = &pxa_timer,
+ .map_io = pxa_map_io,
+ .init_irq = pxa25x_init_irq,
+};
+
static int __init pxa25x_init(void)
{
int i, ret = 0;
diff --git a/arch/arm/mach-pxa/pxa27x.c b/arch/arm/mach-pxa/pxa27x.c
index 0af3617..d64b194 100644
--- a/arch/arm/mach-pxa/pxa27x.c
+++ b/arch/arm/mach-pxa/pxa27x.c
@@ -18,6 +18,7 @@
#include <linux/platform_device.h>
#include <linux/sysdev.h>
+#include <asm/mach/arch.h>
#include <mach/hardware.h>
#include <asm/irq.h>
#include <mach/irqs.h>
@@ -403,6 +404,16 @@ static struct sys_device pxa27x_sysdev[] = {
},
};
+struct machine_class machine_class_pxa27x __initdata = {
+ .name = "PXA27x",
+ .phys_io = 0x40000000,
+ .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
+ .boot_params = 0xa0000100,
+ .timer = &pxa_timer,
+ .map_io = pxa_map_io,
+ .init_irq = pxa27x_init_irq,
+};
+
static int __init pxa27x_init(void)
{
int i, ret = 0;
--
1.7.1
^ permalink raw reply related [flat|nested] 10+ messages in thread
* [PATCH 2/2] [ARM] pxa: make use of 'struct machine_class'
2010-06-20 14:00 ` [PATCH 2/2] [ARM] pxa: make use of 'struct machine_class' Eric Miao
@ 2010-06-20 16:08 ` Antonio Ospite
2010-06-21 1:06 ` Eric Miao
0 siblings, 1 reply; 10+ messages in thread
From: Antonio Ospite @ 2010-06-20 16:08 UTC (permalink / raw)
To: linux-arm-kernel
On Sun, 20 Jun 2010 22:00:50 +0800
Eric Miao <eric.miao@canonical.com> wrote:
> From: Eric Miao <eric.y.miao@gmail.com>
>
> Signed-off-by: Eric Miao <eric.miao@canonical.com>
> ---
> arch/arm/mach-pxa/ezx.c | 60 ++++-------------------------------------
The ezx part looks OK. A comment about magician below.
[...]
> diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c
> index e81dd0c..6a86f22 100644
> --- a/arch/arm/mach-pxa/magician.c
> +++ b/arch/arm/mach-pxa/magician.c
> @@ -764,11 +764,6 @@ static void __init magician_init(void)
>
>
> MACHINE_START(MAGICIAN, "HTC Magician")
> - .phys_io = 0x40000000,
> - .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
> - .boot_params = 0xa0000100,
> - .map_io = pxa_map_io,
> - .init_irq = pxa27x_init_irq,
> - .init_machine = magician_init,
> - .timer = &pxa_timer,
> + .class = &machine_class_pxa27x,
> + .init_machine = magician_init,
> MACHINE_END
Magician can use PXA27X_MACHINE() as well, can't it?
[...]
Regards,
Antonio
--
Antonio Ospite
http://ao2.it
PGP public key ID: 0x4553B001
A: Because it messes up the order in which people normally read text.
See http://en.wikipedia.org/wiki/Posting_style
Q: Why is top-posting such a bad thing?
A: Top-posting.
Q: What is the most annoying thing in e-mail?
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 198 bytes
Desc: not available
URL: <http://lists.infradead.org/pipermail/linux-arm-kernel/attachments/20100620/9cfddfda/attachment.sig>
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 2/2] [ARM] pxa: make use of 'struct machine_class'
2010-06-20 16:08 ` Antonio Ospite
@ 2010-06-21 1:06 ` Eric Miao
0 siblings, 0 replies; 10+ messages in thread
From: Eric Miao @ 2010-06-21 1:06 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Jun 21, 2010 at 12:08 AM, Antonio Ospite
<ospite@studenti.unina.it> wrote:
> On Sun, 20 Jun 2010 22:00:50 +0800
> Eric Miao <eric.miao@canonical.com> wrote:
>
>> From: Eric Miao <eric.y.miao@gmail.com>
>>
>> Signed-off-by: Eric Miao <eric.miao@canonical.com>
>> ---
>> ?arch/arm/mach-pxa/ezx.c ? ? ?| ? 60 ++++-------------------------------------
>
> The ezx part looks OK. A comment about magician below.
>
> [...]
>> diff --git a/arch/arm/mach-pxa/magician.c b/arch/arm/mach-pxa/magician.c
>> index e81dd0c..6a86f22 100644
>> --- a/arch/arm/mach-pxa/magician.c
>> +++ b/arch/arm/mach-pxa/magician.c
>> @@ -764,11 +764,6 @@ static void __init magician_init(void)
>>
>>
>> ?MACHINE_START(MAGICIAN, "HTC Magician")
>> - ? ? .phys_io = 0x40000000,
>> - ? ? .io_pg_offst = (io_p2v(0x40000000) >> 18) & 0xfffc,
>> - ? ? .boot_params = 0xa0000100,
>> - ? ? .map_io = pxa_map_io,
>> - ? ? .init_irq = pxa27x_init_irq,
>> - ? ? .init_machine = magician_init,
>> - ? ? .timer = &pxa_timer,
>> + ? ? .class ? ? ? ? ?= &machine_class_pxa27x,
>> + ? ? .init_machine ? = magician_init,
>> ?MACHINE_END
>
> Magician can use PXA27X_MACHINE() as well, can't it?
Yes, it can. Missed that :-)
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction
2010-06-20 14:00 [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction Eric Miao
2010-06-20 14:00 ` [PATCH 2/2] [ARM] pxa: make use of 'struct machine_class' Eric Miao
@ 2010-06-21 7:27 ` Jeremy Kerr
2010-06-21 8:23 ` Eric Miao
1 sibling, 1 reply; 10+ messages in thread
From: Jeremy Kerr @ 2010-06-21 7:27 UTC (permalink / raw)
To: linux-arm-kernel
Hi Eric,
> For machine class (mostly equivalent to SoC) level abstraction.
Could you detail your intended usage of machine_class and how this will fit in
with the mdesc? Will the mdesc fields override the machine_class fields, or is
this intended to be a replacement?
Cheers,
Jeremy
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction
2010-06-21 7:27 ` [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction Jeremy Kerr
@ 2010-06-21 8:23 ` Eric Miao
2010-06-21 9:02 ` Russell King - ARM Linux
0 siblings, 1 reply; 10+ messages in thread
From: Eric Miao @ 2010-06-21 8:23 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Jun 21, 2010 at 3:27 PM, Jeremy Kerr <jeremy.kerr@canonical.com> wrote:
> Hi Eric,
>
>> For machine class (mostly equivalent to SoC) level abstraction.
>
> Could you detail your intended usage of machine_class and how this will fit in
> with the mdesc? Will the mdesc fields override the machine_class fields, or is
> this intended to be a replacement?
>
Good question, I've missed that part in the commit message. So my idea
is to have machine_class fields to replace machine_desc completely in
the end, but the situation is we need a smooth transition:
1. so for newly added machines with machine_class pointer, the fields in
machine_class will dominate (ignoring the fields in machine_desc)
2. for legacy machine_desc (apparently without machine_class pointer),
the fields within will be used, and these machines are not affected
So my intention of machine_class is really a class of machines, instead of
the class concept in C++. There might be useful situations for derivative,
E.g. some PXA machines have their specific map_io, mainstone:
static struct map_desc mainstone_io_desc[] __initdata = {
{ /* CPLD */
.virtual = MST_FPGA_VIRT,
.pfn = __phys_to_pfn(MST_FPGA_PHYS),
.length = 0x00100000,
.type = MT_DEVICE
}
};
static void __init mainstone_map_io(void)
{
pxa_map_io();
iotable_init(mainstone_io_desc, ARRAY_SIZE(mainstone_io_desc));
}
So that from derivative POV, it can be expressed as:
if (mdesc->class && mdesc->class->map_io)
mdesc->class->map_io();
if (mdesc->map_io())
mdesc->map_io();
But this seems to make things a bit over complicated, so for such cases
I'd prefer:
1. have a separate machine_class for mainstone
2. or move the board specific map_io() separatedly
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction
2010-06-21 8:23 ` Eric Miao
@ 2010-06-21 9:02 ` Russell King - ARM Linux
2010-06-21 10:19 ` Eric Miao
0 siblings, 1 reply; 10+ messages in thread
From: Russell King - ARM Linux @ 2010-06-21 9:02 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Jun 21, 2010 at 04:23:22PM +0800, Eric Miao wrote:
> So that from derivative POV, it can be expressed as:
>
> if (mdesc->class && mdesc->class->map_io)
> mdesc->class->map_io();
> if (mdesc->map_io())
> mdesc->map_io();
>
> But this seems to make things a bit over complicated, so for such cases
> I'd prefer:
>
> 1. have a separate machine_class for mainstone
> 2. or move the board specific map_io() separatedly
How about making the presence of mdesc->map_io override the class
version?
So if mainstone provides its own map_io() function, it is still
responsible (as is today) for calling the PXA specific map_io().
The same behaviour seems sensible to apply to the other class
functions as well - allow platforms to override the class
version, and leave the replacement platform function responsible
for calling the class if that's what it needs to do.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction
2010-06-21 9:02 ` Russell King - ARM Linux
@ 2010-06-21 10:19 ` Eric Miao
2010-06-21 15:38 ` Nicolas Pitre
0 siblings, 1 reply; 10+ messages in thread
From: Eric Miao @ 2010-06-21 10:19 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Jun 21, 2010 at 5:02 PM, Russell King - ARM Linux
<linux@arm.linux.org.uk> wrote:
> On Mon, Jun 21, 2010 at 04:23:22PM +0800, Eric Miao wrote:
>> So that from derivative POV, it can be expressed as:
>>
>> ? ? ? if (mdesc->class && mdesc->class->map_io)
>> ? ? ? ? ? ? ? mdesc->class->map_io();
>> ? ? ? if (mdesc->map_io())
>> ? ? ? ? ? ? ? mdesc->map_io();
>>
>> But this seems to make things a bit over complicated, so for such cases
>> I'd prefer:
>>
>> 1. have a separate machine_class for mainstone
>> 2. or move the board specific map_io() separatedly
>
> How about making the presence of mdesc->map_io override the class
> version?
>
> So if mainstone provides its own map_io() function, it is still
> responsible (as is today) for calling the PXA specific map_io().
> The same behaviour seems sensible to apply to the other class
> functions as well - allow platforms to override the class
> version, and leave the replacement platform function responsible
> for calling the class if that's what it needs to do.
>
Yep, that's a good idea, and actually was as my first version. Yet my
concern is this doesn't easily fit for the class data, i.e., allow the
machine specific data to override the class data like below:
if (valid_value(mdesc->phys_io))
use(mdesc->phys_io);
else
use(mdesc->class->phys_io);
but since phys_io could be valid for value zero (as if not explicitly
initialized), so we may end up defining like below to allow use of the
default class values:
MACHINE_START(....)
.phys_io = INVALID_ADDRESS,
.io_pg_offst = INVALID_ADDRESS,
....
MACHINE_END
This, however, creates some incompatiblity in semantics from the functions.
That's why I chose a much simpler scheme: use the class version if class
is there, otherwise use the machine specific one.
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction
2010-06-21 10:19 ` Eric Miao
@ 2010-06-21 15:38 ` Nicolas Pitre
2010-06-21 15:44 ` Eric Miao
0 siblings, 1 reply; 10+ messages in thread
From: Nicolas Pitre @ 2010-06-21 15:38 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, 21 Jun 2010, Eric Miao wrote:
> On Mon, Jun 21, 2010 at 5:02 PM, Russell King - ARM Linux
> <linux@arm.linux.org.uk> wrote:
> > The same behaviour seems sensible to apply to the other class
> > functions as well - allow platforms to override the class
> > version, and leave the replacement platform function responsible
> > for calling the class if that's what it needs to do.
> >
>
> Yep, that's a good idea, and actually was as my first version. Yet my
> concern is this doesn't easily fit for the class data, i.e., allow the
> machine specific data to override the class data like below:
>
> if (valid_value(mdesc->phys_io))
> use(mdesc->phys_io);
> else
> use(mdesc->class->phys_io);
>
> but since phys_io could be valid for value zero (as if not explicitly
> initialized), so we may end up defining like below to allow use of the
> default class values:
>
> MACHINE_START(....)
> .phys_io = INVALID_ADDRESS,
> .io_pg_offst = INVALID_ADDRESS,
> ....
> MACHINE_END
No, please don't do that. This is horribly ugly.
And in fact I would actually be highly surprised if 0 was a sensible
value to use for either of those fields anyway. No SOCs I know about
has its IO at physical address0, and we're even less likely to remap
them at virtual address 0 either. So having 0 meaning uninitialized
makes perfect sense in practice.
Nicolas
^ permalink raw reply [flat|nested] 10+ messages in thread
* [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction
2010-06-21 15:38 ` Nicolas Pitre
@ 2010-06-21 15:44 ` Eric Miao
0 siblings, 0 replies; 10+ messages in thread
From: Eric Miao @ 2010-06-21 15:44 UTC (permalink / raw)
To: linux-arm-kernel
On Mon, Jun 21, 2010 at 11:38 PM, Nicolas Pitre <nico@fluxnic.net> wrote:
> On Mon, 21 Jun 2010, Eric Miao wrote:
>
>> On Mon, Jun 21, 2010 at 5:02 PM, Russell King - ARM Linux
>> <linux@arm.linux.org.uk> wrote:
>> > The same behaviour seems sensible to apply to the other class
>> > functions as well - allow platforms to override the class
>> > version, and leave the replacement platform function responsible
>> > for calling the class if that's what it needs to do.
>> >
>>
>> Yep, that's a good idea, and actually was as my first version. Yet my
>> concern is this doesn't easily fit for the class data, i.e., allow the
>> machine specific data to override the class data like below:
>>
>> ? ? ? if (valid_value(mdesc->phys_io))
>> ? ? ? ? ? ? ? use(mdesc->phys_io);
>> ? ? ? else
>> ? ? ? ? ? ? ? use(mdesc->class->phys_io);
>>
>> but since phys_io could be valid for value zero (as if not explicitly
>> initialized), so we may end up defining like below to allow use of the
>> default class values:
>>
>> MACHINE_START(....)
>> ? ? ? .phys_io ? ? ? ?= INVALID_ADDRESS,
>> ? ? ? .io_pg_offst ? ?= INVALID_ADDRESS,
>> ? ? ? ....
>> MACHINE_END
>
> No, please don't do that. ?This is horribly ugly.
>
> And in fact I would actually be highly surprised if 0 was a sensible
> value to use for either of those fields anyway. ?No SOCs I know about
> has its IO at physical address0, and we're even less likely to remap
> them at virtual address 0 either. ?So having 0 meaning uninitialized
> makes perfect sense in practice.
>
Hrm... that makes sense. I'll add some comment to the 'struct machine_class'
and get this patch updated later.
^ permalink raw reply [flat|nested] 10+ messages in thread
end of thread, other threads:[~2010-06-21 15:44 UTC | newest]
Thread overview: 10+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2010-06-20 14:00 [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction Eric Miao
2010-06-20 14:00 ` [PATCH 2/2] [ARM] pxa: make use of 'struct machine_class' Eric Miao
2010-06-20 16:08 ` Antonio Ospite
2010-06-21 1:06 ` Eric Miao
2010-06-21 7:27 ` [PATCH 1/2] [ARM] Introduce 'struct machine_class' for SoC level abstraction Jeremy Kerr
2010-06-21 8:23 ` Eric Miao
2010-06-21 9:02 ` Russell King - ARM Linux
2010-06-21 10:19 ` Eric Miao
2010-06-21 15:38 ` Nicolas Pitre
2010-06-21 15:44 ` Eric Miao
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for NNTP newsgroup(s).