cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

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 */