libmetal
Loading...
Searching...
No Matches
device.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2015, Xilinx Inc. and Contributors. All rights reserved.
3 *
4 * SPDX-License-Identifier: BSD-3-Clause
5 */
6
7/*
8 * @file device.h
9 * @brief Bus abstraction for libmetal.
10 */
11
12#ifndef __METAL_BUS__H__
13#define __METAL_BUS__H__
14
15#include <stdint.h>
16#include <metal/io.h>
17#include <metal/list.h>
18#include <metal/dma.h>
19#include <metal/sys.h>
20
21#ifdef __cplusplus
22extern "C" {
23#endif
24
29#ifndef METAL_MAX_DEVICE_REGIONS
30#define METAL_MAX_DEVICE_REGIONS 32
31#endif
32
33struct metal_bus;
34struct metal_device;
35
38 void (*bus_close)(struct metal_bus *bus);
39 int (*dev_open)(struct metal_bus *bus,
40 const char *dev_name,
41 struct metal_device **device);
42 void (*dev_close)(struct metal_bus *bus,
43 struct metal_device *device);
44 void (*dev_irq_ack)(struct metal_bus *bus,
45 struct metal_device *device,
46 int irq);
47 int (*dev_dma_map)(struct metal_bus *bus,
48 struct metal_device *device,
49 uint32_t dir,
50 struct metal_sg *sg_in,
51 int nents_in,
52 struct metal_sg *sg_out);
53 void (*dev_dma_unmap)(struct metal_bus *bus,
54 struct metal_device *device,
55 uint32_t dir,
56 struct metal_sg *sg,
57 int nents);
58};
59
61struct metal_bus {
62 const char *name;
66};
67
69extern struct metal_bus metal_generic_bus;
70
73 const char *name;
74 struct metal_bus *bus;
75 unsigned int num_regions;
80 int irq_num;
81 void *irq_info;
82};
83
89extern int metal_bus_register(struct metal_bus *bus);
90
96extern int metal_bus_unregister(struct metal_bus *bus);
97
104extern int metal_bus_find(const char *name, struct metal_bus **bus);
105
121extern int metal_register_generic_device(struct metal_device *device);
122
130extern int metal_device_open(const char *bus_name, const char *dev_name,
131 struct metal_device **device);
132
137extern void metal_device_close(struct metal_device *device);
138
146static inline struct metal_io_region *
147metal_device_io_region(struct metal_device *device, unsigned int index)
148{
149 return (index < device->num_regions
150 ? &device->regions[index]
151 : NULL);
152}
153
156#ifdef METAL_INTERNAL
157extern int metal_generic_dev_sys_open(struct metal_device *dev);
158extern int metal_generic_dev_open(struct metal_bus *bus, const char *dev_name,
159 struct metal_device **device);
160extern int metal_generic_dev_dma_map(struct metal_bus *bus,
161 struct metal_device *device,
162 uint32_t dir,
163 struct metal_sg *sg_in,
164 int nents_in,
165 struct metal_sg *sg_out);
166extern void metal_generic_dev_dma_unmap(struct metal_bus *bus,
167 struct metal_device *device,
168 uint32_t dir,
169 struct metal_sg *sg,
170 int nents);
171#endif /* METAL_INTERNAL */
172
173#ifdef __cplusplus
174}
175#endif
176
177#endif /* __METAL_BUS__H__ */
int metal_generic_dev_open(struct metal_bus *bus, const char *dev_name, struct metal_device **device)
Definition: device.c:98
int metal_generic_dev_dma_map(struct metal_bus *bus, struct metal_device *device, uint32_t dir, struct metal_sg *sg_in, int nents_in, struct metal_sg *sg_out)
Definition: device.c:117
void metal_generic_dev_dma_unmap(struct metal_bus *bus, struct metal_device *device, uint32_t dir, struct metal_sg *sg, int nents)
Definition: device.c:140
int metal_bus_register(struct metal_bus *bus)
Register a libmetal bus.
Definition: device.c:18
int metal_register_generic_device(struct metal_device *device)
Statically register a generic libmetal device.
Definition: device.c:86
int metal_bus_find(const char *name, struct metal_bus **bus)
Find a libmetal bus by name.
Definition: device.c:39
void metal_device_close(struct metal_device *device)
Close a libmetal device.
Definition: device.c:79
static struct metal_io_region * metal_device_io_region(struct metal_device *device, unsigned int index)
Get an I/O region accessor for a device region.
Definition: device.h:147
int metal_device_open(const char *bus_name, const char *dev_name, struct metal_device **device)
Open a libmetal device by name.
Definition: device.c:54
struct metal_bus metal_generic_bus
Definition: device.c:156
#define METAL_MAX_DEVICE_REGIONS
Definition: device.h:30
int metal_bus_unregister(struct metal_bus *bus)
Unregister a libmetal bus.
Definition: device.c:30
Definition: device.h:37
void(* bus_close)(struct metal_bus *bus)
Definition: device.h:38
void(* dev_irq_ack)(struct metal_bus *bus, struct metal_device *device, int irq)
Definition: device.h:44
int(* dev_open)(struct metal_bus *bus, const char *dev_name, struct metal_device **device)
Definition: device.h:39
void(* dev_dma_unmap)(struct metal_bus *bus, struct metal_device *device, uint32_t dir, struct metal_sg *sg, int nents)
Definition: device.h:53
void(* dev_close)(struct metal_bus *bus, struct metal_device *device)
Definition: device.h:42
int(* dev_dma_map)(struct metal_bus *bus, struct metal_device *device, uint32_t dir, struct metal_sg *sg_in, int nents_in, struct metal_sg *sg_out)
Definition: device.h:47
Definition: device.h:61
struct metal_list node
Definition: device.h:65
const char * name
Definition: device.h:62
struct metal_bus_ops ops
Definition: device.h:63
struct metal_list devices
Definition: device.h:64
Definition: device.h:72
struct metal_bus * bus
Definition: device.h:74
void * irq_info
Definition: device.h:81
const char * name
Definition: device.h:73
int irq_num
Definition: device.h:80
unsigned int num_regions
Definition: device.h:75
struct metal_list node
Definition: device.h:79
struct metal_io_region regions[METAL_MAX_DEVICE_REGIONS]
Definition: device.h:77
Definition: io.h:73
Definition: list.h:25
scatter/gather list element structure
Definition: dma.h:33
int metal_generic_dev_sys_open(struct metal_device *dev)
Definition: device.c:16