diff mbox series

[U-Boot,3/5] api: Flush cache when closing api

Message ID 20180430083431.72606-1-manu@freebsd.org
State Deferred
Delegated to: Tom Rini
Headers show
Series None | expand

Commit Message

Emmanuel Vadot April 30, 2018, 8:34 a.m. UTC
Signed-off-by: Emmanuel Vadot <manu@freebsd.org>
---
 api/api.c | 11 +++++++++++
 1 file changed, 11 insertions(+)

Comments

Emmanuel Vadot May 4, 2018, 7:12 a.m. UTC | #1
On Mon, 30 Apr 2018 10:37:50 +0200
"Dr. Philipp Tomsich" <philipp.tomsich@theobroma-systems.com> wrote:

> 
> > On 30 Apr 2018, at 10:34, Emmanuel Vadot <manu@freebsd.org> wrote:
> > 
> > Signed-off-by: Emmanuel Vadot <manu@freebsd.org>
> > ---
> > api/api.c | 11 +++++++++++
> > 1 file changed, 11 insertions(+)
> > 
> > diff --git a/api/api.c b/api/api.c
> > index 7eee2fc083..7d1608b520 100644
> > --- a/api/api.c
> > +++ b/api/api.c
> > @@ -290,6 +290,17 @@ static int API_dev_close(va_list ap)
> > 	if (!err)
> > 		di->state = DEV_STA_CLOSED;
> > 
> > +#if defined(CONFIG_SYS_HAVE_DCACHE_MAINTENANCE) && \
> > +	!defined(CONFIG_SYS_DCACHE_OFF)
> > +	if (dcache_status())
> > +		flush_dcache_all();
> > +#endif
> > +#if defined(CONFIG_SYS_HAVE_ICACHE_MAINTENANCE) && \
> > +	!defined(CONFIG_SYS_ICACHE_OFF)
> > +	if (icache_status())
> > +		invalidate_icache_all();
> > +#endif
> 
> Wouldn?t it be a cleaner option to make flush_dcache_all and invalidate_icache_all
> weak-functions and provide a default implementation that does nothing. Those
> architectures that then need to implement specific cache maintenance, could
> override these as required.

 Tom had some concern about using weak function for this, see
https://lists.denx.de/pipermail/u-boot/2017-February/280652.html

 But if everybody is happy with me adding some global weak function for
caches I'll do that.

> > 	return err;
> > }
> > 
> > -- 
> > 2.16.3
> >
Simon Glass May 4, 2018, 9:37 p.m. UTC | #2
Hi,

On 4 May 2018 at 01:12, Emmanuel Vadot <manu@bidouilliste.com> wrote:
> On Mon, 30 Apr 2018 10:37:50 +0200
> "Dr. Philipp Tomsich" <philipp.tomsich@theobroma-systems.com> wrote:
>
>>
>> > On 30 Apr 2018, at 10:34, Emmanuel Vadot <manu@freebsd.org> wrote:
>> >
>> > Signed-off-by: Emmanuel Vadot <manu@freebsd.org>
>> > ---
>> > api/api.c | 11 +++++++++++
>> > 1 file changed, 11 insertions(+)
>> >
>> > diff --git a/api/api.c b/api/api.c
>> > index 7eee2fc083..7d1608b520 100644
>> > --- a/api/api.c
>> > +++ b/api/api.c
>> > @@ -290,6 +290,17 @@ static int API_dev_close(va_list ap)
>> >     if (!err)
>> >             di->state = DEV_STA_CLOSED;
>> >
>> > +#if defined(CONFIG_SYS_HAVE_DCACHE_MAINTENANCE) && \
>> > +   !defined(CONFIG_SYS_DCACHE_OFF)
>> > +   if (dcache_status())
>> > +           flush_dcache_all();
>> > +#endif
>> > +#if defined(CONFIG_SYS_HAVE_ICACHE_MAINTENANCE) && \
>> > +   !defined(CONFIG_SYS_ICACHE_OFF)
>> > +   if (icache_status())
>> > +           invalidate_icache_all();
>> > +#endif
>>
>> Wouldn?t it be a cleaner option to make flush_dcache_all and
invalidate_icache_all
>> weak-functions and provide a default implementation that does nothing.
Those
>> architectures that then need to implement specific cache maintenance,
could
>> override these as required.
>
>  Tom had some concern about using weak function for this, see
> https://lists.denx.de/pipermail/u-boot/2017-February/280652.html
>
>  But if everybody is happy with me adding some global weak function for
> caches I'll do that.
>

I'm not very happy about it. Weak functions are just so hard to figure out.
Is it called or not? The lack of link-time error is painful when debugging.

Regards,
Simon
Tom Rini May 4, 2018, 10:10 p.m. UTC | #3
On Fri, May 04, 2018 at 09:12:49AM +0200, Emmanuel Vadot wrote:
> On Mon, 30 Apr 2018 10:37:50 +0200
> "Dr. Philipp Tomsich" <philipp.tomsich@theobroma-systems.com> wrote:
> 
> > 
> > > On 30 Apr 2018, at 10:34, Emmanuel Vadot <manu@freebsd.org> wrote:
> > > 
> > > Signed-off-by: Emmanuel Vadot <manu@freebsd.org>
> > > ---
> > > api/api.c | 11 +++++++++++
> > > 1 file changed, 11 insertions(+)
> > > 
> > > diff --git a/api/api.c b/api/api.c
> > > index 7eee2fc083..7d1608b520 100644
> > > --- a/api/api.c
> > > +++ b/api/api.c
> > > @@ -290,6 +290,17 @@ static int API_dev_close(va_list ap)
> > > 	if (!err)
> > > 		di->state = DEV_STA_CLOSED;
> > > 
> > > +#if defined(CONFIG_SYS_HAVE_DCACHE_MAINTENANCE) && \
> > > +	!defined(CONFIG_SYS_DCACHE_OFF)
> > > +	if (dcache_status())
> > > +		flush_dcache_all();
> > > +#endif
> > > +#if defined(CONFIG_SYS_HAVE_ICACHE_MAINTENANCE) && \
> > > +	!defined(CONFIG_SYS_ICACHE_OFF)
> > > +	if (icache_status())
> > > +		invalidate_icache_all();
> > > +#endif
> > 
> > Wouldn?t it be a cleaner option to make flush_dcache_all and invalidate_icache_all
> > weak-functions and provide a default implementation that does nothing. Those
> > architectures that then need to implement specific cache maintenance, could
> > override these as required.
> 
>  Tom had some concern about using weak function for this, see
> https://lists.denx.de/pipermail/u-boot/2017-February/280652.html

In this specific case before we could use weak functions we would need
to do some wide-ranging cleanups for consistently named and functional
cache functions.
diff mbox series

Patch

diff --git a/api/api.c b/api/api.c
index 7eee2fc083..7d1608b520 100644
--- a/api/api.c
+++ b/api/api.c
@@ -290,6 +290,17 @@  static int API_dev_close(va_list ap)
 	if (!err)
 		di->state = DEV_STA_CLOSED;
 
+#if defined(CONFIG_SYS_HAVE_DCACHE_MAINTENANCE) && \
+	!defined(CONFIG_SYS_DCACHE_OFF)
+	if (dcache_status())
+		flush_dcache_all();
+#endif
+#if defined(CONFIG_SYS_HAVE_ICACHE_MAINTENANCE) && \
+	!defined(CONFIG_SYS_ICACHE_OFF)
+	if (icache_status())
+		invalidate_icache_all();
+#endif
+
 	return err;
 }