diff mbox

[BUG] Fix drivers/memory O= build

Message ID ba6087c5-c69e-1adc-9d9d-0ef5b19fb30e@ti.com (mailing list archive)
State New, archived
Headers show

Commit Message

Dave Gerlach April 9, 2018, 4:05 p.m. UTC
Hi,
On 04/07/2018 08:38 AM, Russell King - ARM Linux wrote:
> On Sat, Apr 07, 2018 at 11:55:22AM +0900, Masahiro Yamada wrote:
>> 2018-04-07 3:55 GMT+09:00 Russell King - ARM Linux <linux@armlinux.org.uk>:
>>> On Fri, Apr 06, 2018 at 11:45:01AM -0700, Santosh Shilimkar wrote:
>>>> On 4/6/2018 9:46 AM, Tony Lindgren wrote:
>>>>> * Russell King - ARM Linux <linux@armlinux.org.uk> [180406 03:27]:
>>>>>> When building a kernel with split object directories, the following
>>>>>> failure occurs:
>>>>>>
>>>>>> .../drivers/memory/emif-asm-offsets.c:1:0: fatal error: can't open drivers/memory/emif-asm-offsets.s for writing: No such file or directory
>>>>>> compilation terminated.
>>>>>> drivers/memory/Makefile.asm-offsets:2: recipe for target 'drivers/memory/emif-asm-offsets.s' failed
>>>>>> make[2]: *** [drivers/memory/emif-asm-offsets.s] Error 1
>>>>>> .../Makefile:1060: recipe for target 'arch/arm/mach-omap2' failed
>>>>>> make[1]: *** [arch/arm/mach-omap2] Error 2
>>>>>>
>>>>>> This prevents any kernel being built that includes decending into
>>>>>> arch/arm/mach-omap2 with split object directories.
>>>>>>
>>>>>> This is a regression.
>>>>>
>>>>> Dave, I presume you're looking into this already?
>>>>>
>>>> Fix is already posted by 'Anders Roxell <anders.roxell@linaro.org>'
>>>> You are copied on the email Tony.
>>>
>>> Arnd also has a fix for it as well, which moves emif-asm-offsets.s
>>> into include/generated, as that will always exist prior to these
>>> rules being invoked.  Arnd's passing it through his randconfig
>>> builder before publishing it.
>>
>>
>> I do not like this idea.
>>
>> Not sure exactly what Arnd is trying to do,
>> but the same file should not be touched from multiple points
>> in case Kbuild descends into mach-omap2/ and memory/ at the same time.
>>
>>
>> I recommend to put copies in each directory:
>>
>> arch/arm/mach-omap2/emif-asm-offsets.h
>> drivers/memory/ti-emif-asm-offsets.h
>>
>>
>> If you want me to send a patch,
>> I will give it a try.
> 
> Or we try and find another way around this.
> 
> The original idea was to start throwing platform specific (iow, stuff in
> arch/arm/mach-omap2/) includes into arch/arm/kernel/asm-offsets.c.  I
> objected to that, and suggested that the generic infrastructure for doing
> the asm-offsets thing should be used to generate an architecture specific
> header.
> 
> Then it turns out that files in both arch/arm/mach-omap2 and drivers/memory
> need these constants, and TI proposed the existing method.
> 
> Obviously, all the right people reviewed it and approved it, which is why
> it's now in mainline, but unfortunately it doesn't actually work, and
> breaks my kernel builds!
> 

A solution that I see is to allow pm-asm-offsets to just include the macros that
would be defined by emif-asm-offsets in the header generated by pm-asm-offsets.
This way there is no need to introduce the arch -> drivers build dependency that
is causing our issue, each driver generates its own header with everything it
needs included. I'll move the actual macro definitions for emif-asm-offsets.c
into a header and then by including them in both emif-asm-offsets and
pm-asm-offsets we get all macro definitions in both places with them still being
defined only in one location.

I've inlined the changes below. I will send a proper split up series if it's
considered acceptable.

Regards,
Dave

8< ----------------------
From 7350c7caa773d7235ddb21013bd039a16cb6d156 Mon Sep 17 00:00:00 2001
From: Dave Gerlach <d-gerlach@ti.com>
Date: Mon, 9 Apr 2018 10:56:59 -0500
Subject: [PATCH] RFC: Fix build when using split object directories

