Summary: | Problem with DRM on Alpha arch. | ||||||||
---|---|---|---|---|---|---|---|---|---|
Product: | DRI | Reporter: | Laurens Vets <laurens> | ||||||
Component: | DRM/other | Assignee: | Default DRI bug account <dri-devel> | ||||||
Status: | RESOLVED WORKSFORME | QA Contact: | |||||||
Severity: | major | ||||||||
Priority: | high | CC: | mattst88 | ||||||
Version: | DRI git | ||||||||
Hardware: | Alpha | ||||||||
OS: | Linux (All) | ||||||||
Whiteboard: | |||||||||
i915 platform: | i915 features: | ||||||||
Bug Depends on: | 4797, 4946 | ||||||||
Bug Blocks: | |||||||||
Attachments: |
|
Description
Laurens Vets
2005-09-19 06:28:10 UTC
you might want to try with drm debugging switched on and attach the dmesg... insmod drm.ko debug=1 or echo 1 > /sys/module/drm/parameters/debug should enable it This is what I get with debug=1: Sep 22 09:33:32 loek [drm] Initialized drm 1.0.0 20040925 Sep 22 09:33:32 loek [drm] Initialized mga 3.2.0 20050607 on minor 0: Matrox Graphics, Inc. MGA G400 AGP Sep 22 09:33:32 loek [drm] Used old pci detect: framebuffer loaded Sep 22 09:33:56 loek su(pam_unix)[31654]: session closed for user root Sep 22 09:34:02 loek [drm:drm_stub_open] Sep 22 09:34:02 loek [drm:drm_open_helper] pid = 2199, minor = 0 Sep 22 09:34:02 loek [drm:drm_addmap] offset = 0x00000000, size = 0x00002000, type = 2 Sep 22 09:34:02 loek [drm:drm_addmap] 8192 13 fffffffc00216000 Sep 22 09:34:02 loek [drm:drm_setup] Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0406400, nr=0x00, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0406400, nr=0x00, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_release] open_count = 1 Sep 22 09:34:02 loek [drm:drm_release] pid = 2199, device = 0xe200, open_count = 1 Sep 22 09:34:02 loek [drm:drm_fasync] fd = -1, device = 0xe200 Sep 22 09:34:02 loek [drm:drm_lastclose] Sep 22 09:34:02 loek [drm:mga_do_cleanup_dma] Sep 22 09:34:02 loek [drm:drm_lastclose] driver lastclose completed Sep 22 09:34:02 loek [drm:drm_lastclose] lastclose completed Sep 22 09:34:02 loek [drm:drm_stub_open] Sep 22 09:34:02 loek [drm:drm_open_helper] pid = 2199, minor = 0 Sep 22 09:34:02 loek [drm:drm_addmap] offset = 0x00000000, size = 0x00002000, type = 2 Sep 22 09:34:02 loek [drm:drm_addmap] 8192 13 fffffffc00216000 Sep 22 09:34:02 loek [drm:drm_setup] Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0406400, nr=0x00, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0406400, nr=0x00, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_release] open_count = 1 Sep 22 09:34:02 loek [drm:drm_release] pid = 2199, device = 0xe200, open_count = 1 Sep 22 09:34:02 loek [drm:drm_fasync] fd = -1, device = 0xe200 Sep 22 09:34:02 loek [drm:drm_lastclose] Sep 22 09:34:02 loek [drm:mga_do_cleanup_dma] Sep 22 09:34:02 loek [drm:drm_lastclose] driver lastclose completed Sep 22 09:34:02 loek [drm:drm_lastclose] lastclose completed Sep 22 09:34:02 loek [drm:drm_stub_open] Sep 22 09:34:02 loek [drm:drm_open_helper] pid = 2199, minor = 0 Sep 22 09:34:02 loek [drm:drm_addmap] offset = 0x00000000, size = 0x00002000, type = 2 Sep 22 09:34:02 loek [drm:drm_addmap] 8192 13 fffffffc00216000 Sep 22 09:34:02 loek [drm:drm_setup] Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0106407, nr=0x07, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0106401, nr=0x01, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0106401, nr=0x01, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0106407, nr=0x07, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0286415, nr=0x15, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_addmap] offset = 0x00000000, size = 0x00002000, type = 2 Sep 22 09:34:02 loek [drm:drm_mmap] start = 0x20000022000, end = 0x20000024000, offset = 0x216000 Sep 22 09:34:02 loek [drm:drm_vm_open] 0x20000022000,0x00002000 Sep 22 09:34:02 loek [drm:drm_do_vm_shm_nopage] shm_nopage 0x20000022000 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0286415, nr=0x15, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_addmap] offset = 0x0a000000, size = 0x01000000, type = 0 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0106426, nr=0x26, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0106426, nr=0x26, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0406400, nr=0x00, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0406400, nr=0x00, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc020644c, nr=0x4c, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:mga_dma_blit] Sep 22 09:34:02 loek [drm:mga_dma_blit] *ERROR* mga_dma_blit called without lock held, held 0 owner 0000000000000000 fffffc0017316f80 Sep 22 09:34:02 loek [drm:drm_ioctl] ret = ffffffea Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0106426, nr=0x26, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0xc0106426, nr=0x26, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_ioctl] pid=2199, cmd=0x8008642b, nr=0x2b, dev 0xe200, auth=1 Sep 22 09:34:02 loek [drm:drm_unlock] *ERROR* Process 2199 using kernel context 0 Sep 22 09:34:02 loek [drm:drm_ioctl] ret = ffffffea Sep 22 09:34:02 loek [drm:drm_vm_shm_close] 0x20000022000,0x00002000 Sep 22 09:34:02 loek [drm:drm_release] open_count = 1 Sep 22 09:34:02 loek [drm:drm_release] pid = 2199, device = 0xe200, open_count = 1 Sep 22 09:34:02 loek [drm:drm_fasync] fd = -1, device = 0xe200 Sep 22 09:34:02 loek [drm:drm_lastclose] Sep 22 09:34:02 loek [drm:mga_do_cleanup_dma] Sep 22 09:34:02 loek [drm:drm_lastclose] driver lastclose completed Sep 22 09:34:02 loek [drm:drm_lastclose] lastclose completed Hmm not sure on this one yet.. the alpha seems to bit shift the ioctl numbers differently than anyone else.. I'm not sure if this a problem with the userspace passing in the wrong ioctl or the kernel dealing with it in-correctly... no actually that is just me on crack.. I'll keep looking... can you add some more debugging to drm_drv.c:drm_ioctl function? if (nr < DRIVER_IOCTL_COUNT) ioctl = &drm_ioctls[nr]; else if ((nr >= DRM_COMMAND_BASE) && (nr < DRM_COMMAND_BASE + dev->driver->num_ioctls)) ioctl = &dev->driver->ioctls[nr - DRM_COMMAND_BASE]; else goto err_i1; func = ioctl->func; if ((nr == DRM_IOCTL_NR(DRM_IOCTL_DMA)) && dev->driver->dma_ioctl) /* Local override? */ func = dev->driver->dma_ioctl; Can you print out the value of func and what nr - DRM_COMMAND_BASE. Somehow your system is calling mga_dma_blit when it should be calling the bootstrap ioctl.. blit is 0x8, bootstrap is 0xC, looks like somebody is masking out some bits or sometihng. I'm not exactly a programmer :) But I'll do my best (and learn some more C along the way :)) Anyways, I've put the following below the lines of code you posted: DRM_DEBUG("func=%d\n",func); DRM_DEBUG("nr=%d\n",nr); DRM_DEBUG("DRM_COMMAND_BASE=%d\n",DRM_COMMAND_BASE); And the results were: Sep 22 20:23:16 loek [drm] Initialized drm 1.0.0 20040925 Sep 22 20:23:16 loek [drm] Initialized mga 3.2.0 20050607 on minor 0: Matrox Graphics, Inc. MGA G400 AGP Sep 22 20:23:16 loek [drm] Used old pci detect: framebuffer loaded Sep 22 20:24:35 loek [drm:drm_stub_open] Sep 22 20:24:35 loek [drm:drm_open_helper] pid = 11193, minor = 0 Sep 22 20:24:35 loek [drm:drm_addmap] offset = 0x00000000, size = 0x00002000, type = 2 Sep 22 20:24:35 loek [drm:drm_addmap] 8192 13 fffffffc00216000 Sep 22 20:24:35 loek [drm:drm_setup] Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0406400, nr=0x00, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6047184 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=0 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0406400, nr=0x00, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6047184 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=0 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_release] open_count = 1 Sep 22 20:24:35 loek [drm:drm_release] pid = 11193, device = 0xe200, open_count = 1 Sep 22 20:24:35 loek [drm:drm_fasync] fd = -1, device = 0xe200 Sep 22 20:24:35 loek [drm:drm_lastclose] Sep 22 20:24:35 loek [drm:mga_do_cleanup_dma] Sep 22 20:24:35 loek [drm:drm_lastclose] driver lastclose completed Sep 22 20:24:35 loek [drm:drm_lastclose] lastclose completed Sep 22 20:24:35 loek [drm:drm_stub_open] Sep 22 20:24:35 loek [drm:drm_open_helper] pid = 11193, minor = 0 Sep 22 20:24:35 loek [drm:drm_addmap] offset = 0x00000000, size = 0x00002000, type = 2 Sep 22 20:24:35 loek [drm:drm_addmap] 8192 13 fffffffc00216000 Sep 22 20:24:35 loek [drm:drm_setup] Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0406400, nr=0x00, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6047184 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=0 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0406400, nr=0x00, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6047184 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=0 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_release] open_count = 1 Sep 22 20:24:35 loek [drm:drm_release] pid = 11193, device = 0xe200, open_count = 1 Sep 22 20:24:35 loek [drm:drm_fasync] fd = -1, device = 0xe200 Sep 22 20:24:35 loek [drm:drm_lastclose] Sep 22 20:24:35 loek [drm:mga_do_cleanup_dma] Sep 22 20:24:35 loek [drm:drm_lastclose] driver lastclose completed Sep 22 20:24:35 loek [drm:drm_lastclose] lastclose completed Sep 22 20:24:35 loek [drm:drm_stub_open] Sep 22 20:24:35 loek [drm:drm_open_helper] pid = 11193, minor = 0 Sep 22 20:24:35 loek [drm:drm_addmap] offset = 0x00000000, size = 0x00002000, type = 2 Sep 22 20:24:35 loek [drm:drm_addmap] 8192 13 fffffffc00216000 Sep 22 20:24:35 loek [drm:drm_setup] Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0106407, nr=0x07, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6055456 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=7 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0106401, nr=0x01, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6052800 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=1 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0106401, nr=0x01, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6052800 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=1 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0106407, nr=0x07, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6055456 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=7 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0286415, nr=0x15, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6024928 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=21 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_addmap] offset = 0x00000000, size = 0x00002000, type = 2 Sep 22 20:24:35 loek [drm:drm_mmap] start = 0x20000022000, end = 0x20000024000, offset = 0x216000 Sep 22 20:24:35 loek [drm:drm_vm_open] 0x20000022000,0x00002000 Sep 22 20:24:35 loek [drm:drm_do_vm_shm_nopage] shm_nopage 0x20000022000 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0286415, nr=0x15, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6024928 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=21 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_addmap] offset = 0x0a000000, size = 0x01000000, type = 0 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0106426, nr=0x26, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6041472 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=38 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0106426, nr=0x26, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6041472 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=38 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0406400, nr=0x00, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6047184 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=0 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0406400, nr=0x00, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6047184 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=0 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc020644c, nr=0x4c, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=3364688 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=76 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:mga_dma_blit] Sep 22 20:24:35 loek [drm:mga_dma_blit] *ERROR* mga_dma_blit called without lock held, held 0 owner 0000000000000000 fffffc0017bd31c0 Sep 22 20:24:35 loek [drm:drm_ioctl] ret = ffffffea Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0106426, nr=0x26, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6041472 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=38 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0xc0106426, nr=0x26, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6041472 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=38 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_ioctl] pid=11193, cmd=0x8008642b, nr=0x2b, dev 0xe200, auth=1 Sep 22 20:24:35 loek [drm:drm_ioctl] func=6059792 Sep 22 20:24:35 loek [drm:drm_ioctl] nr=43 Sep 22 20:24:35 loek [drm:drm_ioctl] DRM_COMMAND_BASE=64 Sep 22 20:24:35 loek [drm:drm_unlock] *ERROR* Process 11193 using kernel context 0 Sep 22 20:24:35 loek [drm:drm_ioctl] ret = ffffffea Sep 22 20:24:35 loek [drm:drm_vm_shm_close] 0x20000022000,0x00002000 Sep 22 20:24:35 loek [drm:drm_release] open_count = 1 Sep 22 20:24:35 loek [drm:drm_release] pid = 11193, device = 0xe200, open_count = 1 Sep 22 20:24:35 loek [drm:drm_fasync] fd = -1, device = 0xe200 Sep 22 20:24:35 loek [drm:drm_lastclose] Sep 22 20:24:35 loek [drm:mga_do_cleanup_dma] Sep 22 20:24:35 loek [drm:drm_lastclose] driver lastclose completed Sep 22 20:24:35 loek [drm:drm_lastclose] lastclose completed I can't see how this could be happening, it makes absolutely no sense... Can you print out in the ioctl, the &mga_dma_blit and &mga_dma_bootstrap And the output of nm mga.ko How exactly can I print out &mga_dma_blit and &mga_dma_bootstrap? Just adding DRM_DEBUG statements like before doesn't work... (error: `mga_dma_blit' undeclared (first use in this function)) The interesting thing is that the Xorg.0.log claims that DRI is disabled because DMA could not be bootstrapped. If that's the case, then how are *any* of those DRM calls happening? I'm also curious about why the DMA bootstrap fails. Hmmm, I don't know what happened, but I cannot build the code that I pulled out of cvs a few hours ago... ... XF86VMode.c:1180: error: `info' undeclared (first use in this function) XF86VMode.c:1184: error: `size' undeclared (first use in this function) XF86VMode.c:1186: error: `False' undeclared (first use in this function) XF86VMode.c:1193: error: `xReply' undeclared (first use in this function) XF86VMode.c:1193: error: syntax error before ')' token XF86VMode.c:1193: error: `xTrue' undeclared (first use in this function) XF86VMode.c:1201: error: `True' undeclared (first use in this function) XF86VMode.c: At top level: XF86VMode.c:1204: error: syntax error before "XF86VidModeGetPermissions" XF86VMode.c:1205: error: syntax error before '*' token XF86VMode.c:1209: warning: return type defaults to `int' XF86VMode.c:1209: warning: function declaration isn't a prototype XF86VMode.c: In function `XF86VidModeGetPermissions': XF86VMode.c:1210: error: `info' undeclared (first use in this function) XF86VMode.c:1214: error: `permissions' undeclared (first use in this function) XF86VMode.c:1216: error: `False' undeclared (first use in this function) XF86VMode.c:1223: error: `xReply' undeclared (first use in this function) XF86VMode.c:1223: error: syntax error before ')' token XF86VMode.c:1223: error: `xTrue' undeclared (first use in this function) XF86VMode.c:1231: error: `True' undeclared (first use in this function) make[4]: *** [XF86VMode.o] Error 1 make[4]: Leaving directory `/home/laurensv/xorg_cvs.orig/xc/lib/Xxf86vm' make[3]: *** [all] Error 2 make[3]: Leaving directory `/home/laurensv/xorg_cvs.orig/xc/lib' make[2]: *** [all] Error 2 make[2]: Leaving directory `/home/laurensv/xorg_cvs.orig/xc' make[1]: *** [World] Error 2 make[1]: Leaving directory `/home/laurensv/xorg_cvs.orig/xc' make: *** [World] Error 2 Any ideas what happened? ;) Thanks in advance, Laurens Created attachment 3551 [details]
Complete logfile of the failed build from the cvs sources.
Created attachment 3569 [details]
Make install .log file.
I am able to build Xorg completely without errors. However, when doing a make
install, I some errors. This is the logfile of these errors.
I am always following this guide: http://dri.freedesktop.org/wiki/Building This bug seems to share some issues with bug #4797, so I'm making this bug depend on that one. Hopefully I'll have #4797 resolved this week. Marking as WORKSFORME. Reopen if it does not work for you. |
Use of freedesktop.org services, including Bugzilla, is subject to our Code of Conduct. How we collect and use information is described in our Privacy Policy.