• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
1 /*
2  * Copyright (c) 2020-2021 Huawei Device Co., Ltd.
3  *
4  * HDF is dual licensed: you can use it either under the terms of
5  * the GPL, or the BSD license, at your option.
6  * See the LICENSE file in the root of this repository for complete details.
7  */
8 
9 #ifndef HDF_DEVICE_H
10 #define HDF_DEVICE_H
11 
12 #include "hdf_device_desc.h"
13 #include "hdf_dlist.h"
14 #include "hdf_object.h"
15 
16 /*
17  * -----------------+----------------+----------------+----------------+
18  * |      BYTE      |      BYTE      |      BYTE      |      BYTE      |
19  * +---------------------------------+---------------------------------+
20  * |    host id     |             device id           | device node id |
21  * -----------------+---------------------------------+----------------+
22  */
23 typedef uint32_t devid_t;
24 
25 #define HOSTID_BITS 8
26 #define DEVICEID_BITS 16
27 #define DEVNODEID_BITS 8
28 #define DEVNODEID_MASK ((1 << DEVNODEID_BITS) - 1)
29 #define DEVICEID_MASK ((1 << DEVICEID_BITS) - 1)
30 
31 #define HOSTID(devid) (((uint32_t)(devid)) >> (DEVICEID_BITS + DEVNODEID_BITS))
32 #define DEVICEID(devid) ((((uint32_t)(devid)) >> DEVNODEID_BITS) & DEVICEID_MASK)
33 #define DEVNODEID(devid) (((uint32_t)(devid)) & DEVNODEID_MASK)
34 
35 #define MK_DEVID(hostId, deviceId, devnodeId) \
36     (((hostId) << (DEVICEID_BITS + DEVNODEID_BITS)) | ((deviceId) << DEVNODEID_BITS) | (devnodeId))
37 
38 struct HdfDeviceNode;
39 
40 struct IHdfDevice {
41     struct HdfObject object;
42     int (*Attach)(struct IHdfDevice *device, struct HdfDeviceNode *deviceNode);
43     int (*Detach)(struct IHdfDevice *device, struct HdfDeviceNode *deviceNode);
44     struct HdfDeviceNode *(*GetDeviceNode)(struct IHdfDevice *device, devid_t devid);
45     int (*DetachWithDevid)(struct IHdfDevice *device, devid_t devid);
46 };
47 
48 struct HdfDevice {
49     struct IHdfDevice super;
50     struct DListHead node;
51     struct DListHead devNodes;
52     devid_t deviceId;
53     uint16_t devidIndex;
54 };
55 int HdfDeviceDetach(struct IHdfDevice *devInst, struct HdfDeviceNode *devNode);
56 void HdfDeviceConstruct(struct HdfDevice *device);
57 void HdfDeviceDestruct(struct HdfDevice *device);
58 struct HdfObject *HdfDeviceCreate(void);
59 void HdfDeviceRelease(struct HdfObject *object);
60 struct HdfDevice *HdfDeviceNewInstance(void);
61 void HdfDeviceFreeInstance(struct HdfDevice *device);
62 
63 #endif /* HDF_DEVICE_H */
64