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