mirror of
https://github.com/brain-hackers/u-boot-brain
synced 2024-09-27 23:20:26 +09:00
sandbox: Allow use of real I/O with readl(), etc.
At present these functions are stubbed out. For more comprehensive testing with PCI devices it is useful to be able to fully emulate I/O access. Add simple implementations for these. Signed-off-by: Simon Glass <sjg@chromium.org> Reviewed-by: Bin Meng <bmeng.cn@gmail.com> Tested-by: Bin Meng <bmeng.cn@gmail.com> [bmeng: change to use 'const void *' in sandbox_write(); cast 'addr' in read/write macros in arch/sandbox/include/asm/io.h; remove the unnecessary cast in readq/writeq in nvme.h] Signed-off-by: Bin Meng <bmeng.cn@gmail.com>
This commit is contained in:
parent
b0e2c23d3e
commit
e77663cf74
@ -225,6 +225,58 @@ phys_addr_t map_to_sysmem(const void *ptr)
|
||||
return mentry->tag;
|
||||
}
|
||||
|
||||
unsigned int sandbox_read(const void *addr, enum sandboxio_size_t size)
|
||||
{
|
||||
struct sandbox_state *state = state_get_current();
|
||||
|
||||
if (!state->allow_memio)
|
||||
return 0;
|
||||
|
||||
switch (size) {
|
||||
case SB_SIZE_8:
|
||||
return *(u8 *)addr;
|
||||
case SB_SIZE_16:
|
||||
return *(u16 *)addr;
|
||||
case SB_SIZE_32:
|
||||
return *(u32 *)addr;
|
||||
case SB_SIZE_64:
|
||||
return *(u64 *)addr;
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void sandbox_write(const void *addr, unsigned int val,
|
||||
enum sandboxio_size_t size)
|
||||
{
|
||||
struct sandbox_state *state = state_get_current();
|
||||
|
||||
if (!state->allow_memio)
|
||||
return;
|
||||
|
||||
switch (size) {
|
||||
case SB_SIZE_8:
|
||||
*(u8 *)addr = val;
|
||||
break;
|
||||
case SB_SIZE_16:
|
||||
*(u16 *)addr = val;
|
||||
break;
|
||||
case SB_SIZE_32:
|
||||
*(u32 *)addr = val;
|
||||
break;
|
||||
case SB_SIZE_64:
|
||||
*(u64 *)addr = val;
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
void sandbox_set_enable_memio(bool enable)
|
||||
{
|
||||
struct sandbox_state *state = state_get_current();
|
||||
|
||||
state->allow_memio = enable;
|
||||
}
|
||||
|
||||
void sandbox_set_enable_pci_map(int enable)
|
||||
{
|
||||
enable_pci_map = enable;
|
||||
|
@ -6,6 +6,13 @@
|
||||
#ifndef __SANDBOX_ASM_IO_H
|
||||
#define __SANDBOX_ASM_IO_H
|
||||
|
||||
enum sandboxio_size_t {
|
||||
SB_SIZE_8,
|
||||
SB_SIZE_16,
|
||||
SB_SIZE_32,
|
||||
SB_SIZE_64,
|
||||
};
|
||||
|
||||
void *phys_to_virt(phys_addr_t paddr);
|
||||
#define phys_to_virt phys_to_virt
|
||||
|
||||
@ -38,18 +45,21 @@ static inline void unmap_sysmem(const void *vaddr)
|
||||
/* Map from a pointer to our RAM buffer */
|
||||
phys_addr_t map_to_sysmem(const void *ptr);
|
||||
|
||||
/* Define nops for sandbox I/O access */
|
||||
#define readb(addr) ((void)addr, 0)
|
||||
#define readw(addr) ((void)addr, 0)
|
||||
#define readl(addr) ((void)addr, 0)
|
||||
unsigned int sandbox_read(const void *addr, enum sandboxio_size_t size);
|
||||
void sandbox_write(const void *addr, unsigned int val,
|
||||
enum sandboxio_size_t size);
|
||||
|
||||
#define readb(addr) sandbox_read((const void *)addr, SB_SIZE_8)
|
||||
#define readw(addr) sandbox_read((const void *)addr, SB_SIZE_16)
|
||||
#define readl(addr) sandbox_read((const void *)addr, SB_SIZE_32)
|
||||
#ifdef CONFIG_SANDBOX64
|
||||
#define readq(addr) ((void)addr, 0)
|
||||
#define readq(addr) sandbox_read((const void *)addr, SB_SIZE_64)
|
||||
#endif
|
||||
#define writeb(v, addr) ((void)addr)
|
||||
#define writew(v, addr) ((void)addr)
|
||||
#define writel(v, addr) ((void)addr)
|
||||
#define writeb(v, addr) sandbox_write((const void *)addr, v, SB_SIZE_8)
|
||||
#define writew(v, addr) sandbox_write((const void *)addr, v, SB_SIZE_16)
|
||||
#define writel(v, addr) sandbox_write((const void *)addr, v, SB_SIZE_32)
|
||||
#ifdef CONFIG_SANDBOX64
|
||||
#define writeq(v, addr) ((void)addr)
|
||||
#define writeq(v, addr) sandbox_write((const void *)addr, v, SB_SIZE_64)
|
||||
#endif
|
||||
|
||||
/*
|
||||
|
@ -102,6 +102,7 @@ struct sandbox_state {
|
||||
ulong next_tag; /* Next address tag to allocate */
|
||||
struct list_head mapmem_head; /* struct sandbox_mapmem_entry */
|
||||
bool hwspinlock; /* Hardware Spinlock status */
|
||||
bool allow_memio; /* Allow readl() etc. to work */
|
||||
|
||||
/*
|
||||
* This struct is getting large.
|
||||
|
Loading…
Reference in New Issue
Block a user