mirror of https://github.com/ipxe/ipxe.git
[loong64] Add I/O API for LoongArch64
Signed-off-by: Xiaotian Wu <wuxiaotian@loongson.cn> Modified-by: Michael Brown <mcb30@ipxe.org> Signed-off-by: Michael Brown <mcb30@ipxe.org>pull/820/head
parent
c57887bfc8
commit
0c67a3632d
|
@ -0,0 +1,46 @@
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2023, Xiaotian Wu <wuxiaotian@loongson.cn>
|
||||||
|
*
|
||||||
|
* 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 any later version.
|
||||||
|
*
|
||||||
|
* This program is distributed in the hope that it will be useful, but
|
||||||
|
* WITHOUT ANY WARRANTY; without even the implied warranty of
|
||||||
|
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||||||
|
* General Public License for more details.
|
||||||
|
*
|
||||||
|
* You should have received a copy of the GNU General Public License
|
||||||
|
* along with this program; if not, write to the Free Software
|
||||||
|
* Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA
|
||||||
|
* 02110-1301, USA.
|
||||||
|
*
|
||||||
|
* You can also choose to distribute this program under the terms of
|
||||||
|
* the Unmodified Binary Distribution Licence (as given in the file
|
||||||
|
* COPYING.UBDL), provided that you have satisfied its requirements.
|
||||||
|
*/
|
||||||
|
|
||||||
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
|
|
||||||
|
#include <ipxe/io.h>
|
||||||
|
#include <ipxe/loong64_io.h>
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
*
|
||||||
|
* iPXE I/O API for LoongArch64
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
PROVIDE_IOAPI_INLINE ( loong64, phys_to_bus );
|
||||||
|
PROVIDE_IOAPI_INLINE ( loong64, bus_to_phys );
|
||||||
|
PROVIDE_IOAPI_INLINE ( loong64, readb );
|
||||||
|
PROVIDE_IOAPI_INLINE ( loong64, readw );
|
||||||
|
PROVIDE_IOAPI_INLINE ( loong64, readl );
|
||||||
|
PROVIDE_IOAPI_INLINE ( loong64, readq );
|
||||||
|
PROVIDE_IOAPI_INLINE ( loong64, writeb );
|
||||||
|
PROVIDE_IOAPI_INLINE ( loong64, writew );
|
||||||
|
PROVIDE_IOAPI_INLINE ( loong64, writel );
|
||||||
|
PROVIDE_IOAPI_INLINE ( loong64, writeq );
|
||||||
|
PROVIDE_IOAPI_INLINE ( loong64, mb );
|
||||||
|
PROVIDE_DUMMY_PIO ( loong64 );
|
|
@ -12,4 +12,6 @@ FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
/** Page shift */
|
/** Page shift */
|
||||||
#define PAGE_SHIFT 12
|
#define PAGE_SHIFT 12
|
||||||
|
|
||||||
|
#include <ipxe/loong64_io.h>
|
||||||
|
|
||||||
#endif /* _BITS_IO_H */
|
#endif /* _BITS_IO_H */
|
||||||
|
|
|
@ -0,0 +1,82 @@
|
||||||
|
#ifndef _IPXE_LOONG64_IO_H
|
||||||
|
#define _IPXE_LOONG64_IO_H
|
||||||
|
|
||||||
|
/** @file
|
||||||
|
*
|
||||||
|
* iPXE I/O API for LoongArch64
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
FILE_LICENCE ( GPL2_OR_LATER_OR_UBDL );
|
||||||
|
|
||||||
|
#ifdef IOAPI_LOONG64
|
||||||
|
#define IOAPI_PREFIX_loong64
|
||||||
|
#else
|
||||||
|
#define IOAPI_PREFIX_loong64 __loong64_
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#include <ipxe/dummy_pio.h>
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Memory space mappings
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Physical<->Bus address mappings
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
static inline __always_inline unsigned long
|
||||||
|
IOAPI_INLINE ( loong64, phys_to_bus ) ( unsigned long phys_addr ) {
|
||||||
|
return phys_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
static inline __always_inline unsigned long
|
||||||
|
IOAPI_INLINE ( loong64, bus_to_phys ) ( unsigned long bus_addr ) {
|
||||||
|
return bus_addr;
|
||||||
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* MMIO reads and writes up to native word size
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
|
||||||
|
#define LOONG64_READX( _suffix, _type, _insn_suffix ) \
|
||||||
|
static inline __always_inline _type \
|
||||||
|
IOAPI_INLINE ( loong64, read ## _suffix ) ( volatile _type *io_addr ) { \
|
||||||
|
_type data; \
|
||||||
|
__asm__ __volatile__ ( "ld." _insn_suffix " %0, %1" \
|
||||||
|
: "=r" ( data ) : "m" ( *io_addr ) ); \
|
||||||
|
return data; \
|
||||||
|
}
|
||||||
|
LOONG64_READX ( b, uint8_t, "bu");
|
||||||
|
LOONG64_READX ( w, uint16_t, "hu");
|
||||||
|
LOONG64_READX ( l, uint32_t, "wu");
|
||||||
|
LOONG64_READX ( q, uint64_t, "d");
|
||||||
|
|
||||||
|
#define LOONG64_WRITEX( _suffix, _type, _insn_suffix ) \
|
||||||
|
static inline __always_inline void \
|
||||||
|
IOAPI_INLINE ( loong64, write ## _suffix ) ( _type data, \
|
||||||
|
volatile _type *io_addr ) { \
|
||||||
|
__asm__ __volatile__ ( "st." _insn_suffix " %0, %1" \
|
||||||
|
: : "r" ( data ), "m" ( *io_addr ) ); \
|
||||||
|
}
|
||||||
|
LOONG64_WRITEX ( b, uint8_t, "b");
|
||||||
|
LOONG64_WRITEX ( w, uint16_t, "h");
|
||||||
|
LOONG64_WRITEX ( l, uint32_t, "w" );
|
||||||
|
LOONG64_WRITEX ( q, uint64_t, "d");
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Memory barrier
|
||||||
|
*
|
||||||
|
*/
|
||||||
|
static inline __always_inline void
|
||||||
|
IOAPI_INLINE ( loong64, mb ) ( void ) {
|
||||||
|
__asm__ __volatile__ ( "dbar 0" );
|
||||||
|
}
|
||||||
|
|
||||||
|
/* Dummy PIO */
|
||||||
|
DUMMY_PIO ( loong64 );
|
||||||
|
|
||||||
|
#endif /* _IPXE_LOONG64_IO_H */
|
Loading…
Reference in New Issue