libmetal
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
22 extern "C" {
23 #endif
24 
28 #ifndef METAL_MAX_DEVICE_REGIONS
29 #define METAL_MAX_DEVICE_REGIONS 32
30 #endif
31 
32 struct metal_bus;
33 struct metal_device;
34 
36 struct metal_bus_ops {
37  void (*bus_close)(struct metal_bus *bus);
38  int (*dev_open)(struct metal_bus *bus,
39  const char *dev_name,
40  struct metal_device **device);
41  void (*dev_close)(struct metal_bus *bus,
42  struct metal_device *device);
43  void (*dev_irq_ack)(struct metal_bus *bus,
44  struct metal_device *device,
45  int irq);
46  int (*dev_dma_map)(struct metal_bus *bus,
47  struct metal_device *device,
48  uint32_t dir,
49  struct metal_sg *sg_in,
50  int nents_in,
51  struct metal_sg *sg_out);
52  void (*dev_dma_unmap)(struct metal_bus *bus,
53  struct metal_device *device,
54  uint32_t dir,
55  struct metal_sg *sg,
56  int nents);
57 };
58 
60 struct metal_bus {
61  const char *name;
64  struct metal_list node;
65 };
66 
68 extern struct metal_bus metal_generic_bus;
69 
71 struct metal_device {
72  const char *name;
73  struct metal_bus *bus;
74  unsigned num_regions;
78  struct metal_list node;
79  int irq_num;
80  void *irq_info;
81 };
82 
88 extern int metal_bus_register(struct metal_bus *bus);
89 
95 extern int metal_bus_unregister(struct metal_bus *bus);
96 
103 extern int metal_bus_find(const char *name, struct metal_bus **bus);
104 
120 extern int metal_register_generic_device(struct metal_device *device);
121 
129 extern int metal_device_open(const char *bus_name, const char *dev_name,
130  struct metal_device **device);
131 
136 extern void metal_device_close(struct metal_device *device);
137 
145 static inline struct metal_io_region *
146 metal_device_io_region(struct metal_device *device, unsigned index)
147 {
148  return (index < device->num_regions
149  ? &device->regions[index]
150  : NULL);
151 }
152 
155 #ifdef METAL_INTERNAL
156 extern int metal_generic_dev_sys_open(struct metal_device *dev);
157 extern int metal_generic_dev_open(struct metal_bus *bus, const char *dev_name,
158  struct metal_device **device);
159 extern int metal_generic_dev_dma_map(struct metal_bus *bus,
160  struct metal_device *device,
161  uint32_t dir,
162  struct metal_sg *sg_in,
163  int nents_in,
164  struct metal_sg *sg_out);
165 extern void metal_generic_dev_dma_unmap(struct metal_bus *bus,
166  struct metal_device *device,
167  uint32_t dir,
168  struct metal_sg *sg,
169  int nents);
170 #endif /* METAL_INTERNAL */
171 
172 #ifdef __cplusplus
173 }
174 #endif
175 
176 #endif /* __METAL_BUS__H__ */
void(* dev_dma_unmap)(struct metal_bus *bus, struct metal_device *device, uint32_t dir, struct metal_sg *sg, int nents)
Definition: device.h:52
int(* dev_open)(struct metal_bus *bus, const char *dev_name, struct metal_device **device)
Definition: device.h:38
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:46
int metal_generic_dev_open(struct metal_bus *bus, const char *dev_name, struct metal_device **device)
Definition: device.c:99
void(* bus_close)(struct metal_bus *bus)
Definition: device.h:37
unsigned num_regions
Definition: device.h:74
struct metal_io_region regions[METAL_MAX_DEVICE_REGIONS]
Definition: device.h:76
struct metal_list node
Definition: device.h:78
void(* dev_irq_ack)(struct metal_bus *bus, struct metal_device *device, int irq)
Definition: device.h:43
int metal_bus_find(const char *name, struct metal_bus **bus)
Find a libmetal bus by name.
Definition: device.c:39
Definition: device.h:71
void metal_device_close(struct metal_device *device)
Close a libmetal device.
Definition: device.c:80
struct metal_bus_ops ops
Definition: device.h:62
const char * name
Definition: device.h:61
struct metal_bus metal_generic_bus
Definition: device.c:157
Definition: list.h:24
const char * name
Definition: device.h:72
#define METAL_MAX_DEVICE_REGIONS
Definition: device.h:29
Definition: device.h:36
void(* dev_close)(struct metal_bus *bus, struct metal_device *device)
Definition: device.h:41
int metal_generic_dev_sys_open(struct metal_device *dev)
Definition: device.c:16
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:141
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:55
int irq_num
Definition: device.h:79
Definition: device.h:60
struct metal_list devices
Definition: device.h:63
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:118
static struct metal_io_region * metal_device_io_region(struct metal_device *device, unsigned index)
Get an I/O region accessor for a device region.
Definition: device.h:146
Definition: io.h:68
int metal_bus_unregister(struct metal_bus *bus)
Unregister a libmetal bus.
Definition: device.c:30
void * irq_info
Definition: device.h:80
int metal_bus_register(struct metal_bus *bus)
Register a libmetal bus.
Definition: device.c:18
scatter/gather list element structure
Definition: dma.h:32
struct metal_bus * bus
Definition: device.h:73
struct metal_list node
Definition: device.h:64
int metal_register_generic_device(struct metal_device *device)
Statically register a generic libmetal device.
Definition: device.c:87