xref: /linux/arch/m68k/include/asm/bootstd.h (revision 498495dba268b20e8eadd7fe93c140c68b6cc9d2)
1*b2441318SGreg Kroah-Hartman /* SPDX-License-Identifier: GPL-2.0 */
249148020SSam Ravnborg /* bootstd.h:  Bootloader system call interface
349148020SSam Ravnborg  *
449148020SSam Ravnborg  * (c) 1999, Rt-Control, Inc.
549148020SSam Ravnborg  */
649148020SSam Ravnborg 
749148020SSam Ravnborg #ifndef __BOOTSTD_H__
849148020SSam Ravnborg #define __BOOTSTD_H__
949148020SSam Ravnborg 
1049148020SSam Ravnborg #define NR_BSC 21            /* last used bootloader system call */
1149148020SSam Ravnborg 
1249148020SSam Ravnborg #define __BN_reset        0  /* reset and start the bootloader */
1349148020SSam Ravnborg #define __BN_test         1  /* tests the system call interface */
1449148020SSam Ravnborg #define __BN_exec         2  /* executes a bootloader image */
1549148020SSam Ravnborg #define __BN_exit         3  /* terminates a bootloader image */
1649148020SSam Ravnborg #define __BN_program      4  /* program FLASH from a chain */
1749148020SSam Ravnborg #define __BN_erase        5  /* erase sector(s) of FLASH */
1849148020SSam Ravnborg #define __BN_open         6
1949148020SSam Ravnborg #define __BN_write        7
2049148020SSam Ravnborg #define __BN_read         8
2149148020SSam Ravnborg #define __BN_close        9
2249148020SSam Ravnborg #define __BN_mmap         10 /* map a file descriptor into memory */
2349148020SSam Ravnborg #define __BN_munmap       11 /* remove a file to memory mapping */
2449148020SSam Ravnborg #define __BN_gethwaddr    12 /* get the hardware address of my interfaces */
2549148020SSam Ravnborg #define __BN_getserialnum 13 /* get the serial number of this board */
2649148020SSam Ravnborg #define __BN_getbenv      14 /* get a bootloader envvar */
2749148020SSam Ravnborg #define __BN_setbenv      15 /* get a bootloader envvar */
2849148020SSam Ravnborg #define __BN_setpmask     16 /* set the protection mask */
2949148020SSam Ravnborg #define __BN_readenv      17 /* read environment variables */
3049148020SSam Ravnborg #define __BN_flash_chattr_range		18
3149148020SSam Ravnborg #define __BN_flash_erase_range		19
3249148020SSam Ravnborg #define __BN_flash_write_range		20
3349148020SSam Ravnborg 
3449148020SSam Ravnborg /* Calling conventions compatible to (uC)linux/68k
3525985edcSLucas De Marchi  * We use similar macros to call into the bootloader as for uClinux
3649148020SSam Ravnborg  */
3749148020SSam Ravnborg 
3849148020SSam Ravnborg #define __bsc_return(type, res) \
3949148020SSam Ravnborg do { \
4049148020SSam Ravnborg    if ((unsigned long)(res) >= (unsigned long)(-64)) { \
4149148020SSam Ravnborg       /* let errno be a function, preserve res in %d0 */ \
4249148020SSam Ravnborg       int __err = -(res); \
4349148020SSam Ravnborg       errno = __err; \
4449148020SSam Ravnborg       res = -1; \
4549148020SSam Ravnborg    } \
4649148020SSam Ravnborg    return (type)(res); \
4749148020SSam Ravnborg } while (0)
4849148020SSam Ravnborg 
4949148020SSam Ravnborg #define _bsc0(type,name) \
5049148020SSam Ravnborg type name(void) \
5149148020SSam Ravnborg { \
5249148020SSam Ravnborg    register long __res __asm__ ("%d0") = __BN_##name; \
5349148020SSam Ravnborg    __asm__ __volatile__ ("trap #2" \
5449148020SSam Ravnborg                          : "=g" (__res) \
5549148020SSam Ravnborg                          : "0" (__res) \
5649148020SSam Ravnborg                          ); \
5749148020SSam Ravnborg    __bsc_return(type,__res); \
5849148020SSam Ravnborg }
5949148020SSam Ravnborg 
6049148020SSam Ravnborg #define _bsc1(type,name,atype,a) \
6149148020SSam Ravnborg type name(atype a) \
6249148020SSam Ravnborg { \
6349148020SSam Ravnborg    register long __res __asm__ ("%d0") = __BN_##name; \
6449148020SSam Ravnborg    register long __a __asm__ ("%d1") = (long)a; \
6549148020SSam Ravnborg    __asm__ __volatile__ ("trap #2" \
6649148020SSam Ravnborg                          : "=g" (__res) \
6749148020SSam Ravnborg                          : "0" (__res), "d" (__a) \
6849148020SSam Ravnborg                          ); \
6949148020SSam Ravnborg    __bsc_return(type,__res); \
7049148020SSam Ravnborg }
7149148020SSam Ravnborg 
7249148020SSam Ravnborg #define _bsc2(type,name,atype,a,btype,b) \
7349148020SSam Ravnborg type name(atype a, btype b) \
7449148020SSam Ravnborg { \
7549148020SSam Ravnborg    register long __res __asm__ ("%d0") = __BN_##name; \
7649148020SSam Ravnborg    register long __a __asm__ ("%d1") = (long)a; \
7749148020SSam Ravnborg    register long __b __asm__ ("%d2") = (long)b; \
7849148020SSam Ravnborg    __asm__ __volatile__ ("trap #2" \
7949148020SSam Ravnborg                          : "=g" (__res) \
8049148020SSam Ravnborg                          : "0" (__res), "d" (__a), "d" (__b) \
8149148020SSam Ravnborg                          ); \
8249148020SSam Ravnborg    __bsc_return(type,__res); \
8349148020SSam Ravnborg }
8449148020SSam Ravnborg 
8549148020SSam Ravnborg #define _bsc3(type,name,atype,a,btype,b,ctype,c) \
8649148020SSam Ravnborg type name(atype a, btype b, ctype c) \
8749148020SSam Ravnborg { \
8849148020SSam Ravnborg    register long __res __asm__ ("%d0") = __BN_##name; \
8949148020SSam Ravnborg    register long __a __asm__ ("%d1") = (long)a; \
9049148020SSam Ravnborg    register long __b __asm__ ("%d2") = (long)b; \
9149148020SSam Ravnborg    register long __c __asm__ ("%d3") = (long)c; \
9249148020SSam Ravnborg    __asm__ __volatile__ ("trap #2" \
9349148020SSam Ravnborg                          : "=g" (__res) \
9449148020SSam Ravnborg                          : "0" (__res), "d" (__a), "d" (__b), \
9549148020SSam Ravnborg                            "d" (__c) \
9649148020SSam Ravnborg                          ); \
9749148020SSam Ravnborg    __bsc_return(type,__res); \
9849148020SSam Ravnborg }
9949148020SSam Ravnborg 
10049148020SSam Ravnborg #define _bsc4(type,name,atype,a,btype,b,ctype,c,dtype,d) \
10149148020SSam Ravnborg type name(atype a, btype b, ctype c, dtype d) \
10249148020SSam Ravnborg { \
10349148020SSam Ravnborg    register long __res __asm__ ("%d0") = __BN_##name; \
10449148020SSam Ravnborg    register long __a __asm__ ("%d1") = (long)a; \
10549148020SSam Ravnborg    register long __b __asm__ ("%d2") = (long)b; \
10649148020SSam Ravnborg    register long __c __asm__ ("%d3") = (long)c; \
10749148020SSam Ravnborg    register long __d __asm__ ("%d4") = (long)d; \
10849148020SSam Ravnborg    __asm__ __volatile__ ("trap #2" \
10949148020SSam Ravnborg                          : "=g" (__res) \
11049148020SSam Ravnborg                          : "0" (__res), "d" (__a), "d" (__b), \
11149148020SSam Ravnborg                            "d" (__c), "d" (__d) \
11249148020SSam Ravnborg                          ); \
11349148020SSam Ravnborg    __bsc_return(type,__res); \
11449148020SSam Ravnborg }
11549148020SSam Ravnborg 
11649148020SSam Ravnborg #define _bsc5(type,name,atype,a,btype,b,ctype,c,dtype,d,etype,e) \
11749148020SSam Ravnborg type name(atype a, btype b, ctype c, dtype d, etype e) \
11849148020SSam Ravnborg { \
11949148020SSam Ravnborg    register long __res __asm__ ("%d0") = __BN_##name; \
12049148020SSam Ravnborg    register long __a __asm__ ("%d1") = (long)a; \
12149148020SSam Ravnborg    register long __b __asm__ ("%d2") = (long)b; \
12249148020SSam Ravnborg    register long __c __asm__ ("%d3") = (long)c; \
12349148020SSam Ravnborg    register long __d __asm__ ("%d4") = (long)d; \
12449148020SSam Ravnborg    register long __e __asm__ ("%d5") = (long)e; \
12549148020SSam Ravnborg    __asm__ __volatile__ ("trap #2" \
12649148020SSam Ravnborg                          : "=g" (__res) \
12749148020SSam Ravnborg                          : "0" (__res), "d" (__a), "d" (__b), \
12849148020SSam Ravnborg                            "d" (__c), "d" (__d), "d" (__e) \
12949148020SSam Ravnborg                          ); \
13049148020SSam Ravnborg    __bsc_return(type,__res); \
13149148020SSam Ravnborg }
13249148020SSam Ravnborg 
13349148020SSam Ravnborg #endif /* __BOOTSTD_H__ */
134