The sleep33xx and sleep43xx files should not depend on a header file
generated in drivers/memory. Remove this dependency and instead generate
the macros needed as part of pm-asm-offsets.c to avoid complicating the
build.

Signed-off-by: Dave Gerlach <d-gerlach@ti.com>
---
 arch/arm/mach-omap2/Makefile         |  7 +---
 arch/arm/mach-omap2/pm-asm-offsets.c |  3 ++
 arch/arm/mach-omap2/sleep33xx.S      |  1 -
 arch/arm/mach-omap2/sleep43xx.S      |  1 -
 drivers/memory/emif-asm-offsets.c    | 72 +---------------------------------
 include/linux/ti-emif-sram.h         | 75 ++++++++++++++++++++++++++++++++++++
 6 files changed, 81 insertions(+), 78 deletions(-)

Comments

Tony Lindgren April 10, 2018, 1:55 p.m. UTC | #1
* Dave Gerlach <d-gerlach@ti.com> [180409 16:07]:
> I've inlined the changes below. I will send a proper split up series if it's
> considered acceptable.

Seems fine from my point of view. No need to split the patch, best to
do the fix as a single patch.

We should test build it also with make randconfigs though.

So assuming others are OK with this and it does not introduce
new randconfig build errors:

Acked-by: Tony Lindgren <tony@atomide.com>
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
Masahiro Yamada April 10, 2018, 3:01 p.m. UTC | #2
2018-04-10 1:05 GMT+09:00 Dave Gerlach <d-gerlach@ti.com>:
> Hi,
> On 04/07/2018 08:38 AM, Russell King - ARM Linux wrote:
>> On Sat, Apr 07, 2018 at 11:55:22AM +0900, Masahiro Yamada wrote:
>>> 2018-04-07 3:55 GMT+09:00 Russell King - ARM Linux <linux@armlinux.org.uk>:
>>>> On Fri, Apr 06, 2018 at 11:45:01AM -0700, Santosh Shilimkar wrote:
>>>>> On 4/6/2018 9:46 AM, Tony Lindgren wrote:
>>>>>> * Russell King - ARM Linux <linux@armlinux.org.uk> [180406 03:27]:
>>>>>>> When building a kernel with split object directories, the following
>>>>>>> failure occurs:
>>>>>>>
>>>>>>> .../drivers/memory/emif-asm-offsets.c:1:0: fatal error: can't open drivers/memory/emif-asm-offsets.s for writing: No such file or directory
>>>>>>> compilation terminated.
>>>>>>> drivers/memory/Makefile.asm-offsets:2: recipe for target 'drivers/memory/emif-asm-offsets.s' failed
>>>>>>> make[2]: *** [drivers/memory/emif-asm-offsets.s] Error 1
>>>>>>> .../Makefile:1060: recipe for target 'arch/arm/mach-omap2' failed
>>>>>>> make[1]: *** [arch/arm/mach-omap2] Error 2
>>>>>>>
>>>>>>> This prevents any kernel being built that includes decending into
>>>>>>> arch/arm/mach-omap2 with split object directories.
>>>>>>>
>>>>>>> This is a regression.
>>>>>>
>>>>>> Dave, I presume you're looking into this already?
>>>>>>
>>>>> Fix is already posted by 'Anders Roxell <anders.roxell@linaro.org>'
>>>>> You are copied on the email Tony.
>>>>
>>>> Arnd also has a fix for it as well, which moves emif-asm-offsets.s
>>>> into include/generated, as that will always exist prior to these
>>>> rules being invoked.  Arnd's passing it through his randconfig
>>>> builder before publishing it.
>>>
>>>
>>> I do not like this idea.
>>>
>>> Not sure exactly what Arnd is trying to do,
>>> but the same file should not be touched from multiple points
>>> in case Kbuild descends into mach-omap2/ and memory/ at the same time.
>>>
>>>
>>> I recommend to put copies in each directory:
>>>
>>> arch/arm/mach-omap2/emif-asm-offsets.h
>>> drivers/memory/ti-emif-asm-offsets.h
>>>
>>>
>>> If you want me to send a patch,
>>> I will give it a try.
>>
>> Or we try and find another way around this.
>>
>> The original idea was to start throwing platform specific (iow, stuff in
>> arch/arm/mach-omap2/) includes into arch/arm/kernel/asm-offsets.c.  I
>> objected to that, and suggested that the generic infrastructure for doing
>> the asm-offsets thing should be used to generate an architecture specific
>> header.
>>
>> Then it turns out that files in both arch/arm/mach-omap2 and drivers/memory
>> need these constants, and TI proposed the existing method.
>>
>> Obviously, all the right people reviewed it and approved it, which is why
>> it's now in mainline, but unfortunately it doesn't actually work, and
>> breaks my kernel builds!
>>
>
> A solution that I see is to allow pm-asm-offsets to just include the macros that
> would be defined by emif-asm-offsets in the header generated by pm-asm-offsets.
> This way there is no need to introduce the arch -> drivers build dependency that
> is causing our issue, each driver generates its own header with everything it
> needs included. I'll move the actual macro definitions for emif-asm-offsets.c
> into a header and then by including them in both emif-asm-offsets and
> pm-asm-offsets we get all macro definitions in both places with them still being
> defined only in one location.
>
> I've inlined the changes below. I will send a proper split up series if it's
> considered acceptable.
>
> Regards,
> Dave
>
> 8< ----------------------
> From 7350c7caa773d7235ddb21013bd039a16cb6d156 Mon Sep 17 00:00:00 2001
> From: Dave Gerlach <d-gerlach@ti.com>
> Date: Mon, 9 Apr 2018 10:56:59 -0500
> Subject: [PATCH] RFC: Fix build when using split object directories
>
> The sleep33xx and sleep43xx files should not depend on a header file
> generated in drivers/memory. Remove this dependency and instead generate
> the macros needed as part of pm-asm-offsets.c to avoid complicating the
> build.
>
> Signed-off-by: Dave Gerlach <d-gerlach@ti.com>
> ---
>  arch/arm/mach-omap2/Makefile         |  7 +---
>  arch/arm/mach-omap2/pm-asm-offsets.c |  3 ++
>  arch/arm/mach-omap2/sleep33xx.S      |  1 -
>  arch/arm/mach-omap2/sleep43xx.S      |  1 -
>  drivers/memory/emif-asm-offsets.c    | 72 +---------------------------------
>  include/linux/ti-emif-sram.h         | 75 ++++++++++++++++++++++++++++++++++++
>  6 files changed, 81 insertions(+), 78 deletions(-)
>
> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
> index 4603c30fef73..1257810cdb80 100644
> --- a/arch/arm/mach-omap2/Makefile
> +++ b/arch/arm/mach-omap2/Makefile
> @@ -243,8 +243,5 @@ arch/arm/mach-omap2/pm-asm-offsets.s:
> arch/arm/mach-omap2/pm-asm-offsets.c
>  include/generated/ti-pm-asm-offsets.h: arch/arm/mach-omap2/pm-asm-offsets.s FORCE
>         $(call filechk,offsets,__TI_PM_ASM_OFFSETS_H__)
>
> -# For rule to generate ti-emif-asm-offsets.h dependency
> -include drivers/memory/Makefile.asm-offsets
> -
> -arch/arm/mach-omap2/sleep33xx.o: include/generated/ti-pm-asm-offsets.h
> include/generated/ti-emif-asm-offsets.h
> -arch/arm/mach-omap2/sleep43xx.o: include/generated/ti-pm-asm-offsets.h
> include/generated/ti-emif-asm-offsets.h
> +arch/arm/mach-omap2/sleep33xx.o: include/generated/ti-pm-asm-offsets.h
> +arch/arm/mach-omap2/sleep43xx.o: include/generated/ti-pm-asm-offsets.h


