libmetal  latest
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 
29 #ifndef METAL_MAX_DEVICE_REGIONS
30 #define METAL_MAX_DEVICE_REGIONS 32
31 #endif
32 
33 struct metal_bus;
34 struct metal_device;
35 
37 struct metal_bus_ops {
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 
61 struct metal_bus {
62  const char *name;
63  struct metal_bus_ops ops;
64  struct metal_list devices;
65  struct metal_list node;
66 };
67 
69 extern struct metal_bus metal_generic_bus;
70 
72 struct metal_device {
73  const char *name;
74  struct metal_bus *bus;
75  unsigned int num_regions;
79  struct metal_list node;
80  int irq_num;
81  void *irq_info;
82 };
83 
89 int metal_bus_register(struct metal_bus *bus);
90 
96 int metal_bus_unregister(struct metal_bus *bus);
97 
104 int metal_bus_find(const char *name, struct metal_bus **bus);
105 
121 int metal_register_generic_device(struct metal_device *device);
122 
130 int metal_device_open(const char *bus_name, const char *dev_name,
131  struct metal_device **device);
132 
137 void metal_device_close(struct metal_device *device);
138 
146 static inline struct metal_io_region *
147 metal_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
158 int metal_generic_dev_open(struct metal_bus *bus, const char *dev_name,
159  struct metal_device **device);
160 int metal_generic_dev_dma_map(struct metal_bus *bus,
161  struct metal_device *device,
162  uint32_t dir, struct metal_sg *sg_in,
163  int nents_in, struct metal_sg *sg_out);
164 void metal_generic_dev_dma_unmap(struct metal_bus *bus,
165  struct metal_device *device,
166  uint32_t dir, struct metal_sg *sg, int nents);
167 #endif /* METAL_INTERNAL */
168 
169 #ifdef __cplusplus
170 }
171 #endif
172 
173 #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
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
void metal_device_close(struct metal_device *device)
Close a libmetal device.
Definition: device.c:79
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
Libmetal 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
Bus operations.
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
Libmetal bus structure.
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
Libmetal device structure.
Definition: device.h:72
struct metal_bus * bus
Bus that contains device.
Definition: device.h:74
void * irq_info
IRQ ID.
Definition: device.h:81
const char * name
Device name.
Definition: device.h:73
int irq_num
Number of IRQs per device.
Definition: device.h:80
unsigned int num_regions
Number of I/O regions in device.
Definition: device.h:75
struct metal_list node
Node on bus' list of devices.
Definition: device.h:79
struct metal_io_region regions[METAL_MAX_DEVICE_REGIONS]
Array of I/O regions in device.
Definition: device.h:77
Libmetal I/O region structure.
Definition: io.h:73
Definition: list.h:26
scatter/gather list element structure
Definition: dma.h:33
int metal_generic_dev_sys_open(struct metal_device *dev)
Definition: device.c:16