> Date: Tue, 21 Aug 2018 23:34:38 +0200 (CEST)
> From: Mark Kettenis <[email protected]>
>
> If firmware doesn't initialize the device, the BAR will be zero and
> mapping that address leads to "interesting" issues on many machines.
> This BAR is a bit special since we don't want to immediately map it.
> So we have to explicitly allocate the address space for the BAR. Bail
> out if we fail. Don't do this on sparc64 because there the address
> can actually be zero.
>
> ok?
Ping?
> Index: dev/pci/drm/radeon/radeon_kms.c
> ===================================================================
> RCS file: /cvs/src/sys/dev/pci/drm/radeon/radeon_kms.c,v
> retrieving revision 1.56
> diff -u -p -r1.56 radeon_kms.c
> --- dev/pci/drm/radeon/radeon_kms.c 3 May 2018 10:09:51 -0000 1.56
> +++ dev/pci/drm/radeon/radeon_kms.c 21 Aug 2018 21:30:45 -0000
> @@ -485,6 +485,26 @@ radeondrm_attach_kms(struct device *pare
> printf(": can't get frambuffer info\n");
> return;
> }
> +#if !defined(__sparc64__)
> + if (rdev->fb_aper_offset == 0) {
> + bus_size_t start, end;
> + bus_addr_t base;
> +
> + start = max(PCI_MEM_START, pa->pa_memex->ex_start);
> + end = min(PCI_MEM_END, pa->pa_memex->ex_end);
> + if (pa->pa_memex == NULL ||
> + extent_alloc_subregion(pa->pa_memex, start, end,
> + rdev->fb_aper_size, rdev->fb_aper_size, 0, 0, 0, &base)) {
> + printf(": can't reserve framebuffer space\n");
> + return;
> + }
> + pci_conf_write(pa->pa_pc, pa->pa_tag, RADEON_PCI_MEM, base);
> + if (PCI_MAPREG_MEM_TYPE(type) == PCI_MAPREG_MEM_TYPE_64BIT)
> + pci_conf_write(pa->pa_pc, pa->pa_tag,
> + RADEON_PCI_MEM + 4, (uint64_t)base >> 32);
> + rdev->fb_aper_offset = base;
> + }
> +#endif
>
> for (i = PCI_MAPREG_START; i < PCI_MAPREG_END ; i+= 4) {
> type = pci_mapreg_type(pa->pa_pc, pa->pa_tag, i);
>
>