Nit:
You are touching these two lines.
You can also describe it like this:

$(obj)/sleep33xx.o $(obj)/sleep43xx.o: include/generated/ti-pm-asm-offsets.h



I prefer putting the local header, ti-pm-asm-offsets.h,
into arch/arm/mach-omap2/, but that is a different issue.

So, I am fine with this.


Reviewed-by: Masahiro Yamada <yamada.masahiro@socionext.com>
Dave Gerlach April 11, 2018, 9:17 p.m. UTC | #3
Hi,
On 04/10/2018 10:01 AM, Masahiro Yamada wrote:
> 2018-04-10 1:05 GMT+09:00 Dave Gerlach <d-gerlach@ti.com>:
>> Hi,
>> On 04/07/2018 08:38 AM, Russell King - ARM Linux wrote:
>>> On Sat, Apr 07, 2018 at 11:55:22AM +0900, Masahiro Yamada wrote:
>>>> 2018-04-07 3:55 GMT+09:00 Russell King - ARM Linux <linux@armlinux.org.uk>:
>>>>> On Fri, Apr 06, 2018 at 11:45:01AM -0700, Santosh Shilimkar wrote:
>>>>>> On 4/6/2018 9:46 AM, Tony Lindgren wrote:
>>>>>>> * Russell King - ARM Linux <linux@armlinux.org.uk> [180406 03:27]:
>>>>>>>> When building a kernel with split object directories, the following
>>>>>>>> failure occurs:
>>>>>>>>
>>>>>>>> .../drivers/memory/emif-asm-offsets.c:1:0: fatal error: can't open drivers/memory/emif-asm-offsets.s for writing: No such file or directory
>>>>>>>> compilation terminated.
>>>>>>>> drivers/memory/Makefile.asm-offsets:2: recipe for target 'drivers/memory/emif-asm-offsets.s' failed
>>>>>>>> make[2]: *** [drivers/memory/emif-asm-offsets.s] Error 1
>>>>>>>> .../Makefile:1060: recipe for target 'arch/arm/mach-omap2' failed
>>>>>>>> make[1]: *** [arch/arm/mach-omap2] Error 2
>>>>>>>>
>>>>>>>> This prevents any kernel being built that includes decending into
>>>>>>>> arch/arm/mach-omap2 with split object directories.
>>>>>>>>
>>>>>>>> This is a regression.
>>>>>>>
>>>>>>> Dave, I presume you're looking into this already?
>>>>>>>
>>>>>> Fix is already posted by 'Anders Roxell <anders.roxell@linaro.org>'
>>>>>> You are copied on the email Tony.
>>>>>
>>>>> Arnd also has a fix for it as well, which moves emif-asm-offsets.s
>>>>> into include/generated, as that will always exist prior to these
>>>>> rules being invoked.  Arnd's passing it through his randconfig
>>>>> builder before publishing it.
>>>>
>>>>
>>>> I do not like this idea.
>>>>
>>>> Not sure exactly what Arnd is trying to do,
>>>> but the same file should not be touched from multiple points
>>>> in case Kbuild descends into mach-omap2/ and memory/ at the same time.
>>>>
>>>>
>>>> I recommend to put copies in each directory:
>>>>
>>>> arch/arm/mach-omap2/emif-asm-offsets.h
>>>> drivers/memory/ti-emif-asm-offsets.h
>>>>
>>>>
>>>> If you want me to send a patch,
>>>> I will give it a try.
>>>
>>> Or we try and find another way around this.
>>>
>>> The original idea was to start throwing platform specific (iow, stuff in
>>> arch/arm/mach-omap2/) includes into arch/arm/kernel/asm-offsets.c.  I
>>> objected to that, and suggested that the generic infrastructure for doing
>>> the asm-offsets thing should be used to generate an architecture specific
>>> header.
>>>
>>> Then it turns out that files in both arch/arm/mach-omap2 and drivers/memory
>>> need these constants, and TI proposed the existing method.
>>>
>>> Obviously, all the right people reviewed it and approved it, which is why
>>> it's now in mainline, but unfortunately it doesn't actually work, and
>>> breaks my kernel builds!
>>>
>>
>> A solution that I see is to allow pm-asm-offsets to just include the macros that
>> would be defined by emif-asm-offsets in the header generated by pm-asm-offsets.
>> This way there is no need to introduce the arch -> drivers build dependency that
>> is causing our issue, each driver generates its own header with everything it
>> needs included. I'll move the actual macro definitions for emif-asm-offsets.c
>> into a header and then by including them in both emif-asm-offsets and
>> pm-asm-offsets we get all macro definitions in both places with them still being
>> defined only in one location.
>>
>> I've inlined the changes below. I will send a proper split up series if it's
>> considered acceptable.
>>
>> Regards,
>> Dave
>>
>> 8< ----------------------
>> From 7350c7caa773d7235ddb21013bd039a16cb6d156 Mon Sep 17 00:00:00 2001
>> From: Dave Gerlach <d-gerlach@ti.com>
>> Date: Mon, 9 Apr 2018 10:56:59 -0500
>> Subject: [PATCH] RFC: Fix build when using split object directories
>>
>> The sleep33xx and sleep43xx files should not depend on a header file
>> generated in drivers/memory. Remove this dependency and instead generate
>> the macros needed as part of pm-asm-offsets.c to avoid complicating the
>> build.
>>
>> Signed-off-by: Dave Gerlach <d-gerlach@ti.com>
>> ---
>>  arch/arm/mach-omap2/Makefile         |  7 +---
>>  arch/arm/mach-omap2/pm-asm-offsets.c |  3 ++
>>  arch/arm/mach-omap2/sleep33xx.S      |  1 -
>>  arch/arm/mach-omap2/sleep43xx.S      |  1 -
>>  drivers/memory/emif-asm-offsets.c    | 72 +---------------------------------
>>  include/linux/ti-emif-sram.h         | 75 ++++++++++++++++++++++++++++++++++++
>>  6 files changed, 81 insertions(+), 78 deletions(-)
>>
>> diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
>> index 4603c30fef73..1257810cdb80 100644
>> --- a/arch/arm/mach-omap2/Makefile
>> +++ b/arch/arm/mach-omap2/Makefile
>> @@ -243,8 +243,5 @@ arch/arm/mach-omap2/pm-asm-offsets.s:
>> arch/arm/mach-omap2/pm-asm-offsets.c
>>  include/generated/ti-pm-asm-offsets.h: arch/arm/mach-omap2/pm-asm-offsets.s FORCE
>>         $(call filechk,offsets,__TI_PM_ASM_OFFSETS_H__)
>>
>> -# For rule to generate ti-emif-asm-offsets.h dependency
>> -include drivers/memory/Makefile.asm-offsets
>> -
>> -arch/arm/mach-omap2/sleep33xx.o: include/generated/ti-pm-asm-offsets.h
>> include/generated/ti-emif-asm-offsets.h
>> -arch/arm/mach-omap2/sleep43xx.o: include/generated/ti-pm-asm-offsets.h
>> include/generated/ti-emif-asm-offsets.h
>> +arch/arm/mach-omap2/sleep33xx.o: include/generated/ti-pm-asm-offsets.h
>> +arch/arm/mach-omap2/sleep43xx.o: include/generated/ti-pm-asm-offsets.h
> 
> 
> Nit:
> You are touching these two lines.
> You can also describe it like this:
> 
> $(obj)/sleep33xx.o $(obj)/sleep43xx.o: include/generated/ti-pm-asm-offsets.h
> 
> 
> 
> I prefer putting the local header, ti-pm-asm-offsets.h,
> into arch/arm/mach-omap2/, but that is a different issue.
> 
> So, I am fine with this.
> 
> 
> Reviewed-by: Masahiro Yamada <yamada.masahiro@socionext.com>
> 
> 
> 

