Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Revert "video: bcm2708_fb: Try allocating on the ARM and passing to VPU" #2970

Merged
merged 1 commit into from
May 13, 2019
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
102 changes: 12 additions & 90 deletions drivers/video/fbdev/bcm2708_fb.c
Original file line number Diff line number Diff line change
Expand Up @@ -98,11 +98,6 @@ struct bcm2708_fb {
struct bcm2708_fb_stats stats;
unsigned long fb_bus_address;
struct { u32 base, length; } gpu;

bool disable_arm_alloc;
unsigned int image_size;
dma_addr_t dma_addr;
void *cpuaddr;
};

#define to_bcm2708(info) container_of(info, struct bcm2708_fb, fb)
Expand Down Expand Up @@ -288,88 +283,23 @@ 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\n", __func__, info,
info->var.xres, info->var.yres, info->var.xres_virtual,
info->var.yres_virtual, (int)info->screen_size,
info->var.bits_per_pixel);

/* 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->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->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->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->disable_arm_alloc = true;
}
} else {
/* Our allocation failed - drop into the old scheme of
* allocation by the VPU.
*/
ret = -ENOMEM;
}

ret = rpi_firmware_property_list(fb->fw, &fbinfo, sizeof(fbinfo));
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->fw, &fbinfo,
sizeof(fbinfo));
if (ret) {
dev_err(info->device,
"Failed to allocate GPU framebuffer (%d)\n",
ret);
return ret;
}
dev_err(info->device,
"Failed to allocate GPU framebuffer (%d)\n", ret);
return ret;
}

if (info->var.bits_per_pixel <= 8)
Expand All @@ -384,17 +314,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;
}

if (fb->fb.screen_base)
iounmap(fb->fb.screen_base);
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();
Expand Down
1 change: 0 additions & 1 deletion include/soc/bcm2835/raspberrypi-firmware.h
Original file line number Diff line number Diff line change
Expand Up @@ -128,7 +128,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,
Expand Down