logic_pio.h (3310B)
1// SPDX-License-Identifier: GPL-2.0+ 2/* 3 * Copyright (C) 2017 HiSilicon Limited, All Rights Reserved. 4 * Author: Gabriele Paoloni <gabriele.paoloni@huawei.com> 5 * Author: Zhichang Yuan <yuanzhichang@hisilicon.com> 6 */ 7 8#ifndef __LINUX_LOGIC_PIO_H 9#define __LINUX_LOGIC_PIO_H 10 11#include <linux/fwnode.h> 12 13enum { 14 LOGIC_PIO_INDIRECT, /* Indirect IO flag */ 15 LOGIC_PIO_CPU_MMIO, /* Memory-mapped IO flag */ 16}; 17 18struct logic_pio_hwaddr { 19 struct list_head list; 20 struct fwnode_handle *fwnode; 21 resource_size_t hw_start; 22 resource_size_t io_start; 23 resource_size_t size; /* range size populated */ 24 unsigned long flags; 25 26 void *hostdata; 27 const struct logic_pio_host_ops *ops; 28}; 29 30struct logic_pio_host_ops { 31 u32 (*in)(void *hostdata, unsigned long addr, size_t dwidth); 32 void (*out)(void *hostdata, unsigned long addr, u32 val, 33 size_t dwidth); 34 u32 (*ins)(void *hostdata, unsigned long addr, void *buffer, 35 size_t dwidth, unsigned int count); 36 void (*outs)(void *hostdata, unsigned long addr, const void *buffer, 37 size_t dwidth, unsigned int count); 38}; 39 40#ifdef CONFIG_INDIRECT_PIO 41u8 logic_inb(unsigned long addr); 42void logic_outb(u8 value, unsigned long addr); 43void logic_outw(u16 value, unsigned long addr); 44void logic_outl(u32 value, unsigned long addr); 45u16 logic_inw(unsigned long addr); 46u32 logic_inl(unsigned long addr); 47void logic_outb(u8 value, unsigned long addr); 48void logic_outw(u16 value, unsigned long addr); 49void logic_outl(u32 value, unsigned long addr); 50void logic_insb(unsigned long addr, void *buffer, unsigned int count); 51void logic_insl(unsigned long addr, void *buffer, unsigned int count); 52void logic_insw(unsigned long addr, void *buffer, unsigned int count); 53void logic_outsb(unsigned long addr, const void *buffer, unsigned int count); 54void logic_outsw(unsigned long addr, const void *buffer, unsigned int count); 55void logic_outsl(unsigned long addr, const void *buffer, unsigned int count); 56 57#ifndef inb 58#define inb logic_inb 59#endif 60 61#ifndef inw 62#define inw logic_inw 63#endif 64 65#ifndef inl 66#define inl logic_inl 67#endif 68 69#ifndef outb 70#define outb logic_outb 71#endif 72 73#ifndef outw 74#define outw logic_outw 75#endif 76 77#ifndef outl 78#define outl logic_outl 79#endif 80 81#ifndef insb 82#define insb logic_insb 83#endif 84 85#ifndef insw 86#define insw logic_insw 87#endif 88 89#ifndef insl 90#define insl logic_insl 91#endif 92 93#ifndef outsb 94#define outsb logic_outsb 95#endif 96 97#ifndef outsw 98#define outsw logic_outsw 99#endif 100 101#ifndef outsl 102#define outsl logic_outsl 103#endif 104 105/* 106 * We reserve 0x4000 bytes for Indirect IO as so far this library is only 107 * used by the HiSilicon LPC Host. If needed, we can reserve a wider IO 108 * area by redefining the macro below. 109 */ 110#define PIO_INDIRECT_SIZE 0x4000 111#else 112#define PIO_INDIRECT_SIZE 0 113#endif /* CONFIG_INDIRECT_PIO */ 114#define MMIO_UPPER_LIMIT (IO_SPACE_LIMIT - PIO_INDIRECT_SIZE) 115 116struct logic_pio_hwaddr *find_io_range_by_fwnode(struct fwnode_handle *fwnode); 117unsigned long logic_pio_trans_hwaddr(struct fwnode_handle *fwnode, 118 resource_size_t hw_addr, resource_size_t size); 119int logic_pio_register_range(struct logic_pio_hwaddr *newrange); 120void logic_pio_unregister_range(struct logic_pio_hwaddr *range); 121resource_size_t logic_pio_to_hwaddr(unsigned long pio); 122unsigned long logic_pio_trans_cpuaddr(resource_size_t hw_addr); 123 124#endif /* __LINUX_LOGIC_PIO_H */