Thanks, I have sent a patch with the nit above changed and slightly more info in
the commit message and added the Ack from Tony and Reviewed-by from above.

https://lkml.org/lkml/2018/4/11/1281

Regards,
Dave
--
To unsubscribe from this list: send the line "unsubscribe linux-omap" in
the body of a message to majordomo@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html
diff mbox

Patch

diff --git a/arch/arm/mach-omap2/Makefile b/arch/arm/mach-omap2/Makefile
index 4603c30fef73..1257810cdb80 100644
--- a/arch/arm/mach-omap2/Makefile
+++ b/arch/arm/mach-omap2/Makefile
@@ -243,8 +243,5 @@  arch/arm/mach-omap2/pm-asm-offsets.s:
arch/arm/mach-omap2/pm-asm-offsets.c
 include/generated/ti-pm-asm-offsets.h: arch/arm/mach-omap2/pm-asm-offsets.s FORCE
 	$(call filechk,offsets,__TI_PM_ASM_OFFSETS_H__)

-# For rule to generate ti-emif-asm-offsets.h dependency
-include drivers/memory/Makefile.asm-offsets
-
-arch/arm/mach-omap2/sleep33xx.o: include/generated/ti-pm-asm-offsets.h
include/generated/ti-emif-asm-offsets.h
-arch/arm/mach-omap2/sleep43xx.o: include/generated/ti-pm-asm-offsets.h
include/generated/ti-emif-asm-offsets.h
+arch/arm/mach-omap2/sleep33xx.o: include/generated/ti-pm-asm-offsets.h
+arch/arm/mach-omap2/sleep43xx.o: include/generated/ti-pm-asm-offsets.h
diff --git a/arch/arm/mach-omap2/pm-asm-offsets.c
b/arch/arm/mach-omap2/pm-asm-offsets.c
index 6d4392da7c11..b9846b19e5e2 100644
--- a/arch/arm/mach-omap2/pm-asm-offsets.c
+++ b/arch/arm/mach-omap2/pm-asm-offsets.c
@@ -7,9 +7,12 @@ 

 #include <linux/kbuild.h>
 #include <linux/platform_data/pm33xx.h>
