> Date: Sat, 2 Jan 2021 18:39:03 +1000
> From: Jonathan Matthew <[email protected]>
>
> This code is now only here for some unfortunate Intel graphics chips
> based on PowerVR, and I don't have a machine with one of those.
> vga_post_init() gets called from vga_attach() in any case, and
> vga_post_free() doesn't seem to be called at all. I've booted this on
> amd64 (real) and i386 (virtualized) with no problems.
>
> ok?
ok kettenis@
> diff --git sys/arch/amd64/pci/vga_post.c sys/arch/amd64/pci/vga_post.c
> index 32876649ddd..36596490d35 100644
> --- sys/arch/amd64/pci/vga_post.c
> +++ sys/arch/amd64/pci/vga_post.c
> @@ -125,13 +125,15 @@ vga_post_init(int bus, int device, int function)
> vaddr_t sys_image, sys_bios_data;
> int err;
>
> - sys_bios_data = uvm_km_valloc(kernel_map, PAGE_SIZE);
> + sys_bios_data = (vaddr_t)km_alloc(PAGE_SIZE, &kv_any, &kp_none,
> + &kd_nowait);
> if (sys_bios_data == 0)
> return NULL;
>
> - sys_image = uvm_km_valloc(kernel_map, 1024 * 1024);
> + sys_image = (vaddr_t)km_alloc(1024 * 1024, &kv_any, &kp_none,
> + &kd_nowait);
> if (sys_image == 0) {
> - uvm_km_free(kernel_map, sys_bios_data, PAGE_SIZE);
> + km_free((void *)sys_bios_data, PAGE_SIZE, &kv_any, &kp_none);
> return NULL;
> }
> sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO);
> @@ -140,7 +142,7 @@ vga_post_init(int bus, int device, int function)
> err = uvm_pglistalloc(BASE_MEMORY, 0, (paddr_t)-1, 0, 0,
> &sc->ram_backing, BASE_MEMORY/PAGE_SIZE, UVM_PLA_WAITOK);
> if (err) {
> - uvm_km_free(kernel_map, sc->sys_image, 1024 * 1024);
> + km_free((void *)sc->sys_image, 1024 * 1024, &kv_any, &kp_none);
> free(sc, M_DEVBUF, sizeof(*sc));
> return NULL;
> }
> @@ -152,7 +154,7 @@ vga_post_init(int bus, int device, int function)
> pmap_update(pmap_kernel());
> memcpy((void *)sc->bios_data, (void *)sys_bios_data, PAGE_SIZE);
> pmap_kremove(sys_bios_data, PAGE_SIZE);
> - uvm_km_free(kernel_map, sys_bios_data, PAGE_SIZE);
> + km_free((void *)sys_bios_data, PAGE_SIZE, &kv_any, &kp_none);
>
> iter = 0;
> TAILQ_FOREACH(pg, &sc->ram_backing, pageq) {
> @@ -209,7 +211,7 @@ vga_post_free(struct vga_post *sc)
> {
> uvm_pglistfree(&sc->ram_backing);
> pmap_kremove(sc->sys_image, 1024 * 1024);
> - uvm_km_free(kernel_map, sc->sys_image, 1024 * 1024);
> + km_free((void *)sc->sys_image, 1024 * 1024, &kv_any, &kp_none)
> pmap_update(pmap_kernel());
> free(sc, M_DEVBUF, sizeof(*sc));
> }
> diff --git sys/arch/i386/pci/vga_post.c sys/arch/i386/pci/vga_post.c
> index c85ee05dcdb..2464fd6019c 100644
> --- sys/arch/i386/pci/vga_post.c
> +++ sys/arch/i386/pci/vga_post.c
> @@ -126,13 +126,15 @@ vga_post_init(int bus, int device, int function)
> vaddr_t sys_image, sys_bios_data;
> int err;
>
> - sys_bios_data = uvm_km_valloc(kernel_map, PAGE_SIZE);
> + sys_bios_data = (vaddr_t)km_alloc(PAGE_SIZE, &kv_any, &kp_none,
> + &kd_nowait);
> if (sys_bios_data == 0)
> return NULL;
>
> - sys_image = uvm_km_valloc(kernel_map, 1024 * 1024);
> + sys_image = (vaddr_t)km_alloc(1024 * 1024, &kv_any, &kp_none,
> + &kd_nowait);
> if (sys_image == 0) {
> - uvm_km_free(kernel_map, sys_bios_data, PAGE_SIZE);
> + km_free((void *)sys_bios_data, PAGE_SIZE, &kv_any, &kp_none);
> return NULL;
> }
> sc = malloc(sizeof(*sc), M_DEVBUF, M_WAITOK|M_ZERO);
> @@ -141,7 +143,7 @@ vga_post_init(int bus, int device, int function)
> err = uvm_pglistalloc(BASE_MEMORY, 0, (paddr_t)-1, 0, 0,
> &sc->ram_backing, BASE_MEMORY/PAGE_SIZE, UVM_PLA_WAITOK);
> if (err) {
> - uvm_km_free(kernel_map, sc->sys_image, 1024 * 1024);
> + km_free((void *)sc->sys_image, 1024 * 1024, &kv_any, &kp_none);
> free(sc, M_DEVBUF, sizeof *sc);
> return NULL;
> }
> @@ -153,7 +155,7 @@ vga_post_init(int bus, int device, int function)
> pmap_update(pmap_kernel());
> memcpy((void *)sc->bios_data, (void *)sys_bios_data, PAGE_SIZE);
> pmap_kremove(sys_bios_data, PAGE_SIZE);
> - uvm_km_free(kernel_map, sys_bios_data, PAGE_SIZE);
> + km_free((void *)sys_bios_data, PAGE_SIZE, &kv_any, &kp_none);
>
> iter = 0;
> TAILQ_FOREACH(pg, &sc->ram_backing, pageq) {
> @@ -211,7 +213,7 @@ vga_post_free(struct vga_post *sc)
> uvm_pglistfree(&sc->ram_backing);
> pmap_kremove(sc->sys_image, 1024 * 1024);
>
> - uvm_km_free(kernel_map, sc->sys_image, 1024 * 1024);
> + km_free((void *)sc->sys_image, 1024 * 1024, &kv_any, &kp_none);
> pmap_update(pmap_kernel());
> free(sc, M_DEVBUF, sizeof *sc);
> }
>
>