Loading drivers/video/fbdev/bcm2708_fb.c +13 −88 Original line number Diff line number Diff line Loading @@ -112,9 +112,6 @@ struct bcm2708_fb { struct vc4_display_settings_t display_settings; struct debugfs_regset32 screeninfo_regset; struct bcm2708_fb_dev *fbdev; unsigned int image_size; dma_addr_t dma_addr; void *cpuaddr; }; #define MAX_FRAMEBUFFERS 3 Loading Loading @@ -377,12 +374,12 @@ static int bcm2708_fb_set_par(struct fb_info *info) .xoffset = info->var.xoffset, .yoffset = info->var.yoffset, .tag5 = { RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE, 8, 0 }, /* base and screen_size will be initialised later */ .tag6 = { RPI_FIRMWARE_FRAMEBUFFER_SET_PITCH, 4, 0 }, /* pitch will be initialised later */ .base = 0, .screen_size = 0, .tag6 = { RPI_FIRMWARE_FRAMEBUFFER_GET_PITCH, 4, 0 }, .pitch = 0, }; int ret, image_size; int ret; print_debug("%s(%p) %dx%d (%dx%d), %d, %d (display %d)\n", __func__, info, Loading @@ -397,77 +394,13 @@ static int bcm2708_fb_set_par(struct fb_info *info) */ set_display_num(fb); /* Try allocating our own buffer. We can specify all the parameters */ image_size = ((info->var.xres * info->var.yres) * info->var.bits_per_pixel) >> 3; if (!fb->fbdev->disable_arm_alloc && (image_size != fb->image_size || !fb->dma_addr)) { if (fb->dma_addr) { dma_free_coherent(info->device, fb->image_size, fb->cpuaddr, fb->dma_addr); fb->image_size = 0; fb->cpuaddr = NULL; fb->dma_addr = 0; } fb->cpuaddr = dma_alloc_coherent(info->device, image_size, &fb->dma_addr, GFP_KERNEL); if (!fb->cpuaddr) { fb->dma_addr = 0; fb->fbdev->disable_arm_alloc = true; } else { fb->image_size = image_size; } } if (fb->cpuaddr) { fbinfo.base = fb->dma_addr; fbinfo.screen_size = image_size; fbinfo.pitch = (info->var.xres * info->var.bits_per_pixel) >> 3; ret = rpi_firmware_property_list(fb->fbdev->fw, &fbinfo, sizeof(fbinfo)); if (ret || fbinfo.base != fb->dma_addr) { /* Firmware either failed, or assigned a different base * address (ie it doesn't support being passed an FB * allocation). * Destroy the allocation, and don't try again. */ dma_free_coherent(info->device, fb->image_size, fb->cpuaddr, fb->dma_addr); fb->image_size = 0; fb->cpuaddr = NULL; fb->dma_addr = 0; fb->fbdev->disable_arm_alloc = true; } } else { /* Our allocation failed - drop into the old scheme of * allocation by the VPU. */ ret = -ENOMEM; } if (ret) { /* Old scheme: * - FRAMEBUFFER_ALLOCATE passes 0 for base and screen_size. * - GET_PITCH instead of SET_PITCH. */ fbinfo.base = 0; fbinfo.screen_size = 0; fbinfo.tag6.tag = RPI_FIRMWARE_FRAMEBUFFER_GET_PITCH; fbinfo.pitch = 0; ret = rpi_firmware_property_list(fb->fbdev->fw, &fbinfo, sizeof(fbinfo)); if (ret) { dev_err(info->device, "Failed to allocate GPU framebuffer (%d)\n", ret); "Failed to allocate GPU framebuffer (%d)\n", ret); return ret; } } if (info->var.bits_per_pixel <= 8) fb->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR; Loading @@ -481,17 +414,9 @@ static int bcm2708_fb_set_par(struct fb_info *info) fb->fb.fix.smem_start = fbinfo.base; fb->fb.fix.smem_len = fbinfo.pitch * fbinfo.yres_virtual; fb->fb.screen_size = fbinfo.screen_size; if (!fb->dma_addr) { if (fb->fb.screen_base) iounmap(fb->fb.screen_base); fb->fb.screen_base = ioremap_wc(fbinfo.base, fb->fb.screen_size); } else { fb->fb.screen_base = fb->cpuaddr; } fb->fb.screen_base = ioremap_wc(fbinfo.base, fb->fb.screen_size); if (!fb->fb.screen_base) { /* the console may currently be locked */ console_trylock(); Loading include/soc/bcm2835/raspberrypi-firmware.h +0 −1 Original line number Diff line number Diff line Loading @@ -138,7 +138,6 @@ enum rpi_firmware_property_tag { RPI_FIRMWARE_FRAMEBUFFER_SET_DEPTH = 0x00048005, RPI_FIRMWARE_FRAMEBUFFER_SET_PIXEL_ORDER = 0x00048006, RPI_FIRMWARE_FRAMEBUFFER_SET_ALPHA_MODE = 0x00048007, RPI_FIRMWARE_FRAMEBUFFER_SET_PITCH = 0x00048008, RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET = 0x00048009, RPI_FIRMWARE_FRAMEBUFFER_SET_OVERSCAN = 0x0004800a, RPI_FIRMWARE_FRAMEBUFFER_SET_PALETTE = 0x0004800b, Loading Loading
drivers/video/fbdev/bcm2708_fb.c +13 −88 Original line number Diff line number Diff line Loading @@ -112,9 +112,6 @@ struct bcm2708_fb { struct vc4_display_settings_t display_settings; struct debugfs_regset32 screeninfo_regset; struct bcm2708_fb_dev *fbdev; unsigned int image_size; dma_addr_t dma_addr; void *cpuaddr; }; #define MAX_FRAMEBUFFERS 3 Loading Loading @@ -377,12 +374,12 @@ static int bcm2708_fb_set_par(struct fb_info *info) .xoffset = info->var.xoffset, .yoffset = info->var.yoffset, .tag5 = { RPI_FIRMWARE_FRAMEBUFFER_ALLOCATE, 8, 0 }, /* base and screen_size will be initialised later */ .tag6 = { RPI_FIRMWARE_FRAMEBUFFER_SET_PITCH, 4, 0 }, /* pitch will be initialised later */ .base = 0, .screen_size = 0, .tag6 = { RPI_FIRMWARE_FRAMEBUFFER_GET_PITCH, 4, 0 }, .pitch = 0, }; int ret, image_size; int ret; print_debug("%s(%p) %dx%d (%dx%d), %d, %d (display %d)\n", __func__, info, Loading @@ -397,77 +394,13 @@ static int bcm2708_fb_set_par(struct fb_info *info) */ set_display_num(fb); /* Try allocating our own buffer. We can specify all the parameters */ image_size = ((info->var.xres * info->var.yres) * info->var.bits_per_pixel) >> 3; if (!fb->fbdev->disable_arm_alloc && (image_size != fb->image_size || !fb->dma_addr)) { if (fb->dma_addr) { dma_free_coherent(info->device, fb->image_size, fb->cpuaddr, fb->dma_addr); fb->image_size = 0; fb->cpuaddr = NULL; fb->dma_addr = 0; } fb->cpuaddr = dma_alloc_coherent(info->device, image_size, &fb->dma_addr, GFP_KERNEL); if (!fb->cpuaddr) { fb->dma_addr = 0; fb->fbdev->disable_arm_alloc = true; } else { fb->image_size = image_size; } } if (fb->cpuaddr) { fbinfo.base = fb->dma_addr; fbinfo.screen_size = image_size; fbinfo.pitch = (info->var.xres * info->var.bits_per_pixel) >> 3; ret = rpi_firmware_property_list(fb->fbdev->fw, &fbinfo, sizeof(fbinfo)); if (ret || fbinfo.base != fb->dma_addr) { /* Firmware either failed, or assigned a different base * address (ie it doesn't support being passed an FB * allocation). * Destroy the allocation, and don't try again. */ dma_free_coherent(info->device, fb->image_size, fb->cpuaddr, fb->dma_addr); fb->image_size = 0; fb->cpuaddr = NULL; fb->dma_addr = 0; fb->fbdev->disable_arm_alloc = true; } } else { /* Our allocation failed - drop into the old scheme of * allocation by the VPU. */ ret = -ENOMEM; } if (ret) { /* Old scheme: * - FRAMEBUFFER_ALLOCATE passes 0 for base and screen_size. * - GET_PITCH instead of SET_PITCH. */ fbinfo.base = 0; fbinfo.screen_size = 0; fbinfo.tag6.tag = RPI_FIRMWARE_FRAMEBUFFER_GET_PITCH; fbinfo.pitch = 0; ret = rpi_firmware_property_list(fb->fbdev->fw, &fbinfo, sizeof(fbinfo)); if (ret) { dev_err(info->device, "Failed to allocate GPU framebuffer (%d)\n", ret); "Failed to allocate GPU framebuffer (%d)\n", ret); return ret; } } if (info->var.bits_per_pixel <= 8) fb->fb.fix.visual = FB_VISUAL_PSEUDOCOLOR; Loading @@ -481,17 +414,9 @@ static int bcm2708_fb_set_par(struct fb_info *info) fb->fb.fix.smem_start = fbinfo.base; fb->fb.fix.smem_len = fbinfo.pitch * fbinfo.yres_virtual; fb->fb.screen_size = fbinfo.screen_size; if (!fb->dma_addr) { if (fb->fb.screen_base) iounmap(fb->fb.screen_base); fb->fb.screen_base = ioremap_wc(fbinfo.base, fb->fb.screen_size); } else { fb->fb.screen_base = fb->cpuaddr; } fb->fb.screen_base = ioremap_wc(fbinfo.base, fb->fb.screen_size); if (!fb->fb.screen_base) { /* the console may currently be locked */ console_trylock(); Loading
include/soc/bcm2835/raspberrypi-firmware.h +0 −1 Original line number Diff line number Diff line Loading @@ -138,7 +138,6 @@ enum rpi_firmware_property_tag { RPI_FIRMWARE_FRAMEBUFFER_SET_DEPTH = 0x00048005, RPI_FIRMWARE_FRAMEBUFFER_SET_PIXEL_ORDER = 0x00048006, RPI_FIRMWARE_FRAMEBUFFER_SET_ALPHA_MODE = 0x00048007, RPI_FIRMWARE_FRAMEBUFFER_SET_PITCH = 0x00048008, RPI_FIRMWARE_FRAMEBUFFER_SET_VIRTUAL_OFFSET = 0x00048009, RPI_FIRMWARE_FRAMEBUFFER_SET_OVERSCAN = 0x0004800a, RPI_FIRMWARE_FRAMEBUFFER_SET_PALETTE = 0x0004800b, Loading