+#include <linux/ti-emif-sram.h>

 int main(void)
 {
+	ti_emif_asm_offsets();
+
 	DEFINE(AMX3_PM_WFI_FLAGS_OFFSET,
 	       offsetof(struct am33xx_pm_sram_data, wfi_flags));
 	DEFINE(AMX3_PM_L2_AUX_CTRL_VAL_OFFSET,
diff --git a/arch/arm/mach-omap2/sleep33xx.S b/arch/arm/mach-omap2/sleep33xx.S
index 218d79930b04..322b3bb868b4 100644
--- a/arch/arm/mach-omap2/sleep33xx.S
+++ b/arch/arm/mach-omap2/sleep33xx.S
@@ -6,7 +6,6 @@ 
  *	Dave Gerlach, Vaibhav Bedia
  */

-#include <generated/ti-emif-asm-offsets.h>
 #include <generated/ti-pm-asm-offsets.h>
 #include <linux/linkage.h>
 #include <linux/ti-emif-sram.h>
diff --git a/arch/arm/mach-omap2/sleep43xx.S b/arch/arm/mach-omap2/sleep43xx.S
index b24be624e8b9..8903814a6677 100644
--- a/arch/arm/mach-omap2/sleep43xx.S
+++ b/arch/arm/mach-omap2/sleep43xx.S
@@ -6,7 +6,6 @@ 
  *	Dave Gerlach, Vaibhav Bedia
  */

-#include <generated/ti-emif-asm-offsets.h>
 #include <generated/ti-pm-asm-offsets.h>
 #include <linux/linkage.h>
 #include <linux/ti-emif-sram.h>
diff --git a/drivers/memory/emif-asm-offsets.c b/drivers/memory/emif-asm-offsets.c
index 71a89d5d3efd..db8043019ec6 100644
--- a/drivers/memory/emif-asm-offsets.c
+++ b/drivers/memory/emif-asm-offsets.c
@@ -16,77 +16,7 @@ 

 int main(void)
 {
-	DEFINE(EMIF_SDCFG_VAL_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_sdcfg_val));
-	DEFINE(EMIF_TIMING1_VAL_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_timing1_val));
-	DEFINE(EMIF_TIMING2_VAL_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_timing2_val));
-	DEFINE(EMIF_TIMING3_VAL_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_timing3_val));
-	DEFINE(EMIF_REF_CTRL_VAL_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_ref_ctrl_val));
-	DEFINE(EMIF_ZQCFG_VAL_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_zqcfg_val));
-	DEFINE(EMIF_PMCR_VAL_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_pmcr_val));
-	DEFINE(EMIF_PMCR_SHDW_VAL_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_pmcr_shdw_val));
-	DEFINE(EMIF_RD_WR_LEVEL_RAMP_CTRL_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_rd_wr_level_ramp_ctrl));
-	DEFINE(EMIF_RD_WR_EXEC_THRESH_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_rd_wr_exec_thresh));
-	DEFINE(EMIF_COS_CONFIG_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_cos_config));
-	DEFINE(EMIF_PRIORITY_TO_COS_MAPPING_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_priority_to_cos_mapping));
-	DEFINE(EMIF_CONNECT_ID_SERV_1_MAP_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_connect_id_serv_1_map));
-	DEFINE(EMIF_CONNECT_ID_SERV_2_MAP_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_connect_id_serv_2_map));
-	DEFINE(EMIF_OCP_CONFIG_VAL_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_ocp_config_val));
-	DEFINE(EMIF_LPDDR2_NVM_TIM_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_lpddr2_nvm_tim));
-	DEFINE(EMIF_LPDDR2_NVM_TIM_SHDW_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_lpddr2_nvm_tim_shdw));
-	DEFINE(EMIF_DLL_CALIB_CTRL_VAL_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_dll_calib_ctrl_val));
-	DEFINE(EMIF_DLL_CALIB_CTRL_VAL_SHDW_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_dll_calib_ctrl_val_shdw));
-	DEFINE(EMIF_DDR_PHY_CTLR_1_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_ddr_phy_ctlr_1));
-	DEFINE(EMIF_EXT_PHY_CTRL_VALS_OFFSET,
-	       offsetof(struct emif_regs_amx3, emif_ext_phy_ctrl_vals));
-	DEFINE(EMIF_REGS_AMX3_SIZE, sizeof(struct emif_regs_amx3));
-
-	BLANK();
-
-	DEFINE(EMIF_PM_BASE_ADDR_VIRT_OFFSET,
-	       offsetof(struct ti_emif_pm_data, ti_emif_base_addr_virt));
-	DEFINE(EMIF_PM_BASE_ADDR_PHYS_OFFSET,
-	       offsetof(struct ti_emif_pm_data, ti_emif_base_addr_phys));
-	DEFINE(EMIF_PM_CONFIG_OFFSET,
-	       offsetof(struct ti_emif_pm_data, ti_emif_sram_config));
-	DEFINE(EMIF_PM_REGS_VIRT_OFFSET,
-	       offsetof(struct ti_emif_pm_data, regs_virt));
-	DEFINE(EMIF_PM_REGS_PHYS_OFFSET,
-	       offsetof(struct ti_emif_pm_data, regs_phys));
-	DEFINE(EMIF_PM_DATA_SIZE, sizeof(struct ti_emif_pm_data));
-
-	BLANK();
-
-	DEFINE(EMIF_PM_SAVE_CONTEXT_OFFSET,
-	       offsetof(struct ti_emif_pm_functions, save_context));
-	DEFINE(EMIF_PM_RESTORE_CONTEXT_OFFSET,
-	       offsetof(struct ti_emif_pm_functions, restore_context));
-	DEFINE(EMIF_PM_ENTER_SR_OFFSET,
-	       offsetof(struct ti_emif_pm_functions, enter_sr));
-	DEFINE(EMIF_PM_EXIT_SR_OFFSET,
-	       offsetof(struct ti_emif_pm_functions, exit_sr));
-	DEFINE(EMIF_PM_ABORT_SR_OFFSET,
-	       offsetof(struct ti_emif_pm_functions, abort_sr));
-	DEFINE(EMIF_PM_FUNCTIONS_SIZE, sizeof(struct ti_emif_pm_functions));
+	ti_emif_asm_offsets();

 	return 0;
 }
