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

bus.h (6286B)


      1/* SPDX-License-Identifier: GPL-2.0-only */
      2/*
      3 *  linux/include/amba/bus.h
      4 *
      5 *  This device type deals with ARM PrimeCells and anything else that
      6 *  presents a proper CID (0xB105F00D) at the end of the I/O register
      7 *  region or that is derived from a PrimeCell.
      8 *
      9 *  Copyright (C) 2003 Deep Blue Solutions Ltd, All Rights Reserved.
     10 */
     11#ifndef ASMARM_AMBA_H
     12#define ASMARM_AMBA_H
     13
     14#include <linux/clk.h>
     15#include <linux/device.h>
     16#include <linux/mod_devicetable.h>
     17#include <linux/err.h>
     18#include <linux/resource.h>
     19#include <linux/regulator/consumer.h>
     20
     21#define AMBA_NR_IRQS	9
     22#define AMBA_CID	0xb105f00d
     23#define CORESIGHT_CID	0xb105900d
     24
     25/*
     26 * CoreSight Architecture specification updates the ID specification
     27 * for components on the AMBA bus. (ARM IHI 0029E)
     28 *
     29 * Bits 15:12 of the CID are the device class.
     30 *
     31 * Class 0xF remains for PrimeCell and legacy components. (AMBA_CID above)
     32 * Class 0x9 defines the component as CoreSight (CORESIGHT_CID above)
     33 * Class 0x0, 0x1, 0xB, 0xE define components that do not have driver support
     34 * at present.
     35 * Class 0x2-0x8,0xA and 0xD-0xD are presently reserved.
     36 *
     37 * Remaining CID bits stay as 0xb105-00d
     38 */
     39
     40/**
     41 * Class 0x9 components use additional values to form a Unique Component
     42 * Identifier (UCI), where peripheral ID values are identical for different
     43 * components. Passed to the amba bus code from the component driver via
     44 * the amba_id->data pointer.
     45 * @devarch	: coresight devarch register value
     46 * @devarch_mask: mask bits used for matching. 0 indicates UCI not used.
     47 * @devtype	: coresight device type value
     48 * @data	: additional driver data. As we have usurped the original
     49 *		pointer some devices may still need additional data
     50 */
     51struct amba_cs_uci_id {
     52	unsigned int devarch;
     53	unsigned int devarch_mask;
     54	unsigned int devtype;
     55	void *data;
     56};
     57
     58/* define offsets for registers used by UCI */
     59#define UCI_REG_DEVTYPE_OFFSET	0xFCC
     60#define UCI_REG_DEVARCH_OFFSET	0xFBC
     61
     62struct clk;
     63
     64struct amba_device {
     65	struct device		dev;
     66	struct resource		res;
     67	struct clk		*pclk;
     68	struct device_dma_parameters dma_parms;
     69	unsigned int		periphid;
     70	unsigned int		cid;
     71	struct amba_cs_uci_id	uci;
     72	unsigned int		irq[AMBA_NR_IRQS];
     73	/*
     74	 * Driver name to force a match.  Do not set directly, because core
     75	 * frees it.  Use driver_set_override() to set or clear it.
     76	 */
     77	const char		*driver_override;
     78};
     79
     80struct amba_driver {
     81	struct device_driver	drv;
     82	int			(*probe)(struct amba_device *, const struct amba_id *);
     83	void			(*remove)(struct amba_device *);
     84	void			(*shutdown)(struct amba_device *);
     85	const struct amba_id	*id_table;
     86	/*
     87	 * For most device drivers, no need to care about this flag as long as
     88	 * all DMAs are handled through the kernel DMA API. For some special
     89	 * ones, for example VFIO drivers, they know how to manage the DMA
     90	 * themselves and set this flag so that the IOMMU layer will allow them
     91	 * to setup and manage their own I/O address space.
     92	 */
     93	bool driver_managed_dma;
     94};
     95
     96/*
     97 * Constants for the designer field of the Peripheral ID register. When bit 7
     98 * is set to '1', bits [6:0] should be the JEP106 manufacturer identity code.
     99 */
    100enum amba_vendor {
    101	AMBA_VENDOR_ARM = 0x41,
    102	AMBA_VENDOR_ST = 0x80,
    103	AMBA_VENDOR_QCOM = 0x51,
    104	AMBA_VENDOR_LSI = 0xb6,
    105};
    106
    107extern struct bus_type amba_bustype;
    108
    109#define to_amba_device(d)	container_of(d, struct amba_device, dev)
    110
    111#define amba_get_drvdata(d)	dev_get_drvdata(&d->dev)
    112#define amba_set_drvdata(d,p)	dev_set_drvdata(&d->dev, p)
    113
    114#ifdef CONFIG_ARM_AMBA
    115int amba_driver_register(struct amba_driver *);
    116void amba_driver_unregister(struct amba_driver *);
    117#else
    118static inline int amba_driver_register(struct amba_driver *drv)
    119{
    120	return -EINVAL;
    121}
    122static inline void amba_driver_unregister(struct amba_driver *drv)
    123{
    124}
    125#endif
    126
    127struct amba_device *amba_device_alloc(const char *, resource_size_t, size_t);
    128void amba_device_put(struct amba_device *);
    129int amba_device_add(struct amba_device *, struct resource *);
    130int amba_device_register(struct amba_device *, struct resource *);
    131void amba_device_unregister(struct amba_device *);
    132int amba_request_regions(struct amba_device *, const char *);
    133void amba_release_regions(struct amba_device *);
    134
    135/* Some drivers don't use the struct amba_device */
    136#define AMBA_CONFIG_BITS(a) (((a) >> 24) & 0xff)
    137#define AMBA_REV_BITS(a) (((a) >> 20) & 0x0f)
    138#define AMBA_MANF_BITS(a) (((a) >> 12) & 0xff)
    139#define AMBA_PART_BITS(a) ((a) & 0xfff)
    140
    141#define amba_config(d)	AMBA_CONFIG_BITS((d)->periphid)
    142#define amba_rev(d)	AMBA_REV_BITS((d)->periphid)
    143#define amba_manf(d)	AMBA_MANF_BITS((d)->periphid)
    144#define amba_part(d)	AMBA_PART_BITS((d)->periphid)
    145
    146#define __AMBA_DEV(busid, data, mask)				\
    147	{							\
    148		.coherent_dma_mask = mask,			\
    149		.init_name = busid,				\
    150		.platform_data = data,				\
    151	}
    152
    153/*
    154 * APB devices do not themselves have the ability to address memory,
    155 * so DMA masks should be zero (much like USB peripheral devices.)
    156 * The DMA controller DMA masks should be used instead (much like
    157 * USB host controllers in conventional PCs.)
    158 */
    159#define AMBA_APB_DEVICE(name, busid, id, base, irqs, data)	\
    160struct amba_device name##_device = {				\
    161	.dev = __AMBA_DEV(busid, data, 0),			\
    162	.res = DEFINE_RES_MEM(base, SZ_4K),			\
    163	.irq = irqs,						\
    164	.periphid = id,						\
    165}
    166
    167/*
    168 * AHB devices are DMA capable, so set their DMA masks
    169 */
    170#define AMBA_AHB_DEVICE(name, busid, id, base, irqs, data)	\
    171struct amba_device name##_device = {				\
    172	.dev = __AMBA_DEV(busid, data, ~0ULL),			\
    173	.res = DEFINE_RES_MEM(base, SZ_4K),			\
    174	.irq = irqs,						\
    175	.periphid = id,						\
    176}
    177
    178/*
    179 * module_amba_driver() - Helper macro for drivers that don't do anything
    180 * special in module init/exit.  This eliminates a lot of boilerplate.  Each
    181 * module may only use this macro once, and calling it replaces module_init()
    182 * and module_exit()
    183 */
    184#define module_amba_driver(__amba_drv) \
    185	module_driver(__amba_drv, amba_driver_register, amba_driver_unregister)
    186
    187/*
    188 * builtin_amba_driver() - Helper macro for drivers that don't do anything
    189 * special in driver initcall.  This eliminates a lot of boilerplate.  Each
    190 * driver may only use this macro once, and calling it replaces the instance
    191 * device_initcall().
    192 */
    193#define builtin_amba_driver(__amba_drv) \
    194	builtin_driver(__amba_drv, amba_driver_register)
    195
    196#endif