1 /* 2 * Copyright (c) 2022 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_ATTRIBUTE_MACRO_H 10 #define HDF_ATTRIBUTE_MACRO_H 11 12 #include "hdf_log.h" 13 #include "hdf_dlist.h" 14 15 struct HdfDevHostMgr { 16 struct DListHead hosts; 17 }; 18 19 struct HdfHostType { 20 const char *devHostName; 21 uint16_t priority; 22 struct DListHead devices; 23 struct DListHead hostEntry; 24 }; 25 26 struct HdfDeviceType { 27 struct DListHead deviceNodes; 28 struct DListHead deviceEntry; 29 }; 30 31 struct HdfDeviceNodeType { 32 uint16_t policy; 33 uint16_t priority; 34 uint16_t preload; 35 uint16_t permission; 36 const char *moduleName; 37 const char *svcName; 38 const char *deviceMatchAttr; 39 struct DListHead deviceNodeEntry; 40 }; 41 42 #define HDF_DEAL_DEVICE_NODE(node, deviceNodes) \ 43 do { \ 44 deviceNode = (struct HdfDeviceNodeType *)OsalMemCalloc(sizeof(*deviceNode)); \ 45 if (deviceNode == NULL) { \ 46 HDF_LOGE("%s malloc fail", __func__); \ 47 return false; \ 48 } \ 49 deviceNode->policy = HCS_PROP(node, policy); \ 50 deviceNode->priority = HCS_PROP(node, priority); \ 51 deviceNode->preload = HCS_PROP(node, preload); \ 52 deviceNode->permission = HCS_PROP(node, permission); \ 53 deviceNode->moduleName = HCS_PROP(node, moduleName); \ 54 deviceNode->svcName = HCS_PROP(node, serviceName); \ 55 deviceNode->deviceMatchAttr = HCS_PROP(node, deviceMatchAttr); \ 56 DListInsertTail(&deviceNode->deviceNodeEntry, &(deviceNodes)); \ 57 } while (0) 58 59 #define HDF_DEAL_DEVICE(node, devices) \ 60 do { \ 61 device = (struct HdfDeviceType *)OsalMemCalloc(sizeof(*device)); \ 62 if (device == NULL) { \ 63 HDF_LOGE("%s malloc fail", __func__); \ 64 return false; \ 65 } \ 66 DListHeadInit(&device->deviceNodes); \ 67 node##_foreach_child_vargs(HDF_DEAL_DEVICE_NODE, device->deviceNodes); \ 68 DListInsertTail(&device->deviceEntry, &(devices)); \ 69 } while (0) 70 71 #define HDF_FIND_HOST(node, name, host) \ 72 do { \ 73 if (strcmp(HCS_PROP(node, hostName), name) == 0) { \ 74 (host)->devHostName = HCS_PROP(node, hostName); \ 75 (host)->priority = HCS_PROP(node, priority); \ 76 node##_foreach_child_vargs(HDF_DEAL_DEVICE, host->devices); \ 77 break; \ 78 } \ 79 } while (0) 80 81 #define HDF_DEAL_HOST(node, hosts) \ 82 do { \ 83 host = (struct HdfHostType *)OsalMemCalloc(sizeof(*host)); \ 84 if (host == NULL) { \ 85 HDF_LOGE("%s malloc fail", __func__); \ 86 return false; \ 87 } \ 88 host->devHostName = HCS_PROP(node, hostName); \ 89 host->priority = HCS_PROP(node, priority); \ 90 DListInsertTail(&(host)->hostEntry, &(hosts)); \ 91 } while (0) 92 93 #define HDF_DEVICE_INFO HCS_NODE(HCS_ROOT, device_info) 94 95 #endif /* HDF_ATTRIBUTE_MACRO_H */ 96