diff --git a/include/linux/ti-emif-sram.h b/include/linux/ti-emif-sram.h
index 45bc6b376492..53604b087f2c 100644
--- a/include/linux/ti-emif-sram.h
+++ b/include/linux/ti-emif-sram.h
@@ -60,6 +60,81 @@  struct ti_emif_pm_functions {
 	u32 abort_sr;
 } __packed __aligned(8);

+static inline void ti_emif_asm_offsets(void)
+{
+	DEFINE(EMIF_SDCFG_VAL_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_sdcfg_val));
+	DEFINE(EMIF_TIMING1_VAL_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_timing1_val));
+	DEFINE(EMIF_TIMING2_VAL_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_timing2_val));
+	DEFINE(EMIF_TIMING3_VAL_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_timing3_val));
+	DEFINE(EMIF_REF_CTRL_VAL_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_ref_ctrl_val));
+	DEFINE(EMIF_ZQCFG_VAL_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_zqcfg_val));
+	DEFINE(EMIF_PMCR_VAL_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_pmcr_val));
+	DEFINE(EMIF_PMCR_SHDW_VAL_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_pmcr_shdw_val));
+	DEFINE(EMIF_RD_WR_LEVEL_RAMP_CTRL_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_rd_wr_level_ramp_ctrl));
+	DEFINE(EMIF_RD_WR_EXEC_THRESH_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_rd_wr_exec_thresh));
+	DEFINE(EMIF_COS_CONFIG_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_cos_config));
+	DEFINE(EMIF_PRIORITY_TO_COS_MAPPING_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_priority_to_cos_mapping));
+	DEFINE(EMIF_CONNECT_ID_SERV_1_MAP_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_connect_id_serv_1_map));
+	DEFINE(EMIF_CONNECT_ID_SERV_2_MAP_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_connect_id_serv_2_map));
+	DEFINE(EMIF_OCP_CONFIG_VAL_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_ocp_config_val));
+	DEFINE(EMIF_LPDDR2_NVM_TIM_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_lpddr2_nvm_tim));
+	DEFINE(EMIF_LPDDR2_NVM_TIM_SHDW_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_lpddr2_nvm_tim_shdw));
+	DEFINE(EMIF_DLL_CALIB_CTRL_VAL_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_dll_calib_ctrl_val));
+	DEFINE(EMIF_DLL_CALIB_CTRL_VAL_SHDW_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_dll_calib_ctrl_val_shdw));
+	DEFINE(EMIF_DDR_PHY_CTLR_1_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_ddr_phy_ctlr_1));
+	DEFINE(EMIF_EXT_PHY_CTRL_VALS_OFFSET,
+	       offsetof(struct emif_regs_amx3, emif_ext_phy_ctrl_vals));
+	DEFINE(EMIF_REGS_AMX3_SIZE, sizeof(struct emif_regs_amx3));
+
+	BLANK();
+
+	DEFINE(EMIF_PM_BASE_ADDR_VIRT_OFFSET,
+	       offsetof(struct ti_emif_pm_data, ti_emif_base_addr_virt));
+	DEFINE(EMIF_PM_BASE_ADDR_PHYS_OFFSET,
+	       offsetof(struct ti_emif_pm_data, ti_emif_base_addr_phys));
+	DEFINE(EMIF_PM_CONFIG_OFFSET,
+	       offsetof(struct ti_emif_pm_data, ti_emif_sram_config));
+	DEFINE(EMIF_PM_REGS_VIRT_OFFSET,
+	       offsetof(struct ti_emif_pm_data, regs_virt));
+	DEFINE(EMIF_PM_REGS_PHYS_OFFSET,
+	       offsetof(struct ti_emif_pm_data, regs_phys));
+	DEFINE(EMIF_PM_DATA_SIZE, sizeof(struct ti_emif_pm_data));
+
+	BLANK();
+
+	DEFINE(EMIF_PM_SAVE_CONTEXT_OFFSET,
+	       offsetof(struct ti_emif_pm_functions, save_context));
+	DEFINE(EMIF_PM_RESTORE_CONTEXT_OFFSET,
+	       offsetof(struct ti_emif_pm_functions, restore_context));
+	DEFINE(EMIF_PM_ENTER_SR_OFFSET,
+	       offsetof(struct ti_emif_pm_functions, enter_sr));
+	DEFINE(EMIF_PM_EXIT_SR_OFFSET,
+	       offsetof(struct ti_emif_pm_functions, exit_sr));
+	DEFINE(EMIF_PM_ABORT_SR_OFFSET,
+	       offsetof(struct ti_emif_pm_functions, abort_sr));
+	DEFINE(EMIF_PM_FUNCTIONS_SIZE, sizeof(struct ti_emif_pm_functions));
+}
+
 struct gen_pool;

 int ti_emif_copy_pm_function_table(struct gen_pool *sram_pool, void *dst);