• 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_dlist.h"
13 #include "hdf_object.h"
14 
15 /*
16  * -----------------+----------------+----------------+----------------+
17  * |      BYTE      |      BYTE      |      BYTE      |      BYTE      |
18  * +---------------------------------+---------------------------------+
19  * |    host id     |             device id           | device node id |
20  * -----------------+---------------------------------+----------------+
21  */
22 typedef uint32_t devid_t;
23 
24 #define HOSTID_BITS 8
25 #define DEVICEID_BITS 16
26 #define DEVNODEID_BITS 8
27 #define DEVNODEID_MASK ((1 << DEVNODEID_BITS) - 1)
28 #define DEVICEID_MASK ((1 << DEVICEID_BITS) - 1)
29 
30 #define HOSTID(devid) (((uint32_t)(devid)) >> (DEVICEID_BITS + DEVNODEID_BITS))
31 #define DEVICEID(devid) ((((uint32_t)(devid)) >> DEVNODEID_BITS) & DEVICEID_MASK)
32 #define DEVNODEID(devid) (((uint32_t)(devid)) & DEVNODEID_MASK)
33 
34 #define MK_DEVID(hostId, deviceId, devnodeId) \
35     (((uint16_t)(hostId) << (DEVICEID_BITS + DEVNODEID_BITS)) | ((deviceId) << DEVNODEID_BITS) | (devnodeId))
36 
37 struct HdfDeviceNode;
38 
39 struct IHdfDevice {
40     struct HdfObject object;
41     int (*Attach)(struct IHdfDevice *device, struct HdfDeviceNode *deviceNode);
42     int (*Detach)(struct IHdfDevice *device, struct HdfDeviceNode *deviceNode);
43     struct HdfDeviceNode *(*GetDeviceNode)(struct IHdfDevice *device, devid_t devid);
44     int (*DetachWithDevid)(struct IHdfDevice *device, devid_t devid);
45 };
46 
47 struct HdfDevice {
48     struct IHdfDevice super;
49     struct DListHead node;
50     struct DListHead devNodes;
51     devid_t deviceId;
52     uint16_t devidIndex;
53 };
54 int HdfDeviceDetach(struct IHdfDevice *devInst, struct HdfDeviceNode *devNode);
55 void HdfDeviceConstruct(struct HdfDevice *device);
56 void HdfDeviceDestruct(struct HdfDevice *device);
57 struct HdfObject *HdfDeviceCreate(void);
58 void HdfDeviceRelease(struct HdfObject *object);
59 struct HdfDevice *HdfDeviceNewInstance(void);
60 void HdfDeviceFreeInstance(struct HdfDevice *device);
61 
62 #endif /* HDF_DEVICE_H */
63