/kernel/linux/linux-6.6/drivers/gpu/drm/i915/gt/uc/ |
H A D | intel_gsc_uc.c | 18 struct intel_gsc_uc *gsc = container_of(work, typeof(*gsc), work); in gsc_work() local 19 struct intel_gt *gt = gsc_uc_to_gt(gsc); in gsc_work() 27 actions = gsc->gsc_work_actions; in gsc_work() 28 gsc->gsc_work_actions = 0; in gsc_work() 32 ret = intel_gsc_uc_fw_upload(gsc); in gsc_work() 59 if (!intel_gsc_uc_fw_init_done(gsc)) { in gsc_work() 64 ret = intel_gsc_proxy_request_handler(gsc); in gsc_work() 73 intel_uc_fw_change_status(&gsc->fw, INTEL_UC_FIRMWARE_LOAD_FAIL); in gsc_work() 85 if (intel_gsc_uc_fw_proxy_init_done(gsc, fals in gsc_work() 120 intel_gsc_uc_init_early(struct intel_gsc_uc *gsc) intel_gsc_uc_init_early() argument 148 gsc_allocate_and_map_vma(struct intel_gsc_uc *gsc, u32 size) gsc_allocate_and_map_vma() argument 200 gsc_unmap_and_free_vma(struct intel_gsc_uc *gsc) gsc_unmap_and_free_vma() argument 212 intel_gsc_uc_init(struct intel_gsc_uc *gsc) intel_gsc_uc_init() argument 255 intel_gsc_uc_fini(struct intel_gsc_uc *gsc) intel_gsc_uc_fini() argument 276 intel_gsc_uc_flush_work(struct intel_gsc_uc *gsc) intel_gsc_uc_flush_work() argument 284 intel_gsc_uc_resume(struct intel_gsc_uc *gsc) intel_gsc_uc_resume() argument 303 intel_gsc_uc_load_start(struct intel_gsc_uc *gsc) intel_gsc_uc_load_start() argument 320 intel_gsc_uc_load_status(struct intel_gsc_uc *gsc, struct drm_printer *p) intel_gsc_uc_load_status() argument [all...] |
H A D | intel_gsc_proxy.c | 84 static int proxy_send_to_csme(struct intel_gsc_uc *gsc) in proxy_send_to_csme() argument 86 struct intel_gt *gt = gsc_uc_to_gt(gsc); in proxy_send_to_csme() 87 struct i915_gsc_proxy_component *comp = gsc->proxy.component; in proxy_send_to_csme() 89 void *in = gsc->proxy.to_csme; in proxy_send_to_csme() 90 void *out = gsc->proxy.to_gsc; in proxy_send_to_csme() 123 static int proxy_send_to_gsc(struct intel_gsc_uc *gsc) in proxy_send_to_gsc() argument 125 struct intel_gt *gt = gsc_uc_to_gt(gsc); in proxy_send_to_gsc() 126 u32 *marker = gsc->proxy.to_csme; /* first dw of the reply header */ in proxy_send_to_gsc() 127 u64 addr_in = i915_ggtt_offset(gsc->proxy.vma); in proxy_send_to_gsc() 129 u32 size = ((struct gsc_proxy_msg *)gsc in proxy_send_to_gsc() 186 proxy_query(struct intel_gsc_uc *gsc) proxy_query() argument 255 intel_gsc_proxy_request_handler(struct intel_gsc_uc *gsc) intel_gsc_proxy_request_handler() argument 290 intel_gsc_proxy_irq_handler(struct intel_gsc_uc *gsc, u32 iir) intel_gsc_proxy_irq_handler() argument 313 struct intel_gsc_uc *gsc = >->uc.gsc; i915_gsc_proxy_component_bind() local 334 struct intel_gsc_uc *gsc = >->uc.gsc; i915_gsc_proxy_component_unbind() local 352 proxy_channel_alloc(struct intel_gsc_uc *gsc) proxy_channel_alloc() argument 371 proxy_channel_free(struct intel_gsc_uc *gsc) proxy_channel_free() argument 381 intel_gsc_proxy_fini(struct intel_gsc_uc *gsc) intel_gsc_proxy_fini() argument 392 intel_gsc_proxy_init(struct intel_gsc_uc *gsc) intel_gsc_proxy_init() argument [all...] |
H A D | intel_gsc_uc.h | 60 void intel_gsc_uc_init_early(struct intel_gsc_uc *gsc); 61 int intel_gsc_uc_init(struct intel_gsc_uc *gsc); 62 void intel_gsc_uc_fini(struct intel_gsc_uc *gsc); 63 void intel_gsc_uc_suspend(struct intel_gsc_uc *gsc); 64 void intel_gsc_uc_resume(struct intel_gsc_uc *gsc); 65 void intel_gsc_uc_flush_work(struct intel_gsc_uc *gsc); 66 void intel_gsc_uc_load_start(struct intel_gsc_uc *gsc); 67 void intel_gsc_uc_load_status(struct intel_gsc_uc *gsc, struct drm_printer *p); 69 static inline bool intel_gsc_uc_is_supported(struct intel_gsc_uc *gsc) in intel_gsc_uc_is_supported() argument 71 return intel_uc_fw_is_supported(&gsc in intel_gsc_uc_is_supported() 74 intel_gsc_uc_is_wanted(struct intel_gsc_uc *gsc) intel_gsc_uc_is_wanted() argument 79 intel_gsc_uc_is_used(struct intel_gsc_uc *gsc) intel_gsc_uc_is_used() argument [all...] |
H A D | intel_gsc_fw.c | 40 bool intel_gsc_uc_fw_proxy_init_done(struct intel_gsc_uc *gsc, bool needs_wakeref) in intel_gsc_uc_fw_proxy_init_done() argument 43 gsc_uc_get_fw_status(gsc_uc_to_gt(gsc)->uncore, in intel_gsc_uc_fw_proxy_init_done() 48 int intel_gsc_uc_fw_proxy_get_status(struct intel_gsc_uc *gsc) in intel_gsc_uc_fw_proxy_get_status() argument 52 if (!intel_uc_fw_is_loadable(&gsc->fw)) in intel_gsc_uc_fw_proxy_get_status() 54 if (__intel_uc_fw_status(&gsc->fw) == INTEL_UC_FIRMWARE_LOAD_FAIL) in intel_gsc_uc_fw_proxy_get_status() 56 if (!intel_gsc_uc_fw_proxy_init_done(gsc, true)) in intel_gsc_uc_fw_proxy_get_status() 62 bool intel_gsc_uc_fw_init_done(struct intel_gsc_uc *gsc) in intel_gsc_uc_fw_init_done() argument 64 return gsc_uc_get_fw_status(gsc_uc_to_gt(gsc)->uncore, false) & in intel_gsc_uc_fw_init_done() 75 struct intel_gsc_uc *gsc = container_of(gsc_fw, struct intel_gsc_uc, fw); in intel_gsc_fw_get_binary_info() local 76 struct intel_gt *gt = gsc_uc_to_gt(gsc); in intel_gsc_fw_get_binary_info() 218 emit_gsc_fw_load(struct i915_request *rq, struct intel_gsc_uc *gsc) emit_gsc_fw_load() argument 237 gsc_fw_load(struct intel_gsc_uc *gsc) gsc_fw_load() argument 282 gsc_fw_load_prepare(struct intel_gsc_uc *gsc) gsc_fw_load_prepare() argument 344 gsc_fw_query_compatibility_version(struct intel_gsc_uc *gsc) gsc_fw_query_compatibility_version() argument 399 intel_gsc_uc_fw_upload(struct intel_gsc_uc *gsc) intel_gsc_uc_fw_upload() argument [all...] |
H A D | intel_gsc_proxy.h | 13 int intel_gsc_proxy_init(struct intel_gsc_uc *gsc); 14 void intel_gsc_proxy_fini(struct intel_gsc_uc *gsc); 15 int intel_gsc_proxy_request_handler(struct intel_gsc_uc *gsc); 16 void intel_gsc_proxy_irq_handler(struct intel_gsc_uc *gsc, u32 iir);
|
H A D | intel_gsc_fw.h | 16 int intel_gsc_uc_fw_upload(struct intel_gsc_uc *gsc); 17 bool intel_gsc_uc_fw_init_done(struct intel_gsc_uc *gsc); 18 bool intel_gsc_uc_fw_proxy_init_done(struct intel_gsc_uc *gsc, bool needs_wakeref); 19 int intel_gsc_uc_fw_proxy_get_status(struct intel_gsc_uc *gsc);
|
H A D | intel_gsc_uc_debugfs.c | 18 struct intel_gsc_uc *gsc = m->private; in gsc_info_show() local 20 if (!intel_gsc_uc_is_supported(gsc)) in gsc_info_show() 23 intel_gsc_uc_load_status(gsc, &p); in gsc_info_show()
|
H A D | intel_gsc_uc_heci_cmd_submit.c | 42 int intel_gsc_uc_heci_cmd_submit_packet(struct intel_gsc_uc *gsc, u64 addr_in, in intel_gsc_uc_heci_cmd_submit_packet() argument 46 struct intel_context *ce = gsc->ce; in intel_gsc_uc_heci_cmd_submit_packet() 90 drm_err(&gsc_uc_to_gt(gsc)->i915->drm, in intel_gsc_uc_heci_cmd_submit_packet() 127 intel_gsc_uc_heci_cmd_submit_nonpriv(struct intel_gsc_uc *gsc, in intel_gsc_uc_heci_cmd_submit_nonpriv() argument 177 drm_err(&gsc_uc_to_gt(gsc)->i915->drm, in intel_gsc_uc_heci_cmd_submit_nonpriv() 178 "Failed emit-flush for gsc-heci-non-priv-pkterr=%d\n", err); in intel_gsc_uc_heci_cmd_submit_nonpriv()
|
H A D | intel_uc.c | 130 intel_gsc_uc_init_early(&uc->gsc); in intel_uc_init_early() 143 intel_gsc_uc_load_start(&uc->gsc); in intel_uc_init_late() 302 intel_uc_fw_change_status(&uc->gsc.fw, in __uc_fetch_firmwares() 313 intel_uc_fw_fetch(&uc->gsc.fw); in __uc_fetch_firmwares() 318 intel_uc_fw_cleanup_fetch(&uc->gsc.fw); in __uc_cleanup_firmwares() 345 intel_gsc_uc_init(&uc->gsc); in __uc_init() 352 intel_gsc_uc_fini(&uc->gsc); in __uc_fini() 689 intel_gsc_uc_flush_work(&uc->gsc); in intel_uc_suspend() 737 intel_gsc_uc_resume(&uc->gsc); in __uc_resume()
|
H A D | intel_gsc_uc_heci_cmd_submit.h | 61 int intel_gsc_uc_heci_cmd_submit_packet(struct intel_gsc_uc *gsc, 83 intel_gsc_uc_heci_cmd_submit_nonpriv(struct intel_gsc_uc *gsc,
|
/kernel/linux/linux-5.10/drivers/mfd/ |
H A D | gateworks-gsc.c | 15 #include <linux/mfd/gsc.h> 76 static int gsc_powerdown(struct gsc_dev *gsc, unsigned long secs) in gsc_powerdown() argument 81 dev_info(&gsc->i2c->dev, "GSC powerdown for %ld seconds\n", in gsc_powerdown() 85 ret = regmap_bulk_write(gsc->regmap, GSC_TIME_ADD, regs, 4); in gsc_powerdown() 89 ret = regmap_update_bits(gsc->regmap, GSC_CTRL_1, in gsc_powerdown() 95 ret = regmap_update_bits(gsc->regmap, GSC_CTRL_1, in gsc_powerdown() 108 struct gsc_dev *gsc = dev_get_drvdata(dev); in gsc_show() local 113 rz = sprintf(buf, "%d\n", gsc->fwver); in gsc_show() 115 rz = sprintf(buf, "0x%04x\n", gsc->fwcrc); in gsc_show() 125 struct gsc_dev *gsc in gsc_store() local 201 struct gsc_dev *gsc; gsc_probe() local [all...] |
/kernel/linux/linux-6.6/drivers/mfd/ |
H A D | gateworks-gsc.c | 15 #include <linux/mfd/gsc.h> 76 static int gsc_powerdown(struct gsc_dev *gsc, unsigned long secs) in gsc_powerdown() argument 81 dev_info(&gsc->i2c->dev, "GSC powerdown for %ld seconds\n", in gsc_powerdown() 85 ret = regmap_bulk_write(gsc->regmap, GSC_TIME_ADD, regs, 4); in gsc_powerdown() 89 ret = regmap_update_bits(gsc->regmap, GSC_CTRL_1, in gsc_powerdown() 95 ret = regmap_update_bits(gsc->regmap, GSC_CTRL_1, in gsc_powerdown() 108 struct gsc_dev *gsc = dev_get_drvdata(dev); in gsc_show() local 113 rz = sprintf(buf, "%d\n", gsc->fwver); in gsc_show() 115 rz = sprintf(buf, "0x%04x\n", gsc->fwcrc); in gsc_show() 125 struct gsc_dev *gsc in gsc_store() local 200 struct gsc_dev *gsc; gsc_probe() local [all...] |
/kernel/linux/linux-5.10/drivers/media/platform/exynos-gsc/ |
H A D | gsc-m2m.c | 25 #include "gsc-core.h" 30 struct gsc_dev *gsc = ctx->gsc_dev; in gsc_m2m_ctx_stop_req() local 33 curr_ctx = v4l2_m2m_get_curr_priv(gsc->m2m.m2m_dev); in gsc_m2m_ctx_stop_req() 34 if (!gsc_m2m_pending(gsc) || (curr_ctx != ctx)) in gsc_m2m_ctx_stop_req() 38 ret = wait_event_timeout(gsc->irq_queue, in gsc_m2m_ctx_stop_req() 147 struct gsc_dev *gsc; in gsc_m2m_device_run() local 155 gsc = ctx->gsc_dev; in gsc_m2m_device_run() 156 spin_lock_irqsave(&gsc->slock, flags); in gsc_m2m_device_run() 158 set_bit(ST_M2M_PEND, &gsc->state); in gsc_m2m_device_run() 161 if (gsc in gsc_m2m_device_run() 289 struct gsc_dev *gsc = ctx->gsc_dev; gsc_m2m_querycap() local 370 struct gsc_dev *gsc = ctx->gsc_dev; gsc_m2m_reqbufs() local 613 struct gsc_dev *gsc = video_drvdata(file); gsc_m2m_open() local 677 struct gsc_dev *gsc = ctx->gsc_dev; gsc_m2m_release() local 701 struct gsc_dev *gsc = ctx->gsc_dev; gsc_m2m_poll() local 716 struct gsc_dev *gsc = ctx->gsc_dev; gsc_m2m_mmap() local 742 gsc_register_m2m_device(struct gsc_dev *gsc) gsc_register_m2m_device() argument 788 gsc_unregister_m2m_device(struct gsc_dev *gsc) gsc_unregister_m2m_device() argument [all...] |
H A D | gsc-core.c | 26 #include "gsc-core.h" 340 void gsc_set_prefbuf(struct gsc_dev *gsc, struct gsc_frame *frm) in gsc_set_prefbuf() argument 392 struct gsc_dev *gsc = ctx->gsc_dev; in gsc_try_fmt_mplane() local 393 struct gsc_variant *variant = gsc->variant; in gsc_try_fmt_mplane() 521 struct gsc_dev *gsc = ctx->gsc_dev; in gsc_try_selection() local 522 struct gsc_variant *variant = gsc->variant; in gsc_try_selection() 701 struct gsc_dev *gsc = ctx->gsc_dev; in __gsc_s_ctrl() local 702 struct gsc_variant *variant = gsc->variant; in __gsc_s_ctrl() 863 struct gsc_dev *gsc = priv; in gsc_irq_handler() local 867 gsc_irq = gsc_hw_get_irq_status(gsc); in gsc_irq_handler() 1108 struct gsc_dev *gsc; gsc_probe() local 1210 struct gsc_dev *gsc = platform_get_drvdata(pdev); gsc_remove() local 1230 gsc_m2m_suspend(struct gsc_dev *gsc) gsc_m2m_suspend() argument 1252 gsc_m2m_resume(struct gsc_dev *gsc) gsc_m2m_resume() argument 1269 struct gsc_dev *gsc = dev_get_drvdata(dev); gsc_runtime_resume() local 1293 struct gsc_dev *gsc = dev_get_drvdata(dev); gsc_runtime_suspend() local [all...] |
H A D | Makefile | 2 exynos-gsc-objs := gsc-core.o gsc-m2m.o gsc-regs.o 4 obj-$(CONFIG_VIDEO_SAMSUNG_EXYNOS_GSC) += exynos-gsc.o
|
/kernel/linux/linux-6.6/drivers/media/platform/samsung/exynos-gsc/ |
H A D | gsc-m2m.c | 25 #include "gsc-core.h" 30 struct gsc_dev *gsc = ctx->gsc_dev; in gsc_m2m_ctx_stop_req() local 33 curr_ctx = v4l2_m2m_get_curr_priv(gsc->m2m.m2m_dev); in gsc_m2m_ctx_stop_req() 34 if (!gsc_m2m_pending(gsc) || (curr_ctx != ctx)) in gsc_m2m_ctx_stop_req() 38 ret = wait_event_timeout(gsc->irq_queue, in gsc_m2m_ctx_stop_req() 147 struct gsc_dev *gsc; in gsc_m2m_device_run() local 155 gsc = ctx->gsc_dev; in gsc_m2m_device_run() 156 spin_lock_irqsave(&gsc->slock, flags); in gsc_m2m_device_run() 158 set_bit(ST_M2M_PEND, &gsc->state); in gsc_m2m_device_run() 161 if (gsc in gsc_m2m_device_run() 365 struct gsc_dev *gsc = ctx->gsc_dev; gsc_m2m_reqbufs() local 608 struct gsc_dev *gsc = video_drvdata(file); gsc_m2m_open() local 672 struct gsc_dev *gsc = ctx->gsc_dev; gsc_m2m_release() local 696 struct gsc_dev *gsc = ctx->gsc_dev; gsc_m2m_poll() local 711 struct gsc_dev *gsc = ctx->gsc_dev; gsc_m2m_mmap() local 737 gsc_register_m2m_device(struct gsc_dev *gsc) gsc_register_m2m_device() argument 783 gsc_unregister_m2m_device(struct gsc_dev *gsc) gsc_unregister_m2m_device() argument [all...] |
H A D | gsc-core.c | 25 #include "gsc-core.h" 339 void gsc_set_prefbuf(struct gsc_dev *gsc, struct gsc_frame *frm) in gsc_set_prefbuf() argument 390 struct gsc_dev *gsc = ctx->gsc_dev; in gsc_try_fmt_mplane() local 391 struct gsc_variant *variant = gsc->variant; in gsc_try_fmt_mplane() 519 struct gsc_dev *gsc = ctx->gsc_dev; in gsc_try_selection() local 520 struct gsc_variant *variant = gsc->variant; in gsc_try_selection() 699 struct gsc_dev *gsc = ctx->gsc_dev; in __gsc_s_ctrl() local 700 struct gsc_variant *variant = gsc->variant; in __gsc_s_ctrl() 861 struct gsc_dev *gsc = priv; in gsc_irq_handler() local 865 gsc_irq = gsc_hw_get_irq_status(gsc); in gsc_irq_handler() 1106 struct gsc_dev *gsc; gsc_probe() local 1205 struct gsc_dev *gsc = platform_get_drvdata(pdev); gsc_remove() local 1225 gsc_m2m_suspend(struct gsc_dev *gsc) gsc_m2m_suspend() argument 1247 gsc_m2m_resume(struct gsc_dev *gsc) gsc_m2m_resume() argument 1264 struct gsc_dev *gsc = dev_get_drvdata(dev); gsc_runtime_resume() local 1288 struct gsc_dev *gsc = dev_get_drvdata(dev); gsc_runtime_suspend() local [all...] |
H A D | Makefile | 2 exynos-gsc-objs := gsc-core.o gsc-m2m.o gsc-regs.o 4 obj-$(CONFIG_VIDEO_SAMSUNG_EXYNOS_GSC) += exynos-gsc.o
|
/kernel/linux/linux-6.6/drivers/gpu/drm/i915/gt/ |
H A D | intel_gsc.c | 42 gsc_ext_om_alloc(struct intel_gsc *gsc, struct intel_gsc_intf *intf, size_t size) in gsc_ext_om_alloc() argument 44 struct intel_gt *gt = gsc_to_gt(gsc); in gsc_ext_om_alloc() 52 drm_err(>->i915->drm, "Failed to allocate gsc memory\n"); in gsc_ext_om_alloc() 58 drm_err(>->i915->drm, "Failed to pin pages for gsc memory\n"); in gsc_ext_om_alloc() 93 /* gsc resources and definitions (HECI1 and HECI2) */ 120 .name = "mei-gsc", 141 struct intel_gsc *gsc, unsigned int intf_id) in gsc_destroy_one() 143 struct intel_gsc_intf *intf = &gsc->intf[intf_id]; in gsc_destroy_one() 149 intel_huc_unregister_gsc_notifier(&gsc_to_gt(gsc)->uc.huc, in gsc_destroy_one() 164 static void gsc_init_one(struct drm_i915_private *i915, struct intel_gsc *gsc, in gsc_init_one() argument 140 gsc_destroy_one(struct drm_i915_private *i915, struct intel_gsc *gsc, unsigned int intf_id) gsc_destroy_one() argument 314 intel_gsc_init(struct intel_gsc *gsc, struct drm_i915_private *i915) intel_gsc_init() argument 325 intel_gsc_fini(struct intel_gsc *gsc) intel_gsc_fini() argument [all...] |
H A D | intel_gt.h | 50 return container_of(gsc_uc, struct intel_gt, uc.gsc); in gsc_uc_to_gt() 53 static inline struct intel_gt *gsc_to_gt(struct intel_gsc *gsc) in gsc_to_gt() argument 55 return container_of(gsc, struct intel_gt, gsc); in gsc_to_gt()
|
H A D | intel_gsc.h | 25 * @intf : gsc interface 36 void intel_gsc_init(struct intel_gsc *gsc, struct drm_i915_private *i915); 37 void intel_gsc_fini(struct intel_gsc *gsc);
|
/kernel/linux/linux-6.6/drivers/misc/mei/ |
H A D | Makefile | 21 obj-$(CONFIG_INTEL_MEI_GSC) += mei-gsc.o 22 mei-gsc-objs := gsc-me.o
|
/kernel/linux/linux-5.10/drivers/hwmon/ |
H A D | gsc-hwmon.c | 9 #include <linux/mfd/gsc.h> 26 struct gsc_dev *gsc; member 271 fan = of_find_compatible_node(dev->parent->of_node, NULL, "gw,gsc-fan"); in gsc_hwmon_get_devtree_pdata() 315 struct gsc_dev *gsc = dev_get_drvdata(pdev->dev.parent); in gsc_hwmon_probe() local 332 hwmon->gsc = gsc; in gsc_hwmon_probe() 336 gsc->i2c_hwmon, in gsc_hwmon_probe() 347 dev_err(gsc->dev, "too many temp channels\n"); in gsc_hwmon_probe() 357 dev_err(gsc->dev, "too many fan channels\n"); in gsc_hwmon_probe() 369 dev_err(gsc in gsc_hwmon_probe() [all...] |
/kernel/linux/linux-6.6/drivers/hwmon/ |
H A D | gsc-hwmon.c | 9 #include <linux/mfd/gsc.h> 26 struct gsc_dev *gsc; member 268 fan = of_find_compatible_node(dev->parent->of_node, NULL, "gw,gsc-fan"); in gsc_hwmon_get_devtree_pdata() 316 struct gsc_dev *gsc = dev_get_drvdata(pdev->dev.parent); in gsc_hwmon_probe() local 333 hwmon->gsc = gsc; in gsc_hwmon_probe() 337 gsc->i2c_hwmon, in gsc_hwmon_probe() 348 dev_err(gsc->dev, "too many temp channels\n"); in gsc_hwmon_probe() 358 dev_err(gsc->dev, "too many fan channels\n"); in gsc_hwmon_probe() 370 dev_err(gsc in gsc_hwmon_probe() [all...] |
/kernel/linux/linux-6.6/drivers/gpu/drm/i915/selftests/ |
H A D | i915_selftest.c | 133 __gsc_proxy_init_progressing(struct intel_gsc_uc *gsc) in __gsc_proxy_init_progressing() argument 135 return intel_gsc_uc_fw_proxy_get_status(gsc) == -EAGAIN; in __gsc_proxy_init_progressing() 144 intel_uc_fw_is_loadable(&i915->media_gt->uc.gsc.fw)); in __wait_gsc_proxy_completed() 146 * The gsc proxy component depends on the kernel component driver load ordering in __wait_gsc_proxy_completed() 152 if (need_to_wait && wait_for(!__gsc_proxy_init_progressing(&i915->media_gt->uc.gsc), in __wait_gsc_proxy_completed()
|