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